1 /*- 2 * Copyright (c) 1985, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * %sccs.include.proprietary.c% 6 */ 7 8 #ifndef lint 9 static char sccsid[] = "@(#)expfile.c 8.1 (Berkeley) 06/06/93"; 10 #endif /* not lint */ 11 12 #include "uucp.h" 13 #include <sys/stat.h> 14 15 /*LINTLIBRARY*/ 16 17 /* 18 * expand file name 19 * 20 * return codes: 0 - Ordinary spool area file 21 * 1 - Other normal file 22 * FAIL - no Wrkdir name available 23 */ 24 25 expfile(file) 26 char *file; 27 { 28 register char *fpart, *p; 29 char user[WKDSIZE], *up; 30 char full[MAXFULLNAME]; 31 int uid; 32 33 switch(file[0]) { 34 case '/': 35 return 1; 36 case '~': 37 for (fpart = file + 1, up = user; *fpart != '\0' 38 && *fpart != '/'; fpart++) 39 *up++ = *fpart; 40 *up = '\0'; 41 if (!*user || gninfo(user, &uid, full) != 0) { 42 strcpy(full, PUBDIR); 43 } 44 45 strcat(full, fpart); 46 strcpy(file, full); 47 return 1; 48 default: 49 p = index(file, '/'); 50 strcpy(full, Wrkdir); 51 strcat(full, "/"); 52 strcat(full, file); 53 strcpy(file, full); 54 if (Wrkdir[0] == '\0') 55 return FAIL; 56 else if (p != NULL) 57 return 1; 58 return 0; 59 } 60 } 61 62 63 /* 64 * check if directory name 65 * 66 * return codes: 0 - not directory | 1 - is directory 67 */ 68 69 isdir(name) 70 char *name; 71 { 72 register int ret; 73 struct stat s; 74 75 ret = stat(subfile(name), &s); 76 if (ret < 0) 77 return 0; 78 if ((s.st_mode & S_IFMT) == S_IFDIR) 79 return 1; 80 return 0; 81 } 82 83 84 /* 85 * make all necessary directories 86 * 87 * return SUCCESS | FAIL 88 */ 89 90 mkdirs(name) 91 char *name; 92 { 93 int ret, mask; 94 char dir[MAXFULLNAME]; 95 register char *p; 96 97 for (p = dir + 1;; p++) { 98 strcpy(dir, name); 99 if ((p = index(p, '/')) == NULL) 100 return SUCCESS; 101 *p = '\0'; 102 if (isdir(dir)) 103 continue; 104 105 DEBUG(4, "mkdir - %s\n", dir); 106 mask = umask(0); 107 ret = mkdir(dir, 0777); 108 umask(mask); 109 if (ret != 0) 110 return FAIL; 111 } 112 /* NOTREACHED */ 113 } 114 115 /* 116 * expfile and check return 117 * print error if it failed. 118 * 119 * return code - SUCCESS - ok; FAIL if expfile failed 120 */ 121 122 ckexpf(file) 123 register char *file; 124 { 125 126 if (expfile(file) != FAIL) 127 return SUCCESS; 128 129 /* could not expand file name */ 130 /* the gwd routine failed */ 131 132 logent("CAN'T EXPAND FILENAME - PWD FAILED", file+1); 133 return FAIL; 134 } 135