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 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 28 /* All Rights Reserved */ 29 30 31 #pragma ident "%Z%%M% %I% %E% SMI" 32 33 #define UUCHECK 34 int Uerrors = 0; /* error count */ 35 36 /* This unusual include (#include "permission.c") is done because 37 * uucheck wants to use the global static variable in permission.c 38 */ 39 40 #include "uucp.h" 41 #include "permission.c" 42 #include "sysfiles.h" 43 44 /* These are here because uucpdefs.c is not used, and 45 * some routines are referenced (never called within uucheck execution) 46 * and not included. 47 */ 48 49 #define USAGE "[-v] [-xNUM]" 50 51 int Debug=0; 52 int mkdirs(){ return (0); } 53 int canPath(){ return (0); } 54 char RemSpool[] = SPOOL; /* this is a dummy for chkpth() -- never used here */ 55 char *Spool = SPOOL; 56 char *Pubdir = PUBDIR; 57 char *Bnptr; 58 char Progname[NAMESIZE]; 59 /* used for READANY and READSOME macros */ 60 struct stat __s_; 61 62 /* This is stuff for uucheck */ 63 64 struct tab 65 { 66 char *name; 67 char *value; 68 } tab[] = 69 { 70 #ifdef CORRUPTDIR 71 "CORRUPT", CORRUPTDIR, 72 #endif 73 "LOGUUCP", LOGUUCP, 74 "LOGUUX", LOGUUX, 75 "LOGUUXQT", LOGUUXQT, 76 "LOGCICO", LOGCICO, 77 "SEQDIR", SEQDIR, 78 "STATDIR", STATDIR, 79 "PERMISSIONS", PERMISSIONS, 80 "SYSTEMS", SYSTEMS, 81 "DEVICES", DEVICES , 82 "DIALCODES", DIALCODES, 83 "DIALERS", DIALERS, 84 #ifdef USRSPOOLLOCKS 85 "USRSPOOLLOCKS", "/var/spool/locks", 86 #endif 87 #ifdef NOSTRANGERS 88 "NOSTRANGERS", NOSTRANGERS, 89 #endif 90 "LIMITS", LIMITS, /* if not defined we'll stat NULL, it's not a bug */ 91 "XQTDIR", XQTDIR, 92 "WORKSPACE", WORKSPACE, 93 "admin directory", ADMIN, 94 NULL, 95 }; 96 97 extern char *nextarg(); 98 int verbose = 0; /* fsck-like verbosity */ 99 100 int 101 main(argc, argv) 102 int argc; 103 char *argv[]; 104 { 105 struct stat statbuf; 106 struct tab *tabptr; 107 int i; 108 109 (void) strcpy(Progname, "uucheck"); 110 while ((i = getopt(argc, argv, "vx:")) != EOF) { 111 switch(i){ 112 113 case 'v': 114 verbose++; 115 break; 116 117 case 'x': 118 Debug = atoi(optarg); 119 if (Debug <= 0) 120 Debug = 1; 121 #ifdef SMALL 122 fprintf(stderr, 123 "WARNING: uucheck built with SMALL flag defined -- no debug info available\n"); 124 #endif /* SMALL */ 125 break; 126 127 default: 128 (void) fprintf(stderr, "\tusage: %s %s\n", 129 Progname, USAGE); 130 exit(1); 131 } 132 } 133 if (argc != optind) { 134 (void) fprintf(stderr, "\tusage: %s %s\n", Progname, USAGE); 135 exit(1); 136 } 137 138 if (verbose) printf("*** uucheck: Check Required Files and Directories\n"); 139 for (tabptr = tab; tabptr->name != NULL; tabptr++) { 140 if (stat(tabptr->value, &statbuf) < 0) { 141 fprintf(stderr, "%s - ", tabptr->name); 142 perror(tabptr->value); 143 Uerrors++; 144 } 145 } 146 147 if (verbose) printf("*** uucheck: Directories Check Complete\n\n"); 148 149 /* check the permissions file */ 150 151 if (verbose) printf("*** uucheck: Check %s file\n", PERMISSIONS); 152 Uerrors += checkPerm(); 153 if (verbose) printf("*** uucheck: %s Check Complete\n\n", PERMISSIONS); 154 155 return(Uerrors); 156 } 157 158 int 159 checkPerm () 160 { 161 int type; 162 int error=0; 163 char defaults[BUFSIZ]; 164 165 for (type=0; type<2; type++) { 166 /* type = 0 for LOGNAME, 1 for MACHINE */ 167 168 if (verbose) printf("** %s \n\n", 169 type == U_MACHINE 170 ?"MACHINE PHASE (when we call or execute their uux requests)" 171 :"LOGNAME PHASE (when they call us)" ); 172 173 Fp = fopen(PERMISSIONS, "r"); 174 if (Fp == NULL) { 175 if (verbose) printf("can't open %s\n", PERMISSIONS); 176 exit(1); 177 } 178 179 for (;;) { 180 if (parse_tokens(_Flds, NULL) != 0) { 181 fclose(Fp); 182 break; 183 } 184 if (_Flds[type] == NULL) 185 continue; 186 187 /* XXX - need to reset defaults here */ 188 fillFlds(); 189 /* if no ReadPath set num to 1--Path already set */ 190 fillList(U_READPATH, _RPaths); 191 fillList(U_WRITEPATH, _WPaths); 192 fillList(U_NOREADPATH, _NoRPaths); 193 fillList(U_NOWRITEPATH, _NoWPaths); 194 if (_Flds[U_COMMANDS] == NULL) { 195 strcpy(defaults, DEFAULTCMDS); 196 _Flds[U_COMMANDS] = defaults; 197 } 198 fillList(U_COMMANDS, _Commands); 199 error += outLine(type); 200 } 201 if (verbose) printf("\n"); 202 } 203 return(error); 204 } 205 206 int 207 outLine(type) 208 int type; 209 { 210 int i; 211 char *p; 212 char *arg, cmd[BUFSIZ]; 213 int error = 0; 214 char myname[MAXBASENAME+1]; 215 216 if (_Flds[type][0] == 0) 217 return(0); 218 219 if (type == U_LOGNAME) { /* for LOGNAME */ 220 p = _Flds[U_LOGNAME]; 221 if (verbose) printf("When a system logs in as: "); 222 while (*p != '\0') { 223 p = nextarg(p, &arg); 224 if (verbose) printf("(%s) ", arg); 225 } 226 if (verbose) printf("\n"); 227 228 if (callBack()) { 229 if (verbose) printf("\tWe will call them back.\n\n"); 230 return(0); 231 } 232 } 233 else { /* MACHINE */ 234 p = _Flds[U_MACHINE]; 235 if (verbose) printf("When we call system(s): "); 236 while (*p != '\0') { 237 p = nextarg(p, &arg); 238 if (verbose) printf("(%s) ", arg); 239 } 240 if (verbose) printf("\n"); 241 242 } 243 244 if (verbose) printf("\tWe %s allow them to request files.\n", 245 requestOK()? "DO" : "DO NOT"); 246 247 if (type == U_LOGNAME) { 248 if (verbose) printf("\tWe %s send files queued for them on this call.\n", 249 switchRole()? "WILL" : "WILL NOT"); 250 } 251 252 if (verbose) printf("\tThey can send files to\n"); 253 if (_Flds[U_WRITEPATH] == NULL) { 254 if (verbose) printf("\t %s (DEFAULT)\n", Pubdir); 255 } 256 else { 257 for (i=0; _WPaths[i] != NULL; i++) 258 if (verbose) printf("\t %s\n", _WPaths[i]); 259 } 260 261 if (_Flds[U_NOWRITEPATH] != NULL) { 262 if (verbose) printf("\tExcept\n"); 263 for (i=0; _NoWPaths[i] != NULL; i++) 264 if (verbose) printf("\t %s\n", _NoWPaths[i]); 265 } 266 267 if (verbose) { 268 if (noSpool()) 269 (void) printf("\tSent files will be created directly in the target directory.\n"); 270 else { 271 (void) printf("\tSent files will be created in %s\n", SPOOL); 272 (void) printf("\t before they are copied to the target directory.\n"); 273 } 274 } 275 276 if (requestOK()) { 277 if (verbose) printf("\tThey can request files from\n"); 278 if (_Flds[U_READPATH] == NULL) { 279 if (verbose) printf("\t %s (DEFAULT)\n", Pubdir); 280 } 281 else { 282 for (i=0; _RPaths[i] != NULL; i++) 283 if (verbose) printf("\t %s\n", _RPaths[i]); 284 } 285 286 if (_Flds[U_NOREADPATH] != NULL) { 287 if (verbose) printf("\tExcept\n"); 288 for (i=0; _NoRPaths[i] != NULL; i++) 289 if (verbose) printf("\t %s\n", _NoRPaths[i]); 290 } 291 } 292 293 myName(myname); 294 if (verbose) printf("\tMyname for the conversation will be %s.\n", 295 myname); 296 if (verbose) printf("\tPUBDIR for the conversation will be %s.\n", 297 Pubdir); 298 299 if (verbose) printf("\n"); 300 301 if (type == U_MACHINE) { 302 if (verbose) printf("Machine(s): "); 303 p = _Flds[U_MACHINE]; 304 while (*p != '\0') { 305 p = nextarg(p, &arg); 306 if (verbose) printf("(%s) ", arg); 307 } 308 if (verbose) printf("\nCAN execute the following commands:\n"); 309 for (i=0; _Commands[i] != NULL; i++) { 310 if (cmdOK(BASENAME(_Commands[i], '/'), cmd) == FALSE) { 311 if (verbose) printf("Software Error in permission.c\n"); 312 error++; 313 } 314 if (verbose) printf("command (%s), fullname (%s)\n", 315 BASENAME(_Commands[i], '/'), cmd); 316 } 317 if (verbose) printf("\n"); 318 } 319 320 return(error); 321 } 322 323 void 324 cleanup(s) 325 int s; 326 { 327 exit(s); 328 } 329