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