1*9808Ssam /* getservent.c 4.4 82/12/17 */ 27901Ssam 37901Ssam #include <stdio.h> 4*9808Ssam #include <sys/types.h> 57901Ssam #include <sys/socket.h> 67901Ssam #include <netdb.h> 77901Ssam #include <ctype.h> 87901Ssam 97901Ssam #define MAXALIASES 35 107901Ssam 11*9808Ssam 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'; 65*9808Ssam 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"); 699190Ssam if (cp != NULL) { 707901Ssam *cp++ = '\0'; 719190Ssam while (*cp) { 729190Ssam if (*cp == ' ' || *cp == '\t') { 739190Ssam cp++; 749190Ssam continue; 759190Ssam } 769190Ssam if (q < &serv_aliases[MAXALIASES - 1]) 779190Ssam *q++ = cp; 789190Ssam cp = any(cp, " \t"); 799190Ssam if (*cp != NULL) 809190Ssam *cp++ = '\0'; 817901Ssam } 827901Ssam } 837901Ssam *q = NULL; 847901Ssam return (&serv); 857901Ssam } 867901Ssam 877901Ssam static char * 887901Ssam any(cp, match) 897901Ssam register char *cp; 907901Ssam char *match; 917901Ssam { 927901Ssam register char *mp, c; 937901Ssam 947901Ssam while (c = *cp) { 957901Ssam for (mp = match; *mp; mp++) 967901Ssam if (*mp == c) 977901Ssam return (cp); 987901Ssam cp++; 997901Ssam } 1007901Ssam return ((char *)0); 1017901Ssam } 102