|
|
1.1 ! root 1: /* getservent.c 4.5 83/01/02 */ ! 2: ! 3: #include <stdio.h> ! 4: #include <sys/types.h> ! 5: #include <sys/socket.h> ! 6: #include <netdb.h> ! 7: #include <ctype.h> ! 8: ! 9: #define MAXALIASES 35 ! 10: ! 11: static char SERVDB[] = "/etc/services"; ! 12: static FILE *servf = NULL; ! 13: static char line[BUFSIZ+1]; ! 14: static struct servent serv; ! 15: static char *serv_aliases[MAXALIASES]; ! 16: static int stayopen = 0; ! 17: static char *any(); ! 18: ! 19: setservent(f) ! 20: int f; ! 21: { ! 22: if (servf == NULL) ! 23: servf = fopen(SERVDB, "r" ); ! 24: else ! 25: rewind(servf); ! 26: stayopen |= f; ! 27: } ! 28: ! 29: endservent() ! 30: { ! 31: if (servf && !stayopen) { ! 32: fclose(servf); ! 33: servf = NULL; ! 34: } ! 35: } ! 36: ! 37: struct servent * ! 38: getservent() ! 39: { ! 40: char *p; ! 41: register char *cp, **q; ! 42: ! 43: ! 44: if (servf == NULL && (servf = fopen(SERVDB, "r" )) == NULL) ! 45: return (NULL); ! 46: again: ! 47: if ((p = fgets(line, BUFSIZ, servf)) == NULL) ! 48: return (NULL); ! 49: if (*p == '#') ! 50: goto again; ! 51: cp = any(p, "#\n"); ! 52: if (cp == NULL) ! 53: goto again; ! 54: *cp = '\0'; ! 55: serv.s_name = p; ! 56: p = any(p, " \t"); ! 57: if (p == NULL) ! 58: goto again; ! 59: *p++ = '\0'; ! 60: while (*p == ' ' || *p == '\t') ! 61: p++; ! 62: cp = any(p, ",/"); ! 63: if (cp == NULL) ! 64: goto again; ! 65: *cp++ = '\0'; ! 66: serv.s_port = htons((u_short)myatoi(p)); ! 67: serv.s_proto = cp; ! 68: q = serv.s_aliases = serv_aliases; ! 69: cp = any(cp, " \t"); ! 70: if (cp != NULL) ! 71: *cp++ = '\0'; ! 72: while (cp && *cp) { ! 73: if (*cp == ' ' || *cp == '\t') { ! 74: cp++; ! 75: continue; ! 76: } ! 77: if (q < &serv_aliases[MAXALIASES - 1]) ! 78: *q++ = cp; ! 79: cp = any(cp, " \t"); ! 80: if (cp != NULL) ! 81: *cp++ = '\0'; ! 82: } ! 83: *q = NULL; ! 84: return (&serv); ! 85: } ! 86: ! 87: static char * ! 88: any(cp, match) ! 89: register char *cp; ! 90: char *match; ! 91: { ! 92: register char *mp, c; ! 93: ! 94: while (c = *cp) { ! 95: for (mp = match; *mp; mp++) ! 96: if (*mp == c) ! 97: return (cp); ! 98: cp++; ! 99: } ! 100: return ((char *)0); ! 101: } ! 102: ! 103: static int ! 104: myatoi(p) ! 105: register char *p; ! 106: { ! 107: register int n; ! 108: register int f; ! 109: ! 110: n = 0; ! 111: f = 0; ! 112: for(;;p++) { ! 113: switch(*p) { ! 114: case ' ': ! 115: case '\t': ! 116: continue; ! 117: case '-': ! 118: f++; ! 119: case '+': ! 120: p++; ! 121: } ! 122: break; ! 123: } ! 124: while(*p >= '0' && *p <= '9') ! 125: n = n*10 + *p++ - '0'; ! 126: return(f? -n: n); ! 127: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.