xref: /titanic_51/usr/src/cmd/bnu/uucheck.c (revision 8eea8e29cc4374d1ee24c25a07f45af132db3499)
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 1993 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 mkdirs(){}
53 canPath(){}
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 main(argc, argv)
101 char *argv[];
102 {
103     struct stat statbuf;
104     struct tab *tabptr;
105     int i;
106 
107 	(void) strcpy(Progname, "uucheck");
108 	while ((i = getopt(argc, argv, "vx:")) != EOF) {
109 		switch(i){
110 
111 		case 'v':
112 			verbose++;
113 			break;
114 
115 		case 'x':
116 			Debug = atoi(optarg);
117 			if (Debug <= 0)
118 				Debug = 1;
119 #ifdef SMALL
120 			fprintf(stderr,
121 			"WARNING: uucheck built with SMALL flag defined -- no debug info available\n");
122 #endif /* SMALL */
123 			break;
124 
125 		default:
126 			(void) fprintf(stderr, "\tusage: %s %s\n",
127 			    Progname, USAGE);
128 			exit(1);
129 		}
130 	}
131 	if (argc != optind) {
132 		(void) fprintf(stderr, "\tusage: %s %s\n", Progname, USAGE);
133 		exit(1);
134 	}
135 
136     if (verbose) printf("*** uucheck:  Check Required Files and Directories\n");
137     for (tabptr = tab; tabptr->name != NULL; tabptr++) {
138         if (stat(tabptr->value, &statbuf) < 0) {
139 	    fprintf(stderr, "%s - ", tabptr->name);
140 	    perror(tabptr->value);
141 	    Uerrors++;
142 	}
143     }
144 
145     if (verbose) printf("*** uucheck:  Directories Check Complete\n\n");
146 
147     /* check the permissions file */
148 
149     if (verbose) printf("*** uucheck:  Check %s file\n", PERMISSIONS);
150     Uerrors += checkPerm();
151     if (verbose) printf("*** uucheck:  %s Check Complete\n\n", PERMISSIONS);
152 
153     exit(Uerrors);
154 
155 
156 	/* NOTREACHED */
157 }
158 
159 int
160 checkPerm ()
161 {
162     int type;
163     int error=0;
164     char defaults[BUFSIZ];
165 
166     for (type=0; type<2; type++) {
167 	/* type = 0 for LOGNAME, 1 for MACHINE */
168 
169 	if (verbose) printf("** %s \n\n",
170 	    type == U_MACHINE
171 		?"MACHINE PHASE (when we call or execute their uux requests)"
172 		:"LOGNAME PHASE (when they call us)" );
173 
174 	Fp = fopen(PERMISSIONS, "r");
175 	if (Fp == NULL) {
176 		if (verbose) printf("can't open %s\n", PERMISSIONS);
177 		exit(1);
178 	}
179 
180 	for (;;) {
181 	    if (parse_tokens(_Flds, NULL) != 0) {
182 		fclose(Fp);
183 		break;
184 	    }
185 	    if (_Flds[type] == NULL)
186 	        continue;
187 
188 	    /* XXX - need to reset defaults here */
189 	    fillFlds();
190 	    /* if no ReadPath set num to 1--Path already set */
191 	    fillList(U_READPATH, _RPaths);
192 	    fillList(U_WRITEPATH, _WPaths);
193 	    fillList(U_NOREADPATH, _NoRPaths);
194 	    fillList(U_NOWRITEPATH, _NoWPaths);
195 	    if (_Flds[U_COMMANDS] == NULL) {
196 		strcpy(defaults, DEFAULTCMDS);
197 		_Flds[U_COMMANDS] = defaults;
198 	    }
199 	    fillList(U_COMMANDS, _Commands);
200 	    error += outLine(type);
201 	}
202     if (verbose) printf("\n");
203     }
204     return(error);
205 }
206 
207 int
208 outLine(type)
209 int type;
210 {
211 	register int i;
212 	register char *p;
213 	char *arg, cmd[BUFSIZ];
214 	int error = 0;
215 	char myname[MAXBASENAME+1];
216 
217 	if (_Flds[type][0] == 0)
218 	    return(0);
219 
220 	if (type == U_LOGNAME) { /* for LOGNAME */
221 	    p = _Flds[U_LOGNAME];
222 	    if (verbose) printf("When a system logs in as: ");
223 	    while (*p != '\0') {
224 		p = nextarg(p, &arg);
225 		if (verbose) 	printf("(%s) ", arg);
226 	    }
227 	    if (verbose) printf("\n");
228 
229 	    if (callBack()) {
230 		if (verbose) printf("\tWe will call them back.\n\n");
231 		return(0);
232 	    }
233 	}
234 	else {	/* MACHINE */
235 	    p = _Flds[U_MACHINE];
236 	    if (verbose) printf("When we call system(s): ");
237 	    while (*p != '\0') {
238 		p = nextarg(p, &arg);
239 		if (verbose) printf("(%s) ", arg);
240 	    }
241 	    if (verbose) printf("\n");
242 
243 	}
244 
245 	if (verbose) printf("\tWe %s allow them to request files.\n",
246 	    requestOK()? "DO" : "DO NOT");
247 
248 	if (type == U_LOGNAME) {
249 		if (verbose) printf("\tWe %s send files queued for them on this call.\n",
250 		    switchRole()? "WILL" : "WILL NOT");
251 	}
252 
253 	if (verbose) printf("\tThey can send files to\n");
254 	if (_Flds[U_WRITEPATH] == NULL) {
255 	    if (verbose) printf("\t    %s (DEFAULT)\n", Pubdir);
256 	}
257 	else {
258 	    for (i=0; _WPaths[i] != NULL; i++)
259 		if (verbose) printf("\t    %s\n", _WPaths[i]);
260 	}
261 
262 	if (_Flds[U_NOWRITEPATH] != NULL) {
263 	    if (verbose) printf("\tExcept\n");
264 	    for (i=0; _NoWPaths[i] != NULL; i++)
265 		if (verbose) printf("\t    %s\n", _NoWPaths[i]);
266 	}
267 
268 	if (verbose) {
269 	    if (noSpool())
270 		(void) printf("\tSent files will be created directly in the target directory.\n");
271 	    else {
272 		(void) printf("\tSent files will be created in %s\n", SPOOL);
273 		(void) printf("\t before they are copied to the target directory.\n");
274 	    }
275 	}
276 
277 	if (requestOK()) {
278 	    if (verbose) printf("\tThey can request files from\n");
279 	    if (_Flds[U_READPATH] == NULL) {
280 		if (verbose) printf("\t    %s (DEFAULT)\n", Pubdir);
281 	    }
282 	    else {
283 		for (i=0; _RPaths[i] != NULL; i++)
284 		    if (verbose) printf("\t    %s\n", _RPaths[i]);
285 	    }
286 
287 	    if (_Flds[U_NOREADPATH] != NULL) {
288 		if (verbose) printf("\tExcept\n");
289 		for (i=0; _NoRPaths[i] != NULL; i++)
290 		    if (verbose) printf("\t    %s\n", _NoRPaths[i]);
291 	    }
292 	}
293 
294 	myName(myname);
295 	if (verbose) printf("\tMyname for the conversation will be %s.\n",
296 	    myname);
297 	if (verbose) printf("\tPUBDIR for the conversation will be %s.\n",
298 	    Pubdir);
299 
300 	if (verbose) printf("\n");
301 
302 	if (type == U_MACHINE) {
303 	    if (verbose) printf("Machine(s): ");
304 	    p = _Flds[U_MACHINE];
305 	    while (*p != '\0') {
306 		p = nextarg(p, &arg);
307 		if (verbose) printf("(%s) ", arg);
308 	    }
309 	    if (verbose) printf("\nCAN execute the following commands:\n");
310 	    for (i=0; _Commands[i] != NULL; i++) {
311 		if (cmdOK(BASENAME(_Commands[i], '/'), cmd) == FALSE) {
312 		    if (verbose) printf("Software Error in permission.c\n");
313 		    error++;
314 		}
315 		if (verbose) printf("command (%s), fullname (%s)\n",
316 		    BASENAME(_Commands[i], '/'), cmd);
317 	    }
318 	    if (verbose) printf("\n");
319 	}
320 
321 	return(error);
322 }
323 
324 void
325 cleanup(s)
326 	int s;
327 {
328 	exit(s);
329 }
330