diff options
Diffstat (limited to 'nss/nss_files')
-rw-r--r-- | nss/nss_files/files-XXX.c | 221 | ||||
-rw-r--r-- | nss/nss_files/files-grp.c | 49 | ||||
-rw-r--r-- | nss/nss_files/files-hosts.c | 111 | ||||
-rw-r--r-- | nss/nss_files/files-network.c | 54 | ||||
-rw-r--r-- | nss/nss_files/files-parse.c | 171 | ||||
-rw-r--r-- | nss/nss_files/files-proto.c | 48 | ||||
-rw-r--r-- | nss/nss_files/files-pwd.c | 54 | ||||
-rw-r--r-- | nss/nss_files/files-rpc.c | 48 | ||||
-rw-r--r-- | nss/nss_files/files-service.c | 51 |
9 files changed, 807 insertions, 0 deletions
diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c new file mode 100644 index 0000000000..40bb7df81e --- /dev/null +++ b/nss/nss_files/files-XXX.c @@ -0,0 +1,221 @@ +/* Common code for file-based databases in nss_files module. +Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <stdio.h> +#include <ctype.h> +#include <assert.h> +#include <libc-lock.h> +#include "nsswitch.h" + +/* These symbols are defined by the including source file: + + ENTNAME -- database name of the structure and functions (hostent, pwent). + STRUCTURE -- struct name, define only if not ENTNAME (passwd, group). + DATAFILE -- string of the database file's name. + + NEED_H_ERRNO - defined iff an arg `int *herrnop' is used. + MIDLINE_COMMENTS - defined iff # before \n terminates a database line. +*/ + +#define ENTNAME_r CONCAT(ENTNAME,_r) + +#ifdef NEED_H_ERRNO +#define H_ERRNO_PROTO , int *herrnop +#define H_ERRNO_ARG , herrnop +#define H_ERRNO_SET(val) (*herrnop = (val)) +#else +#define H_ERRNO_PROTO +#define H_ERRNO_ARG +#define H_ERRNO_SET(val) ((void) 0) +#endif + +/* Locks the static variables in this file. */ +__libc_lock_define_initialized (static, lock); + +/* Maintenance of the shared stream open on the database file. */ + +static FILE *stream; +static int keep_stream; + +/* Open database file if not already opened. */ +static int +internal_setent (int stayopen) +{ + int status = NSS_STATUS_SUCCESS; + + if (stream == NULL) + { + stream = fopen (DATAFILE, "r"); + + if (stream == NULL) + status = NSS_STATUS_UNAVAIL; + } + else + rewind (stream); + + /* Remember STAYOPEN flag. */ + if (stream != NULL) + keep_stream |= stayopen; + + return status; +} + + +/* Thread-safe, exported version of that. */ +int +CONCAT(_nss_files_set,ENTNAME) (int stayopen) +{ + int status; + + __libc_lock_lock (lock); + + status = internal_setent (stayopen); + + __libc_lock_unlock (lock); + + return status; +} + + +/* Close the database file. */ +static void +internal_endent (void) +{ + if (stream != NULL) + { + fclose (stream); + stream = NULL; + } + + /* Reset STAYOPEN flag. */ + keep_stream = 0; +} + + +/* Thread-safe, exported version of that. */ +int +CONCAT(_nss_files_end,ENTNAME) (void) +{ + __libc_lock_lock (lock); + + internal_endent (); + + __libc_lock_unlock (lock); + + return NSS_STATUS_SUCCESS; +} + +/* Parsing the database file into `struct STRUCTURE' data structures. */ + +static enum nss_status +internal_getent (struct STRUCTURE *result, + char *buffer, int buflen H_ERRNO_PROTO) +{ + char *p; + struct parser_data *data = (void *) buffer; + int linebuflen = buffer + buflen - data->linebuffer; + + /* Someone called internal_setent before calling us, so if the + stream is not open now the file could not be opened. */ + if (stream == NULL) + { + H_ERRNO_SET (NETDB_INTERNAL); + return NSS_STATUS_UNAVAIL; + } + + if (buflen < sizeof *data + 1) + { + errno = ERANGE; + return NSS_STATUS_NOTFOUND; + } + + do + { + p = fgets (data->linebuffer, linebuflen, stream); + if (p == NULL) + { + /* End of file or read error. */ + H_ERRNO_SET (HOST_NOT_FOUND); + return NSS_STATUS_NOTFOUND; + } + + /* Skip leading blanks. */ + while (isspace (*p)) + ++p; + } while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */ + /* Parse the line. If it is invalid, loop to + get the next line of the file to parse. */ + ! parse_line (p, result, data, buflen)); + + /* Filled in RESULT with the next entry from the database file. */ + return NSS_STATUS_SUCCESS; +} + + +/* Return the next entry from the database file, doing locking. */ +int +CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result, + char *buffer, int buflen H_ERRNO_PROTO) +{ + /* Return next entry in host file. */ + int status; + + __libc_lock_lock (lock); + + status = internal_getent (result, buffer, buflen H_ERRNO_ARG); + + __libc_lock_unlock (lock); + + return status; +} + +/* Macro for defining lookup functions for this file-based database. + + NAME is the name of the lookup; e.g. `hostbyname'. + + PROTO describes the arguments for the lookup key; + e.g. `const char *hostname'. + + BREAK_IF_MATCH is a block of code which compares `struct STRUCTURE *result' + to the lookup key arguments and does `break;' if they match. */ + +#define DB_LOOKUP(name, break_if_match, proto...) \ +enum nss_status \ +_nss_files_get##name##_r (proto, \ + struct STRUCTURE *result, \ + char *buffer, int buflen H_ERRNO_PROTO) \ +{ \ + enum nss_status status; \ + \ + __libc_lock_lock (lock); \ + \ + /* Reset file pointer to beginning or open file. */ \ + internal_setent (keep_stream); \ + \ + while ((status = internal_getent (result, buffer, buflen H_ERRNO_ARG)) \ + == NSS_STATUS_SUCCESS) \ + { break_if_match } \ + \ + if (! keep_stream) \ + internal_endent (); \ + \ + __libc_lock_unlock (lock); \ + \ + return status; \ +} diff --git a/nss/nss_files/files-grp.c b/nss/nss_files/files-grp.c new file mode 100644 index 0000000000..6d528a6df2 --- /dev/null +++ b/nss/nss_files/files-grp.c @@ -0,0 +1,49 @@ +/* Group file parser in nss_files module. +Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <grp.h> + +#define STRUCTURE group +#define ENTNAME grent +#define DATAFILE "/etc/group" +struct grent_data {}; + +#define TRAILING_LIST_MEMBER gr_mem +#define TRAILING_LIST_SEPARATOR_P(c) ((c) == ',') +#include "files-parse.c" +LINE_PARSER +( + STRING_FIELD (result->gr_name, ISCOLON, 0); + STRING_FIELD (result->gr_passwd, ISCOLON, 0); + INT_FIELD (result->gr_gid, ISCOLON, 0, 10,); +) + +#include "files-XXX.c" + +DB_LOOKUP (grnam, + { + if (! strcmp (name, result->gr_name)) + break; + }, const char *name) + +DB_LOOKUP (grgid, + { + if (result->gr_gid == gid) + break; + }, gid_t gid) diff --git a/nss/nss_files/files-hosts.c b/nss/nss_files/files-hosts.c new file mode 100644 index 0000000000..dad818c941 --- /dev/null +++ b/nss/nss_files/files-hosts.c @@ -0,0 +1,111 @@ +/* Hosts file parser in nss_files module. +Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <netinet/in.h> +#include <arpa/inet.h> +#include <arpa/nameser.h> +#include <netdb.h> +#include <resolv.h> + + +/* Get implementation for some internal functions. */ +#include "../resolv/mapv4v6addr.h" +#include "../resolv/mapv4v6hostent.h" + + +#define ENTNAME hostent +#define DATAFILE _PATH_HOSTS + +struct hostent_data + { + unsigned char host_addr[16]; /* IPv4 or IPv6 address. */ + char *h_addr_ptrs[2]; /* Points to that and null terminator. */ + }; + +#define TRAILING_LIST_MEMBER h_aliases +#define TRAILING_LIST_SEPARATOR_P isspace +#include "files-parse.c" +LINE_PARSER +({ + char *addr; + + STRING_FIELD (addr, isspace, 1); + + /* Parse address. */ + if ((_res.options & RES_USE_INET6) + && inet_pton (AF_INET6, addr, entdata->host_addr) > 0) + { + result->h_addrtype = AF_INET6; + result->h_length = IN6ADDRSZ; + } + else if (inet_pton (AF_INET, addr, entdata->host_addr) > 0) + { + if (_res.options & RES_USE_INET6) + { + map_v4v6_address ((char *) entdata->host_addr, + (char *) entdata->host_addr); + result->h_addrtype = AF_INET6; + result->h_length = IN6ADDRSZ; + } + else + { + result->h_addrtype = AF_INET; + result->h_length = INADDRSZ; + } + } + else + /* Illegal address: ignore line. */ + return 0; + + /* Store a pointer to the addressin the expected form. */ + entdata->h_addr_ptrs[0] = entdata->host_addr; + entdata->h_addr_ptrs[1] = NULL; + result->h_addr_list = entdata->h_addr_ptrs; + + /* If we need the host entry in IPv6 form change it now. */ + if (_res.options & RES_USE_INET6) + { + char *bufptr = data->linebuffer; + int buflen = (char *) data + datalen - bufptr; + map_v4v6_hostent (result, &bufptr, &buflen); + } + + STRING_FIELD (result->h_name, isspace, 1); +}) + +#include "files-XXX.c" + +DB_LOOKUP (hostbyname, + { + char **ap; + if (! strcmp (name, result->h_name)) + break; + for (ap = result->h_aliases; *ap; ++ap) + if (! strcmp (name, *ap)) + break; + if (*ap) + break; + }, const char *name) + +DB_LOOKUP (hostbyaddr, + { + if (result->h_addrtype == type && result->h_length == len && + ! memcmp (addr, result->h_addr_list[0], len)) + break; + }, const char *addr, int len, int type) diff --git a/nss/nss_files/files-network.c b/nss/nss_files/files-network.c new file mode 100644 index 0000000000..504c420b04 --- /dev/null +++ b/nss/nss_files/files-network.c @@ -0,0 +1,54 @@ +/* Networks file parser in nss_files module. +Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <netinet/in.h> +#include <arpa/inet.h> +#include <netdb.h> + +#define ENTNAME netent +#define DATAFILE _PATH_NETWORKS + +struct netent_data {}; + +#define TRAILING_LIST_MEMBER n_aliases +#define TRAILING_LIST_SEPARATOR_P isspace +#include "files-parse.c" +LINE_PARSER +({ + char *addr; + + STRING_FIELD (result->n_name, isspace, 1); + + STRING_FIELD (addr, isspace, 1); + result->n_net = inet_network (addr); + +}) + +#include "files-XXX.c" + +DB_LOOKUP (netbyname, + LOOKUP_NAME (n_name, n_aliases), + const char *name) + +DB_LOOKUP (netbyaddr, + { + if (result->n_addrtype == type && result->n_net == net) + /* Bingo! */ + break; + }, int type, unsigned long int net) diff --git a/nss/nss_files/files-parse.c b/nss/nss_files/files-parse.c new file mode 100644 index 0000000000..a93bee1ab3 --- /dev/null +++ b/nss/nss_files/files-parse.c @@ -0,0 +1,171 @@ +/* Common code for file-based database parsers in nss_files module. +Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <ctype.h> +#include <errno.h> +#include <string.h> +#include <stdlib.h> + + +#define CONCAT(a,b) CONCAT1(a,b) +#define CONCAT1(a,b) a##b + +#ifndef STRUCTURE +#define STRUCTURE ENTNAME +#endif + + +struct parser_data + { + struct CONCAT(ENTNAME,_data) entdata; + char linebuffer[0]; + }; + +#define LINE_PARSER(BODY) \ +static inline int \ +parse_line (char *line, struct STRUCTURE *result, \ + struct parser_data *data, int datalen) \ +{ \ + struct CONCAT(ENTNAME,_data) *const entdata __attribute__ ((unused)) \ + = &data->entdata; \ + BODY; \ + TRAILING_LIST_PARSER; \ + return 1; \ +} + + +/* Comments can come mid-line; trim the line at the first # seen. */ +#define MIDLINE_COMMENTS \ + { \ + char *p = strchr (line, '#'); \ + if (p) \ + *p = '\0'; \ + } + +#define STRING_FIELD(variable, terminator_p, swallow) \ + { \ + variable = line; \ + while (!terminator_p (*line)) \ + if (*++line == '\0') \ + return 0; \ + *line = '\0'; \ + do \ + ++line; \ + while (swallow && terminator_p (*line)); \ + } + +#define INT_FIELD(variable, terminator_p, swallow, base, convert) \ + { \ + char *endp; \ + variable = convert (strtol (line, &endp, base)); \ + if (endp == line) \ + return 0; \ + else if (terminator_p (*endp)) \ + do \ + ++endp; \ + while (swallow && terminator_p (*endp)); \ + else if (*endp != '\0') \ + return 0; \ + line = endp; \ + } + +#define ISCOLON(c) ((c) == ':') + + +#ifndef TRAILING_LIST_MEMBER +#define TRAILING_LIST_PARSER /* Nothing to do. */ +#else + +#define TRAILING_LIST_PARSER \ +{ \ + char **list = parse_list (line, data, datalen); \ + if (list) \ + result->TRAILING_LIST_MEMBER = list; \ + else \ + return 0; \ +} + +static inline char ** +parse_list (char *line, struct parser_data *data, int datalen) +{ + char *eol, **list, **p; + + /* Find the end of the line buffer. */ + eol = strchr (line, '\0'); + /* Adjust the pointer so it is aligned for storing pointers. */ + eol += (eol - (char *) 0) % __alignof__ (char *); + /* We will start the storage here for the vector of pointers. */ + list = (char **) eol; + + p = list; + while (1) + { + char *elt; + + if ((char *) &p[1] - (char *) data > datalen) + { + /* We cannot fit another pointer in the buffer. */ + errno = ERANGE; + return NULL; + } + if (*line == '\0') + break; + + elt = line; + while (1) + { + if (TRAILING_LIST_SEPARATOR_P (*line)) + { + *p++ = elt; + *line = '\0'; + do + ++line; + while (TRAILING_LIST_SEPARATOR_P (*line)); + } + else if (*line == '\0' || *line == '\n') + { + /* End of the line. */ + if (line > elt) + /* Last element. */ + *p++ = elt; + *line = '\0'; + break; + } + else + ++line; + } + } + *p = NULL; + + return list; +} + +#define LOOKUP_NAME(nameelt, aliaselt) \ +{ \ + char **ap; \ + if (! strcmp (name, result->nameelt)) \ + break; \ + for (ap = result->aliaselt; *ap; ++ap) \ + if (! strcmp (name, *ap)) \ + break; \ + if (*ap) \ + break; \ +} + +#endif diff --git a/nss/nss_files/files-proto.c b/nss/nss_files/files-proto.c new file mode 100644 index 0000000000..d67f8db8f6 --- /dev/null +++ b/nss/nss_files/files-proto.c @@ -0,0 +1,48 @@ +/* Protocols file parser in nss_files module. +Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <netdb.h> + + +#define ENTNAME protoent +#define DATAFILE _PATH_PROTOCOLS + +struct protoent_data {}; + +#define TRAILING_LIST_MEMBER p_aliases +#define TRAILING_LIST_SEPARATOR_P isspace +#include "files-parse.c" +LINE_PARSER +( + MIDLINE_COMMENTS; + STRING_FIELD (result->p_name, isspace, 1); + INT_FIELD (result->p_proto, isspace, 1, 10,); + ) + +#include "files-XXX.c" + +DB_LOOKUP (protobyname, + LOOKUP_NAME (p_name, p_aliases), + const char *name) + +DB_LOOKUP (protobynumber, + { + if (result->p_proto == proto) + break; + }, int proto) diff --git a/nss/nss_files/files-pwd.c b/nss/nss_files/files-pwd.c new file mode 100644 index 0000000000..4b6a4b737f --- /dev/null +++ b/nss/nss_files/files-pwd.c @@ -0,0 +1,54 @@ +/* User file parser in nss_files module. +Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <pwd.h> + +#define STRUCTURE passwd +#define ENTNAME pwent +#define DATAFILE "/etc/passwd" +struct pwent_data {}; + +#include "files-parse.c" +LINE_PARSER +({ + STRING_FIELD (result->pw_name, ISCOLON, 0); + STRING_FIELD (result->pw_passwd, ISCOLON, 0); + INT_FIELD (result->pw_uid, ISCOLON, 0, 10,); + INT_FIELD (result->pw_gid, ISCOLON, 0, 10,); + STRING_FIELD (result->pw_gecos, ISCOLON, 0); + STRING_FIELD (result->pw_dir, ISCOLON, 0); + result->pw_shell = line; + line = strchr (line, '\n'); + if (line) + *line = '\0'; +}) + +#include "files-XXX.c" + +DB_LOOKUP (pwnam, + { + if (! strcmp (name, result->pw_name)) + break; + }, const char *name) + +DB_LOOKUP (pwuid, + { + if (result->pw_uid == uid) + break; + }, uid_t uid) diff --git a/nss/nss_files/files-rpc.c b/nss/nss_files/files-rpc.c new file mode 100644 index 0000000000..fef0ff88b1 --- /dev/null +++ b/nss/nss_files/files-rpc.c @@ -0,0 +1,48 @@ +/* SunRPC program number file parser in nss_files module. +Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <rpc/netdb.h> + + +#define ENTNAME rpcent +#define DATAFILE "/etc/rpc" + +struct rpcent_data {}; + +#define TRAILING_LIST_MEMBER r_aliases +#define TRAILING_LIST_SEPARATOR_P isspace +#include "files-parse.c" +LINE_PARSER +( + MIDLINE_COMMENTS; + STRING_FIELD (result->r_name, isspace, 1); + INT_FIELD (result->r_number, isspace, 1, 10,); + ) + +#include "files-XXX.c" + +DB_LOOKUP (rpcbyname, + LOOKUP_NAME (r_name, r_aliases), + const char *name) + +DB_LOOKUP (rpcbynumber, + { + if (result->r_number == number) + break; + }, int number) diff --git a/nss/nss_files/files-service.c b/nss/nss_files/files-service.c new file mode 100644 index 0000000000..3bcb48787a --- /dev/null +++ b/nss/nss_files/files-service.c @@ -0,0 +1,51 @@ +/* Services file parser in nss_files module. +Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <netinet/in.h> +#include <netdb.h> + + +#define ENTNAME servent +#define DATAFILE _PATH_SERVICES + +struct servent_data {}; + +#define TRAILING_LIST_MEMBER s_aliases +#define TRAILING_LIST_SEPARATOR_P isspace +#include "files-parse.c" +#define ISSLASH(c) ((c) == '/') +LINE_PARSER +( + MIDLINE_COMMENTS; + STRING_FIELD (result->s_name, isspace, 1); + INT_FIELD (result->s_port, ISSLASH, 10, 0, htons); + STRING_FIELD (result->s_proto, isspace, 1); + ) + +#include "files-XXX.c" + +DB_LOOKUP (servbyname, + LOOKUP_NAME (s_name, s_aliases), + const char *name) + +DB_LOOKUP (servbyport, + { + if (result->s_port == port) + break; + }, int port) |