1*10087Ssam /* getservent.c 4.5 83/01/02 */ 27901Ssam 37901Ssam #include <stdio.h> 49808Ssam #include <sys/types.h> 57901Ssam #include <sys/socket.h> 67901Ssam #include <netdb.h> 77901Ssam #include <ctype.h> 87901Ssam 97901Ssam #define MAXALIASES 35 107901Ssam 119808Ssam static char SERVDB[] = "/etc/services"; 127901Ssam static FILE *servf = NULL; 137901Ssam static char line[BUFSIZ+1]; 147901Ssam static struct servent serv; 157901Ssam static char *serv_aliases[MAXALIASES]; 167901Ssam static int stayopen = 0; 177901Ssam static char *any(); 187901Ssam 197901Ssam setservent(f) 207901Ssam int f; 217901Ssam { 227901Ssam if (servf == NULL) 237901Ssam servf = fopen(SERVDB, "r" ); 247901Ssam else 257901Ssam rewind(servf); 267901Ssam stayopen |= f; 277901Ssam } 287901Ssam 297901Ssam endservent() 307901Ssam { 317901Ssam if (servf && !stayopen) { 327901Ssam fclose(servf); 337901Ssam servf = NULL; 347901Ssam } 357901Ssam } 367901Ssam 377901Ssam struct servent * 387901Ssam getservent() 397901Ssam { 407901Ssam char *p; 417901Ssam register char *cp, **q; 427901Ssam 437901Ssam if (servf == NULL && (servf = fopen(SERVDB, "r" )) == NULL) 447901Ssam return (NULL); 457901Ssam again: 467901Ssam if ((p = fgets(line, BUFSIZ, servf)) == NULL) 477901Ssam return (NULL); 487901Ssam if (*p == '#') 497901Ssam goto again; 507901Ssam cp = any(p, "#\n"); 517901Ssam if (cp == NULL) 527901Ssam goto again; 537901Ssam *cp = '\0'; 547901Ssam serv.s_name = p; 557901Ssam p = any(p, " \t"); 567901Ssam if (p == NULL) 577901Ssam goto again; 587901Ssam *p++ = '\0'; 597901Ssam while (*p == ' ' || *p == '\t') 607901Ssam p++; 617901Ssam cp = any(p, ",/"); 627901Ssam if (cp == NULL) 637901Ssam goto again; 647901Ssam *cp++ = '\0'; 659808Ssam serv.s_port = htons((u_short)atoi(p)); 667901Ssam serv.s_proto = cp; 679190Ssam q = serv.s_aliases = serv_aliases; 687901Ssam cp = any(cp, " \t"); 69*10087Ssam if (cp != NULL) 707901Ssam *cp++ = '\0'; 71*10087Ssam while (cp && *cp) { 72*10087Ssam if (*cp == ' ' || *cp == '\t') { 73*10087Ssam cp++; 74*10087Ssam continue; 757901Ssam } 76*10087Ssam if (q < &serv_aliases[MAXALIASES - 1]) 77*10087Ssam *q++ = cp; 78*10087Ssam cp = any(cp, " \t"); 79*10087Ssam if (cp != NULL) 80*10087Ssam *cp++ = '\0'; 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