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
30 #pragma ident "%Z%%M% %I% %E% SMI"
31
32
33 #include <stdio.h>
34 #include <unistd.h>
35 #include <stdlib.h>
36 #include <string.h>
37 #include <sys/types.h>
38 #include <ctype.h>
39 #include <sys/stat.h>
40 #include <stdarg.h>
41 #include "tmstruct.h"
42 #include "ttymon.h"
43
44 /*
45 * ttyadm - format ttymon specific information and
46 * print it to stdout
47 *
48 * Usage: ttyadm [options] -d device -s service -l ttylabel
49 * ttyadm -V
50 *
51 * valid options are:
52 * -c
53 * -h
54 * -b
55 * -I
56 * -S y|n
57 * -T term
58 * -r count
59 * -t timeout
60 * -p prompt
61 * -m modules
62 * -i msg
63 */
64
65 static void usage();
66 static int check_label();
67
68 extern int check_device();
69 extern int check_cmd();
70 extern int vml();
71
72 int
main(int argc,char * argv[])73 main(int argc, char *argv[])
74 {
75 int c; /* option letter */
76 int errflg = 0; /* error indicator */
77
78 struct pmtab *ptr;
79 char *timeout = "";
80 char *count = "";
81 char prompt[BUFSIZ];
82 char dmsg[BUFSIZ];
83 char ttyflags[BUFSIZ], *tf;
84
85 int dflag = 0; /* -d seen */
86 int sflag = 0; /* -s seen */
87 int lflag = 0; /* -l seen */
88 int mflag = 0; /* -m seen */
89
90 extern void copystr();
91 extern char *optarg;
92 extern int optind;
93 extern int strcheck();
94
95 if (argc == 1)
96 usage();
97 if ((ptr = ALLOC_PMTAB) == PNULL) {
98 (void)fprintf(stderr, "calloc failed\n");
99 exit(1);
100 }
101 ptr->p_modules = "";
102 ptr->p_dmsg = "";
103 ptr->p_termtype = "";
104 ptr->p_softcar = "";
105 ptr->p_prompt = "login\\: ";
106 ttyflags[0] = '\0';
107 tf = ttyflags;
108 while ((c = getopt(argc, argv, "IT:S:Vd:s:chbr:t:l:m:p:i:")) != -1) {
109 switch (c) {
110 case 'V':
111 if ((argc > 2) || (optind < argc))
112 usage();
113 (void)fprintf(stdout,"%d\n", PMTAB_VERS);
114 exit(0);
115 break; /*NOTREACHED*/
116 case 'd':
117 ptr->p_device = optarg;
118 dflag = 1;
119 break;
120 case 'c':
121 tf = strcat(tf,"c");
122 break;
123 case 'h':
124 tf = strcat(tf,"h");
125 break;
126 case 'b':
127 tf = strcat(tf,"b");
128 break;
129 case 'I':
130 tf = strcat(tf,"I");
131 break;
132 case 'r':
133 tf = strcat(tf,"r");
134 count = optarg;
135 if (strcheck(optarg,NUM) != 0) {
136 (void)fprintf(stderr,
137 "Invalid argument for \"-r\" -- positive number expected.\n");
138 usage();
139 }
140 break;
141 case 'T':
142 ptr->p_termtype = optarg;
143 break;
144 case 'S':
145 switch (*optarg) {
146 case 'Y':
147 case 'y':
148 ptr->p_softcar = "y";
149 break;
150 case 'N':
151 case 'n':
152 ptr->p_softcar = "n";
153 break;
154 default:
155 usage();
156 }
157 break;
158 case 's':
159 ptr->p_server = optarg;
160 sflag = 1;
161 break;
162 case 't':
163 timeout = optarg;
164 if (strcheck(optarg,NUM) != 0) {
165 (void)fprintf(stderr,
166 "Invalid argument for \"-t\" -- positive number expected.\n");
167 usage();
168 }
169 break;
170 case 'l':
171 ptr->p_ttylabel = optarg;
172 lflag = 1;
173 break;
174 case 'm':
175 ptr->p_modules = optarg;
176 mflag = 1;
177 break;
178 case 'p':
179 ptr->p_prompt = prompt;
180 copystr(ptr->p_prompt,optarg);
181 break;
182 case 'i':
183 ptr->p_dmsg = dmsg;
184 copystr(ptr->p_dmsg,optarg);
185 break;
186 case '?':
187 usage();
188 break;
189 }
190 }
191 if (optind < argc)
192 usage();
193
194 if ((!dflag) || (!sflag) || (!lflag))
195 usage();
196
197 if (check_device(ptr->p_device) != 0)
198 errflg++;
199 if (check_cmd(ptr->p_server) != 0)
200 errflg++;
201 if (check_label(ptr->p_ttylabel) != 0)
202 errflg++;
203 if (mflag && (vml(ptr->p_modules) != 0))
204 errflg++;
205 if (errflg)
206 exit(1);
207 (void)fprintf(stdout, "%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:",
208 ptr->p_device, ttyflags, count, ptr->p_server,
209 timeout, ptr->p_ttylabel, ptr->p_modules,
210 ptr->p_prompt, ptr->p_dmsg, ptr->p_termtype,
211 ptr->p_softcar);
212 return (0);
213 }
214
215 /*
216 * usage - print out a usage message
217 */
218
219 static void
usage()220 usage()
221 {
222 (void)fprintf(stderr, "Usage:\tttyadm [ options ] -d device -s service -l ttylabel\n");
223 (void)fprintf(stderr, "\tttyadm -V\n");
224 (void)fprintf(stderr, "\n\tValid options are:\n");
225 (void)fprintf(stderr, "\t-c\n");
226 (void)fprintf(stderr, "\t-h\n");
227 (void)fprintf(stderr, "\t-b\n");
228 (void)fprintf(stderr, "\t-I\n");
229 (void)fprintf(stderr, "\t-S y|n\n");
230 (void)fprintf(stderr, "\t-T term\n");
231 (void)fprintf(stderr, "\t-r count\n");
232 (void)fprintf(stderr, "\t-t timeout\n");
233 (void)fprintf(stderr, "\t-p prompt\n");
234 (void)fprintf(stderr, "\t-m modules\n");
235 (void)fprintf(stderr, "\t-i msg\n");
236 exit(1);
237 }
238
239 /*
240 * check_label - if ttylabel exists in /etc/ttydefs, return 0
241 * - otherwise, return -1
242 */
243
244 static int
check_label(ttylabel)245 check_label(ttylabel)
246 char *ttylabel;
247 {
248 FILE *fp;
249 extern int find_label();
250
251 if ((ttylabel == NULL) || (*ttylabel == '\0')) {
252 (void)fprintf(stderr, "error -- ttylabel is missing");
253 return(-1);
254 }
255 if ((fp = fopen(TTYDEFS, "r")) == NULL) {
256 (void)fprintf(stderr, "error -- \"%s\" does not exist, can't verify ttylabel <%s>\n", TTYDEFS, ttylabel);
257 return(-1);
258 }
259 if (find_label(fp,ttylabel)) {
260 (void)fclose(fp);
261 return(0);
262 }
263 (void)fclose(fp);
264 (void)fprintf(stderr,"error -- can't find ttylabel <%s> in \"%s\"\n",
265 ttylabel, TTYDEFS);
266 return(-1);
267 }
268
269 /*
270 * log - print a message to stderr
271 */
272 void
log(const char * msg,...)273 log(const char *msg, ...)
274 {
275 va_list ap;
276 va_start(ap, msg);
277 (void) vfprintf(stderr, msg, ap);
278 va_end(ap);
279 (void) fprintf(stderr, "\n");
280 }
281