| /* |
| * Copyright (c) 1983 Regents of the University of California. |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms are permitted |
| * provided that the above copyright notice and this paragraph are |
| * duplicated in all such forms and that any documentation, |
| * advertising materials, and other materials related to such |
| * distribution and use acknowledge that the software was developed |
| * by the University of California, Berkeley. The name of the |
| * University may not be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR |
| * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED |
| * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
| */ |
| |
| #if defined(LIBC_SCCS) && !defined(lint) |
| static char sccsid[] = "@(#)getnetent.c 5.5 (Berkeley) 6/27/88"; |
| #endif /* LIBC_SCCS and not lint */ |
| |
| #include "inetprivate.h" |
| |
| #define MAXALIASES 35 |
| |
| static char NETDB[] = _PATH_NETWORKS; |
| static FILE *netf = NULL; |
| static char line[BUFSIZ+1]; |
| static struct netent net; |
| static char *net_aliases[MAXALIASES]; |
| static char *any(char *, char *); |
| |
| int _net_stayopen; |
| extern u_int32_t inet_network(const char *cp); |
| |
| void |
| setnetent(f) |
| int f; |
| { |
| if (netf == NULL) |
| netf = fopen(NETDB, "r" ); |
| else |
| rewind(netf); |
| _net_stayopen |= f; |
| } |
| |
| void |
| endnetent() |
| { |
| if (netf) { |
| fclose(netf); |
| netf = NULL; |
| } |
| _net_stayopen = 0; |
| } |
| |
| struct netent * |
| getnetent() |
| { |
| char *p; |
| register char *cp, **q; |
| |
| if (netf == NULL && (netf = fopen(NETDB, "r" )) == NULL) |
| return (NULL); |
| again: |
| p = fgets(line, BUFSIZ, netf); |
| if (p == NULL) |
| return (NULL); |
| if (*p == '#') |
| goto again; |
| cp = any(p, "#\n"); |
| if (cp == NULL) |
| goto again; |
| *cp = '\0'; |
| net.n_name = p; |
| cp = any(p, " \t"); |
| if (cp == NULL) |
| goto again; |
| *cp++ = '\0'; |
| while (*cp == ' ' || *cp == '\t') |
| cp++; |
| p = any(cp, " \t"); |
| if (p != NULL) |
| *p++ = '\0'; |
| net.n_net = inet_network(cp); |
| net.n_addrtype = AF_INET; |
| q = net.n_aliases = net_aliases; |
| if (p != NULL) |
| cp = p; |
| while (cp && *cp) { |
| if (*cp == ' ' || *cp == '\t') { |
| cp++; |
| continue; |
| } |
| if (q < &net_aliases[MAXALIASES - 1]) |
| *q++ = cp; |
| cp = any(cp, " \t"); |
| if (cp != NULL) |
| *cp++ = '\0'; |
| } |
| *q = NULL; |
| return (&net); |
| } |
| |
| static char * |
| any(cp, match) |
| register char *cp; |
| char *match; |
| { |
| register char *mp, c; |
| |
| while (c = *cp) { |
| for (mp = match; *mp; mp++) |
| if (*mp == c) |
| return (cp); |
| cp++; |
| } |
| return ((char *)0); |
| } |