1*7901Ssam /* getservent.c 4.1 82/08/25 */ 2*7901Ssam 3*7901Ssam #include <stdio.h> 4*7901Ssam #include <sys/socket.h> 5*7901Ssam #include <netdb.h> 6*7901Ssam #include <ctype.h> 7*7901Ssam 8*7901Ssam #define MAXALIASES 35 9*7901Ssam 10*7901Ssam static char SERVDB[] = "/usr/lib/services"; 11*7901Ssam static FILE *servf = NULL; 12*7901Ssam static char line[BUFSIZ+1]; 13*7901Ssam static struct servent serv; 14*7901Ssam static char *serv_aliases[MAXALIASES]; 15*7901Ssam static int stayopen = 0; 16*7901Ssam static unsigned long value(); 17*7901Ssam static char *any(); 18*7901Ssam 19*7901Ssam setservent(f) 20*7901Ssam int f; 21*7901Ssam { 22*7901Ssam if (servf == NULL) 23*7901Ssam servf = fopen(SERVDB, "r" ); 24*7901Ssam else 25*7901Ssam rewind(servf); 26*7901Ssam stayopen |= f; 27*7901Ssam } 28*7901Ssam 29*7901Ssam endservent() 30*7901Ssam { 31*7901Ssam if (servf && !stayopen) { 32*7901Ssam fclose(servf); 33*7901Ssam servf = NULL; 34*7901Ssam } 35*7901Ssam } 36*7901Ssam 37*7901Ssam struct servent * 38*7901Ssam getservent() 39*7901Ssam { 40*7901Ssam char *p; 41*7901Ssam register char *cp, **q; 42*7901Ssam 43*7901Ssam if (servf == NULL && (servf = fopen(SERVDB, "r" )) == NULL) 44*7901Ssam return (NULL); 45*7901Ssam again: 46*7901Ssam if ((p = fgets(line, BUFSIZ, servf)) == NULL) 47*7901Ssam return (NULL); 48*7901Ssam if (*p == '#') 49*7901Ssam goto again; 50*7901Ssam cp = any(p, "#\n"); 51*7901Ssam if (cp == NULL) 52*7901Ssam goto again; 53*7901Ssam *cp = '\0'; 54*7901Ssam serv.s_name = p; 55*7901Ssam p = any(p, " \t"); 56*7901Ssam if (p == NULL) 57*7901Ssam goto again; 58*7901Ssam *p++ = '\0'; 59*7901Ssam while (*p == ' ' || *p == '\t') 60*7901Ssam p++; 61*7901Ssam cp = any(p, ",/"); 62*7901Ssam if (cp == NULL) 63*7901Ssam goto again; 64*7901Ssam *cp++ = '\0'; 65*7901Ssam serv.s_port = atoi(p); 66*7901Ssam serv.s_proto = cp; 67*7901Ssam cp = any(cp, " \t"); 68*7901Ssam if (cp != NULL) 69*7901Ssam *cp++ = '\0'; 70*7901Ssam serv.s_aliases = serv_aliases; 71*7901Ssam q = serv_aliases; 72*7901Ssam while (*cp) { 73*7901Ssam if (*cp == ' ' || *cp == '\t') { 74*7901Ssam cp++; 75*7901Ssam continue; 76*7901Ssam } 77*7901Ssam if (q < &serv_aliases[MAXALIASES - 1]) 78*7901Ssam *q++ = cp; 79*7901Ssam cp = any(cp, " \t"); 80*7901Ssam if (*cp != NULL) 81*7901Ssam *cp++ = '\0'; 82*7901Ssam } 83*7901Ssam *q = NULL; 84*7901Ssam return (&serv); 85*7901Ssam } 86*7901Ssam 87*7901Ssam static char * 88*7901Ssam any(cp, match) 89*7901Ssam register char *cp; 90*7901Ssam char *match; 91*7901Ssam { 92*7901Ssam register char *mp, c; 93*7901Ssam 94*7901Ssam while (c = *cp) { 95*7901Ssam for (mp = match; *mp; mp++) 96*7901Ssam if (*mp == c) 97*7901Ssam return (cp); 98*7901Ssam cp++; 99*7901Ssam } 100*7901Ssam return ((char *)0); 101*7901Ssam } 102