diff options
author | Ulrich Drepper <drepper@redhat.com> | 1998-06-11 11:32:21 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1998-06-11 11:32:21 +0000 |
commit | 36ecfe5690660610f27d839f3cae31f417b33a04 (patch) | |
tree | aaee5d534752df2acd878faa4c756126fa0c8ee6 /nss | |
parent | bbbad732292a78313a9f07a1240f824f72d1c32c (diff) | |
download | glibc-36ecfe5690660610f27d839f3cae31f417b33a04.tar.gz |
Update.
1998-06-03 03:09 Geoff Keating <geoffk@ozemail.com.au>
* sysdeps/unix/sysv/linux/pread.c: Detect missing syscall, like poll().
* sysdeps/unix/sysv/linux/pread64.c: Likewise.
* sysdeps/unix/sysv/linux/pwrite.c: Likewise.
* sysdeps/unix/sysv/linux/pwrite64.c: Likewise.
1998-06-03 03:09 Geoff Keating <geoffk@ozemail.com.au>
* sysdeps/powerpc/Makefile: Use -G0 on the startup file; this
makes it easier to undump emacs.
* sysdeps/powerpc/bits/endian.h: Use more informative error message
for when the endianness can't be determined.
1998-06-04 13:19 Geoff Keating <geoffk@ozemail.com.au>
* nss/Makefile: Add files publickey database support.
* nss/libnss_files.map: Export the required functions.
* nss/nss_files/files-key.c: Implement it.
* sunrpc/rpc/auth_des.h: Correct typos in comments.
Diffstat (limited to 'nss')
-rw-r--r-- | nss/Makefile | 2 | ||||
-rw-r--r-- | nss/libnss_files.map | 3 | ||||
-rw-r--r-- | nss/nss_files/files-key.c | 115 |
3 files changed, 119 insertions, 1 deletions
diff --git a/nss/Makefile b/nss/Makefile index 69a99c6a75..e71794e426 100644 --- a/nss/Makefile +++ b/nss/Makefile @@ -53,7 +53,7 @@ subdir-dirs = $(services:%=nss_%) vpath %.c $(subdir-dirs) -libnss_files-routines := $(addprefix files-,$(filter-out key, $(databases))) +libnss_files-routines := $(addprefix files-,$(databases)) distribute += files-XXX.c files-parse.c libnss_db-routines := $(addprefix db-,$(filter-out hosts network key,\ diff --git a/nss/libnss_files.map b/nss/libnss_files.map index 3e030012d4..8daa75f5bb 100644 --- a/nss/libnss_files.map +++ b/nss/libnss_files.map @@ -70,6 +70,9 @@ GLIBC_2.0 { _nss_netgroup_parseline; + _nss_files_getpublickey; + _nss_files_getsecretkey; + local: *; }; diff --git a/nss/nss_files/files-key.c b/nss/nss_files/files-key.c new file mode 100644 index 0000000000..a3c1474c2d --- /dev/null +++ b/nss/nss_files/files-key.c @@ -0,0 +1,115 @@ +/* Public key file parser in nss_files module. + Copyright (C) 1996, 1997, 1998 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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <stdio.h> +#include <errno.h> +#include <string.h> +#include <netdb.h> +#include <rpc/key_prot.h> +#include "nsswitch.h" + +#define DATAFILE "/etc/publickey" + +/* Prototype for function in xcyrpt.c. */ +extern int xdecrypt (char *, char *); + + +static enum nss_status +search (const char *netname, char *result, int *errnop, int secret) +{ + FILE *stream; + + stream = fopen (DATAFILE, "r"); + if (stream == NULL) + return errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; + + for (;;) + { + char buffer[HEXKEYBYTES * 2 + KEYCHECKSUMSIZE + MAXNETNAMELEN + 17]; + char *p; + char *save_ptr; + + buffer[sizeof (buffer) - 1] = '\xff'; + p = fgets (buffer, sizeof (buffer), stream); + if (p == NULL) + { + /* End of file or read error. */ + *errnop = errno; + fclose (stream); + return NSS_STATUS_NOTFOUND; + } + else if (buffer[sizeof (buffer) - 1] != '\xff') + { + /* Invalid line in file? Skip remainder of line. */ + if (buffer[sizeof (buffer) - 2] != '\0') + while (getc (stream) != '\n') + continue; + continue; + } + + /* Parse line. */ + p = __strtok_r (buffer, "# \t:\n", &save_ptr); + if (p == NULL) /* Skip empty and comment lines. */ + continue; + if (strcmp (p, netname) != 0) + continue; + + /* A hit! Find the field we want and return. */ + p = __strtok_r (NULL, ":\n", &save_ptr); + if (p == NULL) /* malformed line? */ + continue; + if (secret) + p = __strtok_r (NULL, ":\n", &save_ptr); + if (p == NULL) /* malformed line? */ + continue; + strcpy (result, p); + return NSS_STATUS_SUCCESS; + } +} + +enum nss_status +_nss_files_getpublickey (const char *netname, char *pkey, int *errnop) +{ + return search (netname, pkey, errnop, 0); +} + +enum nss_status +_nss_files_getsecretkey (const char *netname, char *skey, char *passwd, + int *errnop) +{ + enum nss_status status; + char buf[HEXKEYBYTES + KEYCHECKSUMSIZE + 16]; + + skey[0] = 0; + + status = search (netname, buf, errnop, 1); + if (status != NSS_STATUS_SUCCESS) + return status; + + if (!xdecrypt (buf, passwd)) + return NSS_STATUS_SUCCESS; + + if (memcmp (buf, &(buf[HEXKEYBYTES]), KEYCHECKSUMSIZE) != 0) + return NSS_STATUS_SUCCESS; + + buf[HEXKEYBYTES] = 0; + strcpy (skey, buf); + + return NSS_STATUS_SUCCESS; +} |