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