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