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