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