1 /* 2 * Copyright (c) 1983, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 */ 7 8 #if defined(LIBC_SCCS) && !defined(lint) 9 static char sccsid[] = "@(#)getservent.c 8.1 (Berkeley) 06/04/93"; 10 #endif /* LIBC_SCCS and not lint */ 11 12 #include <sys/types.h> 13 #include <sys/socket.h> 14 #include <netdb.h> 15 #include <stdio.h> 16 #include <string.h> 17 #include <stdlib.h> 18 19 #define MAXALIASES 35 20 21 static FILE *servf = NULL; 22 static char line[BUFSIZ+1]; 23 static struct servent serv; 24 static char *serv_aliases[MAXALIASES]; 25 int _serv_stayopen; 26 27 void 28 setservent(f) 29 int f; 30 { 31 if (servf == NULL) 32 servf = fopen(_PATH_SERVICES, "r" ); 33 else 34 rewind(servf); 35 _serv_stayopen |= f; 36 } 37 38 void 39 endservent() 40 { 41 if (servf) { 42 fclose(servf); 43 servf = NULL; 44 } 45 _serv_stayopen = 0; 46 } 47 48 struct servent * 49 getservent() 50 { 51 char *p; 52 register char *cp, **q; 53 54 if (servf == NULL && (servf = fopen(_PATH_SERVICES, "r" )) == NULL) 55 return (NULL); 56 again: 57 if ((p = fgets(line, BUFSIZ, servf)) == NULL) 58 return (NULL); 59 if (*p == '#') 60 goto again; 61 cp = strpbrk(p, "#\n"); 62 if (cp == NULL) 63 goto again; 64 *cp = '\0'; 65 serv.s_name = p; 66 p = strpbrk(p, " \t"); 67 if (p == NULL) 68 goto again; 69 *p++ = '\0'; 70 while (*p == ' ' || *p == '\t') 71 p++; 72 cp = strpbrk(p, ",/"); 73 if (cp == NULL) 74 goto again; 75 *cp++ = '\0'; 76 serv.s_port = htons((u_short)atoi(p)); 77 serv.s_proto = cp; 78 q = serv.s_aliases = serv_aliases; 79 cp = strpbrk(cp, " \t"); 80 if (cp != NULL) 81 *cp++ = '\0'; 82 while (cp && *cp) { 83 if (*cp == ' ' || *cp == '\t') { 84 cp++; 85 continue; 86 } 87 if (q < &serv_aliases[MAXALIASES - 1]) 88 *q++ = cp; 89 cp = strpbrk(cp, " \t"); 90 if (cp != NULL) 91 *cp++ = '\0'; 92 } 93 *q = NULL; 94 return (&serv); 95 } 96