xref: /csrg-svn/usr.bin/uucp/libuu/expfile.c (revision 17835)
113644Ssam #ifndef lint
2*17835Sralph static char sccsid[] = "@(#)expfile.c	5.3 (Berkeley) 01/22/85";
313644Ssam #endif
413644Ssam 
513644Ssam #include "uucp.h"
613644Ssam #include <sys/types.h>
713644Ssam #include <sys/stat.h>
813644Ssam 
913644Ssam /*******
1013644Ssam  *	expfile(file)	expand file name
1113644Ssam  *	char *file;
1213644Ssam  *
1313644Ssam  *	return codes: 0 - Ordinary spool area file
1413644Ssam  *		      1 - Other normal file
1513644Ssam  *		      FAIL - no Wrkdir name available
1613644Ssam  */
1713644Ssam 
1813644Ssam expfile(file)
1913644Ssam char *file;
2013644Ssam {
2113644Ssam 	register char *fpart, *p;
22*17835Sralph 	char user[WKDSIZE], *up;
2317131Sralph 	char full[MAXFULLNAME];
2413644Ssam 	int uid;
2513644Ssam 
2613644Ssam 	switch(file[0]) {
2713644Ssam 	case '/':
2813644Ssam 		return(1);
2913644Ssam 	case '~':
3013644Ssam 		for (fpart = file + 1, up = user; *fpart != '\0'
31*17835Sralph 			&& *fpart != '/'; fpart++)
3213644Ssam 				*up++ = *fpart;
3313644Ssam 		*up = '\0';
3413644Ssam 		if (!*user || gninfo(user, &uid, full) != 0) {
3513644Ssam 			strcpy(full, PUBDIR);
3613644Ssam 		}
3713644Ssam 
3813644Ssam 		strcat(full, fpart);
3913644Ssam 		strcpy(file, full);
40*17835Sralph 		return 1;
4113644Ssam 	default:
4213644Ssam 		p = index(file, '/');
43*17835Sralph 		strcpy(full, Wrkdir);
44*17835Sralph 		strcat(full, "/");
45*17835Sralph 		strcat(full, file);
4613644Ssam 		strcpy(file, full);
4713644Ssam 		if (Wrkdir[0] == '\0')
48*17835Sralph 			return FAIL;
4913644Ssam 		else if (p != NULL)
50*17835Sralph 			return 1;
51*17835Sralph 		return 0;
5213644Ssam 	}
5313644Ssam }
5413644Ssam 
5513644Ssam 
5613644Ssam /***
5713644Ssam  *	isdir(name)	check if directory name
5813644Ssam  *	char *name;
5913644Ssam  *
6013644Ssam  *	return codes:  0 - not directory  |  1 - is directory
6113644Ssam  */
6213644Ssam 
6313644Ssam isdir(name)
6413644Ssam char *name;
6513644Ssam {
6613644Ssam 	register int ret;
6713644Ssam 	struct stat s;
6813644Ssam 
6913644Ssam 	ret = stat(subfile(name), &s);
7013644Ssam 	if (ret < 0)
71*17835Sralph 		return 0;
7213644Ssam 	if ((s.st_mode & S_IFMT) == S_IFDIR)
73*17835Sralph 		return 1;
74*17835Sralph 	return 0;
7513644Ssam }
7613644Ssam 
7713644Ssam 
7813644Ssam /***
7913644Ssam  *	mkdirs(name)	make all necessary directories
8013644Ssam  *	char *name;
8113644Ssam  *
8213644Ssam  *	return 0  |  FAIL
8313644Ssam  */
8413644Ssam 
8513644Ssam mkdirs(name)
8613644Ssam char *name;
8713644Ssam {
8813644Ssam 	int ret, mask;
89*17835Sralph 	char cmd[MAXFULLNAME], dir[MAXFULLNAME];
9013644Ssam 	register char *p;
9113644Ssam 
9213644Ssam 	for (p = dir + 1;; p++) {
9313644Ssam 		strcpy(dir, name);
9413644Ssam 		if ((p = index(p, '/')) == NULL)
95*17835Sralph 			return 0;
9613644Ssam 		*p = '\0';
9713644Ssam 		if (isdir(dir))
9813644Ssam 			continue;
9913644Ssam 
10013644Ssam 		sprintf(cmd, "mkdir %s;chmod 0777 %s", dir, dir);
10113644Ssam 		DEBUG(4, "mkdir - %s\n", dir);
10213644Ssam 		mask = umask(0);
10313644Ssam 		ret = shio(cmd, CNULL, CNULL, User);
10413644Ssam 		umask(mask);
10513644Ssam 		if (ret != 0)
106*17835Sralph 			return FAIL;
10713644Ssam 	}
108*17835Sralph 	/* NOTREACHED */
10913644Ssam }
11013644Ssam 
11113644Ssam /***
11213644Ssam  *	ckexpf - expfile and check return
11313644Ssam  *		print error if it failed.
11413644Ssam  *
11513644Ssam  *	return code - 0 - ok; FAIL if expfile failed
11613644Ssam  */
11713644Ssam 
11813644Ssam ckexpf(file)
11913644Ssam register char *file;
12013644Ssam {
12113644Ssam 
12213644Ssam 	if (expfile(file) != FAIL)
123*17835Sralph 		return 0;
12413644Ssam 
12513644Ssam 	/*  could not expand file name */
12613644Ssam 	/* the gwd routine failed */
12713644Ssam 
128*17835Sralph 	logent("CAN'T EXPAND FILENAME - PWD FAILED", file+1);
129*17835Sralph 	return FAIL;
13013644Ssam }
131