xref: /csrg-svn/usr.bin/uucp/libuu/expfile.c (revision 13644)
1*13644Ssam #ifndef lint
2*13644Ssam static char sccsid[] = "@(#)expfile.c	5.1 (Berkeley) 07/02/83";
3*13644Ssam #endif
4*13644Ssam 
5*13644Ssam #include "uucp.h"
6*13644Ssam #include <sys/types.h>
7*13644Ssam #include <sys/stat.h>
8*13644Ssam 
9*13644Ssam /*******
10*13644Ssam  *	expfile(file)	expand file name
11*13644Ssam  *	char *file;
12*13644Ssam  *
13*13644Ssam  *	return codes: 0 - Ordinary spool area file
14*13644Ssam  *		      1 - Other normal file
15*13644Ssam  *		      FAIL - no Wrkdir name available
16*13644Ssam  */
17*13644Ssam 
18*13644Ssam expfile(file)
19*13644Ssam char *file;
20*13644Ssam {
21*13644Ssam 	register char *fpart, *p;
22*13644Ssam 	char user[20], *up;
23*13644Ssam 	char full[100];
24*13644Ssam 	int uid;
25*13644Ssam 
26*13644Ssam 	switch(file[0]) {
27*13644Ssam 	case '/':
28*13644Ssam 		return(1);
29*13644Ssam 	case '~':
30*13644Ssam 		for (fpart = file + 1, up = user; *fpart != '\0'
31*13644Ssam 			&& *fpart != '/'; fpart++)
32*13644Ssam 				*up++ = *fpart;
33*13644Ssam 		*up = '\0';
34*13644Ssam 		/* ll1b.105, mn, Mark Nettleingham, defend against
35*13644Ssam 		 * null login name in /etc/passwd
36*13644Ssam 		 */
37*13644Ssam 		if (!*user || gninfo(user, &uid, full) != 0) {
38*13644Ssam 			strcpy(full, PUBDIR);
39*13644Ssam 		}
40*13644Ssam 
41*13644Ssam 		strcat(full, fpart);
42*13644Ssam 		strcpy(file, full);
43*13644Ssam 		return(1);
44*13644Ssam 	default:
45*13644Ssam 		p = index(file, '/');
46*13644Ssam 		strcpy(full, Wrkdir);
47*13644Ssam 		strcat(full, "/");
48*13644Ssam 		strcat(full, file);
49*13644Ssam 		strcpy(file, full);
50*13644Ssam 		if (Wrkdir[0] == '\0')
51*13644Ssam 			return(FAIL);
52*13644Ssam 		else if (p != NULL)
53*13644Ssam 			return(1);
54*13644Ssam 		return(0);
55*13644Ssam 	}
56*13644Ssam }
57*13644Ssam 
58*13644Ssam 
59*13644Ssam /***
60*13644Ssam  *	isdir(name)	check if directory name
61*13644Ssam  *	char *name;
62*13644Ssam  *
63*13644Ssam  *	return codes:  0 - not directory  |  1 - is directory
64*13644Ssam  */
65*13644Ssam 
66*13644Ssam isdir(name)
67*13644Ssam char *name;
68*13644Ssam {
69*13644Ssam 	register int ret;
70*13644Ssam 	struct stat s;
71*13644Ssam 
72*13644Ssam 	ret = stat(subfile(name), &s);
73*13644Ssam 	if (ret < 0)
74*13644Ssam 		return(0);
75*13644Ssam 	if ((s.st_mode & S_IFMT) == S_IFDIR)
76*13644Ssam 		return(1);
77*13644Ssam 	return(0);
78*13644Ssam }
79*13644Ssam 
80*13644Ssam 
81*13644Ssam /***
82*13644Ssam  *	mkdirs(name)	make all necessary directories
83*13644Ssam  *	char *name;
84*13644Ssam  *
85*13644Ssam  *	return 0  |  FAIL
86*13644Ssam  */
87*13644Ssam 
88*13644Ssam mkdirs(name)
89*13644Ssam char *name;
90*13644Ssam {
91*13644Ssam 	int ret, mask;
92*13644Ssam 	char cmd[100], dir[100];
93*13644Ssam 	register char *p;
94*13644Ssam 
95*13644Ssam 	for (p = dir + 1;; p++) {
96*13644Ssam 		strcpy(dir, name);
97*13644Ssam 		if ((p = index(p, '/')) == NULL)
98*13644Ssam 			return(0);
99*13644Ssam 		*p = '\0';
100*13644Ssam 		if (isdir(dir))
101*13644Ssam 			continue;
102*13644Ssam 
103*13644Ssam 		/* rti!trt: add chmod ala 4.1c uucp */
104*13644Ssam 		sprintf(cmd, "mkdir %s;chmod 0777 %s", dir, dir);
105*13644Ssam 		DEBUG(4, "mkdir - %s\n", dir);
106*13644Ssam 		mask = umask(0);
107*13644Ssam 		ret = shio(cmd, CNULL, CNULL, User);
108*13644Ssam 		umask(mask);
109*13644Ssam 		if (ret != 0)
110*13644Ssam 			return(FAIL);
111*13644Ssam 	}
112*13644Ssam }
113*13644Ssam 
114*13644Ssam /***
115*13644Ssam  *	ckexpf - expfile and check return
116*13644Ssam  *		print error if it failed.
117*13644Ssam  *
118*13644Ssam  *	return code - 0 - ok; FAIL if expfile failed
119*13644Ssam  */
120*13644Ssam 
121*13644Ssam ckexpf(file)
122*13644Ssam register char *file;
123*13644Ssam {
124*13644Ssam 
125*13644Ssam 	if (expfile(file) != FAIL)
126*13644Ssam 		return(0);
127*13644Ssam 
128*13644Ssam 	/*  could not expand file name */
129*13644Ssam 	/* the gwd routine failed */
130*13644Ssam 
131*13644Ssam 	fprintf(stderr, "Can't expand filename (%s). Pwd failed.\n", file+1);
132*13644Ssam 	return(FAIL);
133*13644Ssam }
134