xref: /csrg-svn/usr.bin/uucp/libuu/expfile.c (revision 23598)
113644Ssam #ifndef lint
2*23598Sbloom static char sccsid[] = "@(#)expfile.c	5.5 (Berkeley) 06/19/85";
313644Ssam #endif
413644Ssam 
513644Ssam #include "uucp.h"
613644Ssam #include <sys/stat.h>
713644Ssam 
8*23598Sbloom /*LINTLIBRARY*/
9*23598Sbloom 
1018620Sralph /*
1118620Sralph  *	expand file name
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;
2217835Sralph 	char user[WKDSIZE], *up;
2317131Sralph 	char full[MAXFULLNAME];
2413644Ssam 	int uid;
2513644Ssam 
2613644Ssam 	switch(file[0]) {
2713644Ssam 	case '/':
2818620Sralph 		return 1;
2913644Ssam 	case '~':
3013644Ssam 		for (fpart = file + 1, up = user; *fpart != '\0'
31*23598Sbloom 			&& *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);
4017835Sralph 		return 1;
4113644Ssam 	default:
4213644Ssam 		p = index(file, '/');
4317835Sralph 		strcpy(full, Wrkdir);
4417835Sralph 		strcat(full, "/");
4517835Sralph 		strcat(full, file);
4613644Ssam 		strcpy(file, full);
4713644Ssam 		if (Wrkdir[0] == '\0')
4817835Sralph 			return FAIL;
4913644Ssam 		else if (p != NULL)
5017835Sralph 			return 1;
5117835Sralph 		return 0;
5213644Ssam 	}
5313644Ssam }
5413644Ssam 
5513644Ssam 
5618620Sralph /*
5718620Sralph  *	check if directory name
5813644Ssam  *
5913644Ssam  *	return codes:  0 - not directory  |  1 - is directory
6013644Ssam  */
6113644Ssam 
6213644Ssam isdir(name)
6313644Ssam char *name;
6413644Ssam {
6513644Ssam 	register int ret;
6613644Ssam 	struct stat s;
6713644Ssam 
6813644Ssam 	ret = stat(subfile(name), &s);
6913644Ssam 	if (ret < 0)
7017835Sralph 		return 0;
7113644Ssam 	if ((s.st_mode & S_IFMT) == S_IFDIR)
7217835Sralph 		return 1;
7317835Sralph 	return 0;
7413644Ssam }
7513644Ssam 
7613644Ssam 
7718620Sralph /*
7818620Sralph  *	make all necessary directories
7913644Ssam  *
8018620Sralph  *	return SUCCESS  |  FAIL
8113644Ssam  */
8213644Ssam 
8313644Ssam mkdirs(name)
8413644Ssam char *name;
8513644Ssam {
8613644Ssam 	int ret, mask;
8718620Sralph 	char dir[MAXFULLNAME];
8813644Ssam 	register char *p;
8913644Ssam 
9013644Ssam 	for (p = dir + 1;; p++) {
9113644Ssam 		strcpy(dir, name);
9213644Ssam 		if ((p = index(p, '/')) == NULL)
9318620Sralph 			return SUCCESS;
9413644Ssam 		*p = '\0';
9513644Ssam 		if (isdir(dir))
9613644Ssam 			continue;
9713644Ssam 
9813644Ssam 		DEBUG(4, "mkdir - %s\n", dir);
9913644Ssam 		mask = umask(0);
10018620Sralph 		ret = mkdir(dir, 0777);
10113644Ssam 		umask(mask);
10213644Ssam 		if (ret != 0)
10317835Sralph 			return FAIL;
10413644Ssam 	}
10517835Sralph 	/* NOTREACHED */
10613644Ssam }
10713644Ssam 
10818620Sralph /*
10918620Sralph  *	expfile and check return
11013644Ssam  *		print error if it failed.
11113644Ssam  *
11218620Sralph  *	return code - SUCCESS - ok; FAIL if expfile failed
11313644Ssam  */
11413644Ssam 
11513644Ssam ckexpf(file)
11613644Ssam register char *file;
11713644Ssam {
11813644Ssam 
11913644Ssam 	if (expfile(file) != FAIL)
12018620Sralph 		return SUCCESS;
12113644Ssam 
12213644Ssam 	/*  could not expand file name */
12313644Ssam 	/* the gwd routine failed */
12413644Ssam 
12517835Sralph 	logent("CAN'T EXPAND FILENAME - PWD FAILED", file+1);
12617835Sralph 	return FAIL;
12713644Ssam }
128