xref: /illumos-gate/usr/src/cmd/ttymon/ttyadm.c (revision 7a6d80f1660abd4755c68cbd094d4a914681d26e)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
27 /*	  All Rights Reserved	*/
28 
29 #include <stdio.h>
30 #include <unistd.h>
31 #include <stdlib.h>
32 #include <string.h>
33 #include <sys/types.h>
34 #include <ctype.h>
35 #include <sys/stat.h>
36 #include <stdarg.h>
37 #include "tmstruct.h"
38 #include "tmextern.h"
39 #include "ttymon.h"
40 
41 /*
42  *	ttyadm	- format ttymon specific information and
43  *		  print it to stdout
44  *
45  *	Usage:	ttyadm [options] -d device -s service -l ttylabel
46  *		ttyadm -V
47  *
48  *		valid options are:
49  *		-c
50  *		-h
51  *		-b
52  *		-I
53  *		-S y|n
54  *		-T term
55  *		-r count
56  *		-t timeout
57  *		-p prompt
58  *		-m modules
59  *		-i msg
60  */
61 
62 static void usage(void);
63 static	int	check_label(char *);
64 
65 int
66 main(int argc, char *argv[])
67 {
68 	int c;			/* option letter */
69 	int errflg = 0;		/* error indicator */
70 
71 	struct pmtab *ptr;
72 	char *timeout = "";
73 	char *count = "";
74 	char prompt[BUFSIZ];
75 	char dmsg[BUFSIZ];
76 	char ttyflags[BUFSIZ], *tf;
77 
78 	int  dflag = 0;		/* -d seen */
79 	int  sflag = 0;		/* -s seen */
80 	int  lflag = 0;		/* -l seen */
81 	int  mflag = 0;		/* -m seen */
82 
83 	if (argc == 1)
84 		usage();
85 	if ((ptr = ALLOC_PMTAB) == NULL) {
86 		(void) fprintf(stderr, "calloc failed\n");
87 		exit(1);
88 	}
89 	ptr->p_modules = "";
90 	ptr->p_dmsg = "";
91 	ptr->p_termtype = "";
92 	ptr->p_softcar = "";
93 	ptr->p_prompt = "login\\: ";
94 	ttyflags[0] = '\0';
95 	tf = ttyflags;
96 	while ((c = getopt(argc, argv, "IT:S:Vd:s:chbr:t:l:m:p:i:")) != -1) {
97 		switch (c) {
98 		case 'V':
99 			if ((argc > 2) || (optind < argc))
100 				usage();
101 			(void) fprintf(stdout, "%d\n", PMTAB_VERS);
102 			exit(0);
103 			break;	/*NOTREACHED*/
104 		case 'd':
105 			ptr->p_device = optarg;
106 			dflag = 1;
107 			break;
108 		case 'c':
109 			tf = strcat(tf, "c");
110 			break;
111 		case 'h':
112 			tf = strcat(tf, "h");
113 			break;
114 		case 'b':
115 			tf = strcat(tf, "b");
116 			break;
117 		case 'I':
118 			tf = strcat(tf, "I");
119 			break;
120 		case 'r':
121 			tf = strcat(tf, "r");
122 			count = optarg;
123 			if (strcheck(optarg, NUM) != 0) {
124 				(void) fprintf(stderr,
125 		"Invalid argument for \"-r\" -- positive number expected.\n");
126 				usage();
127 			}
128 			break;
129 		case 'T':
130 			ptr->p_termtype = optarg;
131 			break;
132 		case 'S':
133 			switch (*optarg) {
134 			case 'Y':
135 			case 'y':
136 				ptr->p_softcar = "y";
137 				break;
138 			case 'N':
139 			case 'n':
140 				ptr->p_softcar = "n";
141 				break;
142 			default:
143 				usage();
144 			}
145 			break;
146 		case 's':
147 			ptr->p_server = optarg;
148 			sflag = 1;
149 			break;
150 		case 't':
151 			timeout = optarg;
152 			if (strcheck(optarg, NUM) != 0) {
153 				(void) fprintf(stderr,
154 		"Invalid argument for \"-t\" -- positive number expected.\n");
155 				usage();
156 			}
157 			break;
158 		case 'l':
159 			ptr->p_ttylabel = optarg;
160 			lflag = 1;
161 			break;
162 		case 'm':
163 			ptr->p_modules = optarg;
164 			mflag = 1;
165 			break;
166 		case 'p':
167 			ptr->p_prompt = prompt;
168 			copystr(ptr->p_prompt, optarg);
169 			break;
170 		case 'i':
171 			ptr->p_dmsg = dmsg;
172 			copystr(ptr->p_dmsg, optarg);
173 			break;
174 		case '?':
175 			usage();
176 			break;
177 		}
178 	}
179 	if (optind < argc)
180 		usage();
181 
182 	if ((!dflag) || (!sflag) || (!lflag))
183 		usage();
184 
185 	if (check_device(ptr->p_device) != 0)
186 		errflg++;
187 	if (check_cmd(ptr->p_server) != 0)
188 		errflg++;
189 	if (check_label(ptr->p_ttylabel) != 0)
190 		errflg++;
191 	if (mflag && (vml(ptr->p_modules) != 0))
192 		errflg++;
193 	if (errflg)
194 		exit(1);
195 	(void) fprintf(stdout, "%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:",
196 	    ptr->p_device, ttyflags, count, ptr->p_server,
197 	    timeout, ptr->p_ttylabel, ptr->p_modules,
198 	    ptr->p_prompt, ptr->p_dmsg, ptr->p_termtype,
199 	    ptr->p_softcar);
200 	return (0);
201 }
202 
203 /*
204  * usage - print out a usage message
205  */
206 
207 static void
208 usage(void)
209 {
210 	(void) fprintf(stderr,
211 	    "Usage:\tttyadm [ options ] -d device -s service -l ttylabel\n");
212 	(void) fprintf(stderr, "\tttyadm -V\n");
213 	(void) fprintf(stderr, "\n\tValid options are:\n");
214 	(void) fprintf(stderr, "\t-c\n");
215 	(void) fprintf(stderr, "\t-h\n");
216 	(void) fprintf(stderr, "\t-b\n");
217 	(void) fprintf(stderr, "\t-I\n");
218 	(void) fprintf(stderr, "\t-S y|n\n");
219 	(void) fprintf(stderr, "\t-T term\n");
220 	(void) fprintf(stderr, "\t-r count\n");
221 	(void) fprintf(stderr, "\t-t timeout\n");
222 	(void) fprintf(stderr, "\t-p prompt\n");
223 	(void) fprintf(stderr, "\t-m modules\n");
224 	(void) fprintf(stderr, "\t-i msg\n");
225 	exit(1);
226 }
227 
228 /*
229  *	check_label	- if ttylabel exists in /etc/ttydefs, return 0
230  *			- otherwise, return -1
231  */
232 
233 static int
234 check_label(char *ttylabel)
235 {
236 	FILE *fp;
237 
238 	if ((ttylabel == NULL) || (*ttylabel == '\0')) {
239 		(void) fprintf(stderr, "error -- ttylabel is missing");
240 		return (-1);
241 	}
242 	if ((fp = fopen(TTYDEFS, "r")) == NULL) {
243 		(void) fprintf(stderr, "error -- \"%s\" does not exist, "
244 		    "can't verify ttylabel <%s>\n", TTYDEFS, ttylabel);
245 		return (-1);
246 	}
247 	if (find_label(fp, ttylabel)) {
248 		(void) fclose(fp);
249 		return (0);
250 	}
251 	(void) fclose(fp);
252 	(void) fprintf(stderr, "error -- can't find ttylabel <%s> in \"%s\"\n",
253 	    ttylabel, TTYDEFS);
254 	return (-1);
255 }
256 
257 /*
258  *	log	- print a message to stderr
259  */
260 void
261 log(const char *msg, ...)
262 {
263 	va_list ap;
264 	va_start(ap, msg);
265 	(void) vfprintf(stderr, msg, ap);
266 	va_end(ap);
267 	(void) fprintf(stderr, "\n");
268 }
269