|
|
1.1 ! root 1: /* chkpth 2.2 5/21/79 13:20:43 */ ! 2: #include "uucp.h" ! 3: #include <sys/types.h> ! 4: #include <sys/stat.h> ! 5: ! 6: static char SiD[] = "@(#)chkpth 2.2"; ! 7: ! 8: ! 9: #define DFLTNAME "default" ! 10: #define MAXUSERS 20 ! 11: struct userpath { ! 12: char *us_lname; ! 13: char *us_mname; ! 14: char us_callback; ! 15: char **us_path; ! 16: }; ! 17: struct userpath Upt[15]; ! 18: struct userpath *Mchdef = NULL, *Logdef = NULL; ! 19: int Nbrusers = 0; ! 20: int Uptfirst = 1; ! 21: ! 22: /******* ! 23: * chkpth(logname, mchname, path) ! 24: * char *path, *logname, *mchname; ! 25: * ! 26: * chkpth - this routine will check the path table for the ! 27: * machine or log name (non-null parameter) to see if the ! 28: * input path (path) ! 29: * starts with an acceptable prefix. ! 30: * ! 31: * return codes: 0 | FAIL ! 32: */ ! 33: ! 34: chkpth(logname, mchname, path) ! 35: char *path, *logname, *mchname; ! 36: { ! 37: struct userpath *u; ! 38: extern char *lastpart(); ! 39: char **p, *s; ! 40: char c; ! 41: int ret, i; ! 42: ! 43: if (Uptfirst) { ! 44: ret = rdpth(Upt); ! 45: ASSERT(ret == 0, "INIT USERFILE %d", Nbrusers); ! 46: Uptfirst = 0; ! 47: } ! 48: for (u = Upt, i = 0; i < Nbrusers; i++, u++) { ! 49: if (*logname != '\0' && strcmp(logname, u->us_lname) == SAME) ! 50: break; ! 51: if (*mchname != '\0' && strcmp(mchname, u->us_mname) == SAME) ! 52: break; ! 53: ! 54: } ! 55: if (i >= Nbrusers) { ! 56: if (*logname == '\0') ! 57: u = Mchdef; ! 58: else ! 59: u = Logdef; ! 60: if (u == NULL) ! 61: return(FAIL); ! 62: } ! 63: /* found user name */ ! 64: p = u->us_path; ! 65: /* check for /../ in path name */ ! 66: for (s = path; *s != '\0'; s++) { ! 67: if (*s == '/' && prefix("../", (++s))) ! 68: return(FAIL); ! 69: } ! 70: ! 71: for (p = u->us_path; *p != NULL; p++) ! 72: if (prefix(*p, path)) ! 73: return(0); ! 74: ! 75: if (prefix(Spool, path)) { ! 76: if ((c = *lastpart(path)) == DATAPRE ! 77: || c == XQTPRE) ! 78: return(0); ! 79: } ! 80: /* path name not valid */ ! 81: return(FAIL); ! 82: } ! 83: ! 84: ! 85: /*** ! 86: * rdpth(u) ! 87: * struct userpath *u; ! 88: * ! 89: * rdpth - this routine will read the USFILE and ! 90: * construct the userpath structure pointed to by (u); ! 91: * ! 92: * return codes: 0 | FAIL ! 93: */ ! 94: ! 95: rdpth(u) ! 96: struct userpath *u; ! 97: { ! 98: char buf[BUFSIZ + 1], *pbuf[BUFSIZ + 1], *pc, **cp; ! 99: extern char *calloc(), *index(); ! 100: FILE *uf; ! 101: ! 102: if ((uf = fopen(USERFILE, "r")) == NULL) { ! 103: /* can not open file */ ! 104: return(FAIL); ! 105: } ! 106: ! 107: while (fgets(buf, BUFSIZ, uf) != NULL) { ! 108: int nargs, i; ! 109: if (++Nbrusers > MAXUSERS) { ! 110: fclose(uf); ! 111: return(FAIL); ! 112: } ! 113: if ((pc = calloc(strlen(buf) + 1, sizeof (char))) ! 114: == NULL) { ! 115: /* can not allocate space */ ! 116: fclose(uf); ! 117: return(FAIL); ! 118: } ! 119: ! 120: strcpy(pc, buf); ! 121: nargs = getargs(pc, pbuf); ! 122: u->us_lname = pbuf[0]; ! 123: pc = index(u->us_lname, ','); ! 124: if (pc != NULL) ! 125: *pc++ = '\0'; ! 126: else ! 127: pc = u + strlen(u->us_lname); ! 128: u->us_mname = pc; ! 129: if (*u->us_lname == '\0' && Logdef == NULL) ! 130: Logdef = u; ! 131: else if (*u->us_mname == '\0' && Mchdef == NULL) ! 132: Mchdef = u; ! 133: i = 1; ! 134: if (strcmp(pbuf[1], "c") == SAME) { ! 135: u->us_callback = 1; ! 136: i++; ! 137: } ! 138: else ! 139: u->us_callback = 0; ! 140: if ((cp = u->us_path = ! 141: calloc(nargs - i + 1, sizeof (char *))) == NULL) { ! 142: /* can not allocate space */ ! 143: fclose(uf); ! 144: return(FAIL); ! 145: } ! 146: ! 147: while (i < nargs) ! 148: *cp++ = pbuf[i++]; ! 149: *cp = NULL; ! 150: u++; ! 151: } ! 152: ! 153: fclose(uf); ! 154: return(0); ! 155: } ! 156: ! 157: ! 158: /*** ! 159: * callback(name) check for callback ! 160: * char *name; ! 161: * ! 162: * return codes: ! 163: * 0 - no call back ! 164: * 1 - call back ! 165: */ ! 166: ! 167: callback(name) ! 168: char *name; ! 169: { ! 170: struct userpath *u; ! 171: int ret, i; ! 172: ! 173: if (Uptfirst) { ! 174: ret = rdpth(Upt); ! 175: ASSERT(ret == 0, "INIT USERFILE %d", Nbrusers); ! 176: Uptfirst = 0; ! 177: } ! 178: ! 179: for (u = Upt, i = 0; i < Nbrusers; u++, i++) { ! 180: if (strcmp(u->us_lname, name) != SAME) ! 181: continue; ! 182: ! 183: /* found user name */ ! 184: return(u->us_callback); ! 185: } ! 186: ! 187: /* userid not found */ ! 188: return(0); ! 189: } ! 190: ! 191: ! 192: /*** ! 193: * chkperm(file, user, mopt) check write permission of file ! 194: * char *file, *user; ! 195: * char *mopt; none NULL - create directories ! 196: * ! 197: * if mopt != NULL and permissions are ok, ! 198: * a side effect of this routine is to make ! 199: * directories up to the last part of the ! 200: * filename (if they do not exist). ! 201: * ! 202: * return 0 | FAIL ! 203: */ ! 204: ! 205: chkperm(file, user, mopt) ! 206: char *file, *user, *mopt; ! 207: { ! 208: struct stat s; ! 209: int ret; ! 210: char dir[MAXFULLNAME]; ! 211: extern char *lastpart(); ! 212: ! 213: if (stat(file, &s) != -1) ! 214: return(0); ! 215: ! 216: strcpy(dir, file); ! 217: *lastpart(dir) = '\0'; ! 218: if ((ret = stat(dir, &s)) == -1 ! 219: && mopt == NULL) ! 220: return(FAIL); ! 221: ! 222: if (ret != -1) { ! 223: if ((s.st_mode & ANYWRITE) == 0) ! 224: return(FAIL); ! 225: else ! 226: return(0); ! 227: } ! 228: ! 229: /* make directories */ ! 230: return(mkdirs(file)); ! 231: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.