diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 6 | ||||
-rw-r--r-- | src/files-parse.c | 266 | ||||
-rw-r--r-- | src/generic.c | 24 | ||||
-rw-r--r-- | src/glibc-parse.c | 191 | ||||
-rw-r--r-- | src/group.c | 20 | ||||
-rw-r--r-- | src/passwd.c | 20 | ||||
-rw-r--r-- | src/protocols.c | 26 | ||||
-rw-r--r-- | src/services.c | 29 | ||||
-rw-r--r-- | src/shadow.c | 20 |
9 files changed, 571 insertions, 31 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 07e0264..e8c3cca 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,9 +2,11 @@ moduleexecdir = @moduledir@ moduleexec_LTLIBRARIES = libnss_directories.la EXTRA_libnss_directories_la_SOURCES = \ + files-parse.c \ generic.c + libnss_directories_la_SOURCES = \ - parsers.h \ + glibc-parse.c \ group.c \ passwd.c \ protocols.c \ @@ -12,7 +14,7 @@ libnss_directories_la_SOURCES = \ shadow.c libnss_directories_la_LDFLAGS = \ - -version-info 2 -export-symbols-regex "_nss_directories.*" + -version-info 2 -export-symbols-regex "_nss_directories_[sge].*" install-exec-hook: mv $(DESTDIR)/$(moduleexecdir)/libnss_directories.so.2.0.0 \ diff --git a/src/files-parse.c b/src/files-parse.c new file mode 100644 index 0000000..739ee54 --- /dev/null +++ b/src/files-parse.c @@ -0,0 +1,266 @@ +/* Common code for file-based database parsers in nss_files module. + Copyright (C) 1996, 1997, 1998, 1999, 2000 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 Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <ctype.h> +#include <errno.h> +#include <string.h> +#include <stdlib.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). + DATABASE -- string of the database file's name ("hosts", "passwd"). + + ENTDATA -- if defined, `struct ENTDATA' is used by the parser to store + things pointed to by the resultant `struct STRUCTURE'. + + NEED_H_ERRNO - defined iff an arg `int *herrnop' is used. + + EXTRA_ARGS -- defined iff extra parameters must be passed to the parser + EXTRA_ARGS_DECL -- declaration for these extra parameters + EXTRA_ARGS_VALUE -- values to be passed for these parameters + + Also see files-XXX.c. */ + +#ifndef EXTRA_ARGS +# define EXTRA_ARGS +# define EXTRA_ARGS_DECL +# define EXTRA_ARGS_VALUE +#endif + +#define CONCAT(a,b) CONCAT1(a,b) +#define CONCAT1(a,b) a##b + +#ifndef STRUCTURE +# define STRUCTURE ENTNAME +#endif + + +struct parser_data + { +#ifdef ENTDATA + struct ENTDATA entdata; +# define ENTDATA_DECL(data) struct ENTDATA *const entdata = &data->entdata; +#else +# define ENTDATA_DECL(data) +#endif + char linebuffer[0]; + }; + +#ifdef ENTDATA +/* The function can't be exported, because the entdata structure + is defined only in files-foo.c. */ +# define parser_stclass static inline +# define nss_files_parse_hidden_def(name) +#else +/* Export the line parser function so it can be used in nss_db. */ +# define parser_stclass /* Global */ +# define parse_line CONCAT(_nss_files_parse_,ENTNAME) +# define nss_files_parse_hidden_def(name) libc_hidden_def (name) +#endif + + +#ifdef EXTERN_PARSER + +/* The parser is defined in a different module. */ +extern int parse_line (char *line, struct STRUCTURE *result, + struct parser_data *data, size_t datalen, int *errnop + EXTRA_ARGS_DECL); + +# define LINE_PARSER(EOLSET, BODY) /* Do nothing */ + +#else + +/* Define a line parsing function. */ + +# define LINE_PARSER(EOLSET, BODY) \ +parser_stclass int \ +parse_line (char *line, struct STRUCTURE *result, \ + struct parser_data *data, size_t datalen, int *errnop \ + EXTRA_ARGS_DECL) \ +{ \ + ENTDATA_DECL (data) \ + char *p = strpbrk (line, EOLSET "\n"); \ + if (p != NULL) \ + *p = '\0'; \ + BODY; \ + TRAILING_LIST_PARSER; \ + return 1; \ +} \ +nss_files_parse_hidden_def (parse_line) + + +# define STRING_FIELD(variable, terminator_p, swallow) \ + { \ + variable = line; \ + while (*line != '\0' && !terminator_p (*line)) \ + ++line; \ + if (*line != '\0') \ + { \ + *line = '\0'; \ + do \ + ++line; \ + while (swallow && terminator_p (*line)); \ + } \ + } + +# define INT_FIELD(variable, terminator_p, swallow, base, convert) \ + { \ + char *endp; \ + variable = convert (strtoul (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 INT_FIELD_MAYBE_NULL(variable, terminator_p, swallow, base, convert, default) \ + { \ + char *endp; \ + if (*line == '\0') \ + /* We expect some more input, so don't allow the string to end here. */ \ + return 0; \ + variable = convert (strtoul (line, &endp, base)); \ + if (endp == line) \ + variable = default; \ + 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, errnop); \ + if (list) \ + result->TRAILING_LIST_MEMBER = list; \ + else \ + return -1; /* -1 indicates we ran out of space. */ \ +} + +static inline char ** +parse_list (char *line, struct parser_data *data, size_t datalen, int *errnop) +{ + char *eol, **list, **p; + + if (line >= data->linebuffer && line < (char *) data + datalen) + /* Find the end of the line buffer, we will use the space in DATA after + it for storing the vector of pointers. */ + eol = strchr (line, '\0') + 1; + else + /* LINE does not point within DATA->linebuffer, so that space is + not being used for scratch space right now. We can use all of + it for the pointer vector storage. */ + eol = data->linebuffer; + /* Adjust the pointer so it is aligned for storing pointers. */ + eol += __alignof__ (char *) - 1; + 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 ((size_t) ((char *) &p[1] - (char *) data) > datalen) + { + /* We cannot fit another pointer in the buffer. */ + *errnop = ERANGE; + return NULL; + } + if (*line == '\0') + break; + + /* Skip leading white space. This might not be portable but useful. */ + while (isspace (*line)) + ++line; + + elt = line; + while (1) + { + if (*line == '\0' || TRAILING_LIST_SEPARATOR_P (*line)) + { + /* End of the next entry. */ + if (line > elt) + /* We really found some data. */ + *p++ = elt; + + /* Terminate string if necessary. */ + if (*line != '\0') + *line++ = '\0'; + break; + } + ++line; + } + } + *p = NULL; + + return list; +} + +# endif /* TRAILING_LIST_MEMBER */ +#endif /* EXTERN_PARSER */ + + +#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; \ +} + +#define LOOKUP_NAME_CASE(nameelt, aliaselt) \ +{ \ + char **ap; \ + if (! __strcasecmp (name, result->nameelt)) \ + break; \ + for (ap = result->aliaselt; *ap; ++ap) \ + if (! __strcasecmp (name, *ap)) \ + break; \ + if (*ap) \ + break; \ +} + + +/* This is defined by db-*.c to include "../nss_db/db-XXX.c" instead. */ +#ifndef GENERIC +# define GENERIC "files-XXX.c" +#endif diff --git a/src/generic.c b/src/generic.c index f23792d..d604da8 100644 --- a/src/generic.c +++ b/src/generic.c @@ -16,7 +16,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#ident "$Id: generic.c,v 1.1 2002/11/18 19:53:21 nalin Exp $" +#ident "$Id: generic.c,v 1.2 2002/11/18 22:08:14 nalin Exp $" #include "../config.h" @@ -32,13 +32,11 @@ #include <stdlib.h> #include <string.h> -#include "parsers.h" -#include <pwd.h> - #define CHUNK_SIZE LINE_MAX #define FALSE 0 #define TRUE (!FALSE) +/* Array of file name patterns we ignore. */ static const char *skip_names[] = { "*~", "*.rpmsave", @@ -46,6 +44,7 @@ static const char *skip_names[] = { "*.rpmnew", }; +/* Return TRUE if we should ignore the file based on its name. */ static int skip_file_by_name(const char *filename) { @@ -58,6 +57,7 @@ skip_file_by_name(const char *filename) return FALSE; } +/* Read a line from the given file, no matter the length. */ static char * read_line(FILE *fp) { @@ -117,7 +117,7 @@ getgen(struct STRUCTURE *result, char path[PATH_MAX], *line; /* Start reading the directory. */ - dir = opendir(SYSCONFDIR "/" FILENAME ".d"); + dir = opendir(SYSCONFDIR "/" DATABASE ".d"); if (dir == NULL) { *errnop = errno; return NSS_STATUS_NOTFOUND; @@ -131,7 +131,7 @@ getgen(struct STRUCTURE *result, } /* Figure out the full name of the file. */ - snprintf(path, sizeof(path), SYSCONFDIR "/" FILENAME ".d/%s", + snprintf(path, sizeof(path), SYSCONFDIR "/" DATABASE ".d/%s", ent->d_name); /* If we can't open it, skip it. */ @@ -268,9 +268,9 @@ setent(int stayopen) /* Close and reopen the directory. */ endent(); LOCK(); - dir = opendir(SYSCONFDIR "/" FILENAME ".d"); + dir = opendir(SYSCONFDIR "/" DATABASE ".d"); UNLOCK(); - return NSS_STATUS_UNAVAIL; + return (dir == NULL) ? NSS_STATUS_UNAVAIL : NSS_STATUS_SUCCESS; } enum nss_status getent(struct STRUCTURE *result, char *buffer, size_t buflen, int *errnop) @@ -319,7 +319,7 @@ getent(struct STRUCTURE *result, char *buffer, size_t buflen, int *errnop) /* Formulate the full path name and try to * open it. */ snprintf(path, sizeof(path), - SYSCONFDIR "/" FILENAME ".d/%s", + SYSCONFDIR "/" DATABASE ".d/%s", ent->d_name); fp = fopen(path, "r"); @@ -361,9 +361,9 @@ getent(struct STRUCTURE *result, char *buffer, size_t buflen, int *errnop) } /* Try to parse the line. */ - if (parser(line, &structure, - (struct parser_data*) buffer, buflen, - errnop) != 0) { + if (parse_line(line, &structure, + (struct parser_data*) buffer, buflen, + errnop) != 0) { free(line); *result = structure; UNLOCK(); diff --git a/src/glibc-parse.c b/src/glibc-parse.c new file mode 100644 index 0000000..5d029b2 --- /dev/null +++ b/src/glibc-parse.c @@ -0,0 +1,191 @@ +/* Copyright (C) 1991, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + This file is assembled from parts of the GNU C Library: + pwd/fgetpwent_r.c + grp/fgetgrent_r.c + shadow/sgetspent_r.c + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <ctype.h> +#include <errno.h> +#include <stdio.h> +#include <grp.h> +#include <pwd.h> +#include <shadow.h> + +#define libc_hidden_def(ignored) +#define _nss_files_parse_ _nss_directories_parse_ + +/******************************************************************************/ +#undef STRUCTURE +#undef ENTNAME +#undef FALSE +#undef parser_data +#undef TRAILING_LIST_MEMBER +#undef TRAILING_LIST_PARSER +#undef TRAILING_LIST_SEPARATOR_P + +/* Define a line parsing function using the common code + used in the nss_files module. */ + +#define STRUCTURE passwd +#define ENTNAME pwent +#define parser_data pwent_data + +#include "files-parse.c" +LINE_PARSER +(, + STRING_FIELD (result->pw_name, ISCOLON, 0); + if (line[0] == '\0' + && (result->pw_name[0] == '+' || result->pw_name[0] == '-')) + { + /* This a special case. We allow lines containing only a `+' sign + since this is used for nss_compat. All other services will + reject this entry later. Initialize all other fields now. */ + result->pw_passwd = NULL; + result->pw_uid = 0; + result->pw_gid = 0; + result->pw_gecos = NULL; + result->pw_dir = NULL; + result->pw_shell = NULL; + } + else + { + STRING_FIELD (result->pw_passwd, ISCOLON, 0); + if (result->pw_name[0] == '+' || result->pw_name[0] == '-') + { + INT_FIELD_MAYBE_NULL (result->pw_uid, ISCOLON, 0, 10, , 0) + INT_FIELD_MAYBE_NULL (result->pw_gid, ISCOLON, 0, 10, , 0) + } + else + { + 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; + } + ) + +/******************************************************************************/ +#undef STRUCTURE +#undef ENTNAME +#undef FALSE +#undef parser_data +#undef TRAILING_LIST_MEMBER +#undef TRAILING_LIST_PARSER +#undef TRAILING_LIST_SEPARATOR_P + +/* Define a line parsing function using the common code + used in the nss_files module. */ + +#define STRUCTURE group +#define ENTNAME grent +#define parser_data 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); + if (line[0] == '\0' + && (result->gr_name[0] == '+' || result->gr_name[0] == '-')) + { + result->gr_passwd = NULL; + result->gr_gid = 0; + } + else + { + STRING_FIELD (result->gr_passwd, ISCOLON, 0); + if (result->gr_name[0] == '+' || result->gr_name[0] == '-') + INT_FIELD_MAYBE_NULL (result->gr_gid, ISCOLON, 0, 10, , 0) + else + INT_FIELD (result->gr_gid, ISCOLON, 0, 10,) + } + ) + +/******************************************************************************/ +#undef STRUCTURE +#undef ENTNAME +#undef FALSE +#undef parser_data +#undef TRAILING_LIST_MEMBER +#undef TRAILING_LIST_PARSER +#undef TRAILING_LIST_SEPARATOR_P + +/* Define a line parsing function using the common code + used in the nss_files module. */ + +#define STRUCTURE spwd +#define ENTNAME spent +#define parser_data spent_data + +/* Predicate which always returns false, needed below. */ +#define FALSE(arg) 0 + +#include "files-parse.c" +LINE_PARSER +(, + STRING_FIELD (result->sp_namp, ISCOLON, 0); + if (line[0] == '\0' + && (result->sp_namp[0] == '+' || result->sp_namp[0] == '-')) + { + result->sp_pwdp = NULL; + result->sp_lstchg = 0; + result->sp_min = 0; + result->sp_max = 0; + result->sp_warn = -1l; + result->sp_inact = -1l; + result->sp_expire = -1l; + result->sp_flag = ~0ul; + } + else + { + STRING_FIELD (result->sp_pwdp, ISCOLON, 0); + INT_FIELD_MAYBE_NULL (result->sp_lstchg, ISCOLON, 0, 10, (long int), + (long int) -1); + INT_FIELD_MAYBE_NULL (result->sp_min, ISCOLON, 0, 10, (long int), + (long int) -1); + INT_FIELD_MAYBE_NULL (result->sp_max, ISCOLON, 0, 10, (long int), + (long int) -1); + while (isspace (*line)) + ++line; + if (*line == '\0') + { + /* The old form. */ + result->sp_warn = -1l; + result->sp_inact = -1l; + result->sp_expire = -1l; + result->sp_flag = ~0ul; + } + else + { + INT_FIELD_MAYBE_NULL (result->sp_warn, ISCOLON, 0, 10, (long int), + (long int) -1); + INT_FIELD_MAYBE_NULL (result->sp_inact, ISCOLON, 0, 10, (long int), + (long int) -1); + INT_FIELD_MAYBE_NULL (result->sp_expire, ISCOLON, 0, 10, (long int), + (long int) -1); + if (*line != '\0') + INT_FIELD_MAYBE_NULL (result->sp_flag, FALSE, 0, 10, + (unsigned long int), ~0ul) + else + result->sp_flag = ~0ul; + } + } + ) diff --git a/src/group.c b/src/group.c index 6aebecb..5a13a6d 100644 --- a/src/group.c +++ b/src/group.c @@ -16,14 +16,28 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#ident "$Id: group.c,v 1.1 2002/11/18 19:53:21 nalin Exp $" +#ident "$Id: group.c,v 1.2 2002/11/18 22:08:14 nalin Exp $" #include <sys/types.h> #include <grp.h> +/* Shared information. */ #define STRUCTURE group -#define FILENAME "group" +#define DATABASE "group" +/* Parser. */ +#define ENTNAME grent +#define ENTDATA grent_data +struct grent_data {}; + +#define libc_hidden_def(ignored) +#define _nss_files_parse_ _nss_directories_parse_ + +#define EXTERN_PARSER + +#include "files-parse.c" + +/* Lookup. */ #define getnam _nss_directories_getgrnam_r #define getnam_field gr_name @@ -35,6 +49,6 @@ #define getent _nss_directories_getgrent_r #define endent _nss_directories_endgrent -#define parser _nss_files_parse_grent +#define parse_line _nss_directories_parse_grent #include "generic.c" diff --git a/src/passwd.c b/src/passwd.c index 53b3159..8075f19 100644 --- a/src/passwd.c +++ b/src/passwd.c @@ -16,14 +16,28 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#ident "$Id: passwd.c,v 1.1 2002/11/18 19:53:21 nalin Exp $" +#ident "$Id: passwd.c,v 1.2 2002/11/18 22:08:14 nalin Exp $" #include <sys/types.h> #include <pwd.h> +/* Shared information. */ #define STRUCTURE passwd -#define FILENAME "passwd" +#define DATABASE "passwd" +/* Parser. */ +#define ENTNAME pwent +#define ENTDATA pwent_data +struct pwent_data {}; + +#define libc_hidden_def(ignored) +#define _nss_files_parse_ _nss_directories_parse_ + +#define EXTERN_PARSER + +#include "files-parse.c" + +/* Lookup. */ #define getnam _nss_directories_getpwnam_r #define getnam_field pw_name @@ -35,6 +49,6 @@ #define getent _nss_directories_getpwent_r #define endent _nss_directories_endpwent -#define parser _nss_files_parse_pwent +#define parse_line _nss_directories_parse_pwent #include "generic.c" diff --git a/src/protocols.c b/src/protocols.c index 0a89a81..a7c3074 100644 --- a/src/protocols.c +++ b/src/protocols.c @@ -16,14 +16,34 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#ident "$Id: protocols.c,v 1.1 2002/11/18 19:53:21 nalin Exp $" +#ident "$Id: protocols.c,v 1.2 2002/11/18 22:08:14 nalin Exp $" #include <sys/types.h> #include <netdb.h> +/* Shared information. */ #define STRUCTURE protoent -#define FILENAME "protocols" +#define DATABASE "protocols" +/* Parser. */ +#define ENTNAME protoent +struct protoent_data {}; + +#define libc_hidden_def(ignored) +#define _nss_files_parse_ _nss_directories_parse_ + +#define TRAILING_LIST_MEMBER p_aliases +#define TRAILING_LIST_SEPARATOR_P isspace + +#include "files-parse.c" + +LINE_PARSER +("#", + STRING_FIELD (result->p_name, isspace, 1); + INT_FIELD (result->p_proto, isspace, 1, 10,); +) + +/* Lookups. */ #define getnam _nss_directories_getprotobyname_r #define getnam_field p_name #define getnam_fields p_aliases @@ -36,6 +56,4 @@ #define getent _nss_directories_getprotoent_r #define endent _nss_directories_endprotoent -#define parser _nss_files_parse_protoent - #include "generic.c" diff --git a/src/services.c b/src/services.c index 1ca091f..51ceb34 100644 --- a/src/services.c +++ b/src/services.c @@ -16,14 +16,37 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#ident "$Id: services.c,v 1.1 2002/11/18 19:53:21 nalin Exp $" +#ident "$Id: services.c,v 1.2 2002/11/18 22:08:14 nalin Exp $" #include <sys/types.h> #include <netdb.h> +/* Shared settings. */ #define STRUCTURE servent -#define FILENAME "services" +#define DATABASE "services" +/* Parser. */ +#define ENTNAME servent +struct servent_data {}; + +#define libc_hidden_def(ignored) +#define _nss_files_parse_ _nss_directories_parse_ + +#define TRAILING_LIST_MEMBER s_aliases +#define TRAILING_LIST_SEPARATOR_P isspace + +#include "files-parse.c" + +#define ISSLASH(__c) ((__c) == '/') + +LINE_PARSER +("#", + STRING_FIELD (result->s_name, isspace, 1); + INT_FIELD (result->s_port, ISSLASH, 10, 0, htons); + STRING_FIELD (result->s_proto, isspace, 1); +) + +/* Lookups. */ #define getnam _nss_directories_getservbyname_r #define getnam_field s_name #define getnam_fields s_aliases @@ -36,8 +59,6 @@ #define getent _nss_directories_getservent_r #define endent _nss_directories_endservent -#define parser _nss_files_parse_servent - #define GET_EXTRA_CRITERIA const char *protocol #define EXTRA_CRITERIA_NAMES protocol #define CHECK_EXTRA_CRITERIA(__s) (((__s)->s_proto != NULL) && strcmp((__s)->s_proto, protocol) == 0) diff --git a/src/shadow.c b/src/shadow.c index 0622f63..a2e90ee 100644 --- a/src/shadow.c +++ b/src/shadow.c @@ -16,14 +16,28 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#ident "$Id: shadow.c,v 1.1 2002/11/18 19:53:21 nalin Exp $" +#ident "$Id: shadow.c,v 1.2 2002/11/18 22:08:14 nalin Exp $" #include <sys/types.h> #include <shadow.h> +/* Shared information. */ #define STRUCTURE spwd -#define FILENAME "shadow" +#define DATABASE "shadow" +/* Parser. */ +#define ENTNAME spent +#define ENTDATA spent_data +struct spent_data {}; + +#define libc_hidden_def(ignored) +#define _nss_files_parse_ _nss_directories_parse_ + +#define EXTERN_PARSER + +#include "files-parse.c" + +/* Lookups. */ #define getnam _nss_directories_getspnam_r #define getnam_field sp_namp @@ -31,6 +45,6 @@ #define getent _nss_directories_getspent_r #define endent _nss_directories_endspent -#define parser _nss_files_parse_spent +#define parse_line _nss_directories_parse_spent #include "generic.c" |