|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)gnsys.c 5.6 (Berkeley) 4/5/88"; ! 3: #endif ! 4: ! 5: #include "uucp.h" ! 6: #ifdef NDIR ! 7: #include "ndir.h" ! 8: #else ! 9: #include <sys/dir.h> ! 10: #endif ! 11: ! 12: #define LSIZE 512 /* number of systems to store */ ! 13: #define WSUFSIZE 6 /* work file name suffix size */ ! 14: ! 15: /*LINTLIBRARY*/ ! 16: ! 17: /* ! 18: * this routine will return the next system name which has work to be done. ! 19: * "sname" is a string of size DIRSIZ - WSUFSIZE. ! 20: * "pre" is the prefix for work files. ! 21: * "dir" is the directory to search. ! 22: * ! 23: * return codes: ! 24: * 1 - name returned in sname ! 25: * SUCCESS - no more names ! 26: * FAIL - bad directory ! 27: */ ! 28: gnsys(sname, dir, pre) ! 29: char *sname, *dir, pre; ! 30: { ! 31: register DIR *dirp; ! 32: register struct direct *dentp; ! 33: static char *list[LSIZE]; ! 34: static int nitem = 0, n = 0, base = 0; ! 35: char systname[NAMESIZE]; ! 36: ! 37: retry: ! 38: if (nitem == base) { ! 39: /* get list of systems with work */ ! 40: int i; ! 41: dirp = opendir(subdir(dir,pre)); ! 42: if (dirp == NULL) { ! 43: syslog(LOG_ERR, "opendir(%s) failed: %m", ! 44: subdir(dir,pre)); ! 45: cleanup(FAIL); ! 46: } ! 47: for (i = base; i < LSIZE; i++) ! 48: list[i] = NULL; ! 49: while (dentp = readdir(dirp)) { ! 50: register char *s, *p1, *p2; ! 51: if (dentp->d_name[0] != pre || dentp->d_name[1] != '.') ! 52: continue; ! 53: p2 = dentp->d_name + dentp->d_namlen - WSUFSIZE; ! 54: p1 = dentp->d_name + 2; ! 55: for(s = systname; p1 <= p2; p1++) ! 56: *s++ = *p1; ! 57: *s = '\0'; ! 58: if (systname[0] == '\0') ! 59: continue; ! 60: nitem = srchst(systname, list, nitem); ! 61: if (LSIZE <= nitem) { ! 62: syslog(LOG_WARNING, ! 63: "%s: Increase LSIZE in gnsys.c", ! 64: systname); ! 65: break; ! 66: } ! 67: } ! 68: closedir(dirp); ! 69: } ! 70: ! 71: if (nitem == base) { ! 72: for (n = 0; n < nitem; n++) ! 73: if (list[n] != NULL) ! 74: free(list[n]); ! 75: return SUCCESS; ! 76: } ! 77: while (nitem > n) { ! 78: /* We only have at most a SYSNSIZE character site name encoded ! 79: * in the file. However, we would like to use the full sitename ! 80: * if possible. If the number of chars in list[n] is < SYSNSIZE ! 81: * then the sitename could not have been truncated and ! 82: * we don't bother to check. Otherwise, we scan SYSFILE ! 83: * looking for the fullname and return it if we find it ! 84: */ ! 85: strcpy(sname, list[n++]); ! 86: if (strlen(sname) >= SYSNSIZE) { ! 87: register FILE *fp; ! 88: register char *p; ! 89: char line[MAXFULLNAME]; ! 90: fp = fopen(SYSFILE, "r"); ! 91: if (fp == NULL) { ! 92: syslog(LOG_ERR, "fopen(%s) failed: %m", ! 93: SYSFILE); ! 94: cleanup(FAIL); ! 95: } ! 96: while (cfgets(line, sizeof(line), fp) != NULL) { ! 97: p = strpbrk(line, " \t"); ! 98: if (p) ! 99: *p = '\0'; ! 100: if (strncmp(sname, line, SYSNSIZE) == SAME) { ! 101: strncpy(sname, line, MAXBASENAME); ! 102: break; ! 103: } ! 104: } ! 105: fclose(fp); ! 106: } ! 107: if (callok(sname) == 0) ! 108: return 1; ! 109: } ! 110: base = n = nitem; ! 111: goto retry; ! 112: } ! 113: ! 114: /* ! 115: * this routine will do a linear search of list (list) to find name (name). ! 116: * If the name is not found, it is added to the list. ! 117: * The number of items in the list (n) is returned (incremented if a ! 118: * name is added). ! 119: * ! 120: * return codes: ! 121: * n - the number of items in the list ! 122: */ ! 123: srchst(name, list, n) ! 124: char *name; ! 125: register char **list; ! 126: int n; ! 127: { ! 128: register int i; ! 129: register char *p; ! 130: ! 131: for (i = 0; i < n; i++) ! 132: if (strcmp(name, list[i]) == 0) ! 133: break; ! 134: if (i >= n) { ! 135: if ((p = calloc((unsigned)strlen(name) + 1, sizeof (char))) ! 136: == NULL) ! 137: return n; ! 138: strcpy(p, name); ! 139: list[n++] = p; ! 140: } ! 141: return n; ! 142: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.