1*9190Ssam /* getservent.c 4.3 82/11/14 */ 27901Ssam 37901Ssam #include <stdio.h> 47901Ssam #include <sys/socket.h> 57901Ssam #include <netdb.h> 67901Ssam #include <ctype.h> 77901Ssam 87901Ssam #define MAXALIASES 35 97901Ssam 107901Ssam static char SERVDB[] = "/usr/lib/services"; 117901Ssam static FILE *servf = NULL; 127901Ssam static char line[BUFSIZ+1]; 137901Ssam static struct servent serv; 147901Ssam static char *serv_aliases[MAXALIASES]; 157901Ssam static int stayopen = 0; 167901Ssam static char *any(); 177901Ssam 187901Ssam setservent(f) 197901Ssam int f; 207901Ssam { 217901Ssam if (servf == NULL) 227901Ssam servf = fopen(SERVDB, "r" ); 237901Ssam else 247901Ssam rewind(servf); 257901Ssam stayopen |= f; 267901Ssam } 277901Ssam 287901Ssam endservent() 297901Ssam { 307901Ssam if (servf && !stayopen) { 317901Ssam fclose(servf); 327901Ssam servf = NULL; 337901Ssam } 347901Ssam } 357901Ssam 367901Ssam struct servent * 377901Ssam getservent() 387901Ssam { 397901Ssam char *p; 407901Ssam register char *cp, **q; 417901Ssam 427901Ssam if (servf == NULL && (servf = fopen(SERVDB, "r" )) == NULL) 437901Ssam return (NULL); 447901Ssam again: 457901Ssam if ((p = fgets(line, BUFSIZ, servf)) == NULL) 467901Ssam return (NULL); 477901Ssam if (*p == '#') 487901Ssam goto again; 497901Ssam cp = any(p, "#\n"); 507901Ssam if (cp == NULL) 517901Ssam goto again; 527901Ssam *cp = '\0'; 537901Ssam serv.s_name = p; 547901Ssam p = any(p, " \t"); 557901Ssam if (p == NULL) 567901Ssam goto again; 577901Ssam *p++ = '\0'; 587901Ssam while (*p == ' ' || *p == '\t') 597901Ssam p++; 607901Ssam cp = any(p, ",/"); 617901Ssam if (cp == NULL) 627901Ssam goto again; 637901Ssam *cp++ = '\0'; 647901Ssam serv.s_port = atoi(p); 657901Ssam serv.s_proto = cp; 66*9190Ssam q = serv.s_aliases = serv_aliases; 677901Ssam cp = any(cp, " \t"); 68*9190Ssam if (cp != NULL) { 697901Ssam *cp++ = '\0'; 70*9190Ssam while (*cp) { 71*9190Ssam if (*cp == ' ' || *cp == '\t') { 72*9190Ssam cp++; 73*9190Ssam continue; 74*9190Ssam } 75*9190Ssam if (q < &serv_aliases[MAXALIASES - 1]) 76*9190Ssam *q++ = cp; 77*9190Ssam cp = any(cp, " \t"); 78*9190Ssam if (*cp != NULL) 79*9190Ssam *cp++ = '\0'; 807901Ssam } 817901Ssam } 827901Ssam *q = NULL; 837901Ssam return (&serv); 847901Ssam } 857901Ssam 867901Ssam static char * 877901Ssam any(cp, match) 887901Ssam register char *cp; 897901Ssam char *match; 907901Ssam { 917901Ssam register char *mp, c; 927901Ssam 937901Ssam while (c = *cp) { 947901Ssam for (mp = match; *mp; mp++) 957901Ssam if (*mp == c) 967901Ssam return (cp); 977901Ssam cp++; 987901Ssam } 997901Ssam return ((char *)0); 1007901Ssam } 101