diff options
author | Ulrich Drepper <drepper@redhat.com> | 1996-11-11 00:59:33 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1996-11-11 00:59:33 +0000 |
commit | d4a089cf193c467693f92a0a4ba1367b106a07dd (patch) | |
tree | 64a7dff867f42e4f7b42e68c2799a4edeb94b2e0 /sunrpc/publickey.c | |
parent | 2303f5fdd96d7bec2dea11b41cc0c07eddd50979 (diff) | |
download | glibc-d4a089cf193c467693f92a0a4ba1367b106a07dd.zip glibc-d4a089cf193c467693f92a0a4ba1367b106a07dd.tar.gz glibc-d4a089cf193c467693f92a0a4ba1367b106a07dd.tar.bz2 |
update from main archive 961110cvs/libc-961111
Sun Nov 10 23:28:16 1996 Ulrich Drepper <drepper@cygnus.com>
* inet/getprtname_r.c: Reformat copyright.
* nss/Makefile (databases): Add key.
(libnss_files-routines): Exclude key database.
(libnss_db-routines): Likewise.
* nss/key-lookup.c: New file.
* nss/getXXent_r.c (last_nip): Remember last service used since
last setXXent call.
(SETFUNC): Don't force to work through whole list of services in
call to __nss_next.
Update last_nip if necessary.
(ENDFUNC): Only process endXXent function up to currently used
last service.
(GETFUNC): Update last_nip if necessary.
* nss/nss_files/files-netgrp.c (_nss_netgroup_parseline): Don't
make static.
* rpc/auth_des.h: New file.
* sunrpc/Makefile (headers): Add auth_des.h.
(routines): Add publickey.
* sunrpc/publickey.c: New file. Interface to public key handling.
* sunrpc/rpc/auth_des.h: New file.
* sunrpc/rpc/netdb.h: Really include <rpc/auth_des.h>.
Diffstat (limited to 'sunrpc/publickey.c')
-rw-r--r-- | sunrpc/publickey.c | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/sunrpc/publickey.c b/sunrpc/publickey.c new file mode 100644 index 0000000..9a31432 --- /dev/null +++ b/sunrpc/publickey.c @@ -0,0 +1,110 @@ +/* Get public or secret key from key server. + Copyright (C) 1996 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + + 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 <rpc/netdb.h> + +#include "nsswitch.h" + + +/* Type of the lookup function for the public key. */ +typedef int (*public_function) (const char *, char *); + +/* Type of the lookup function for the secret key. */ +typedef int (*secret_function) (const char *, char *, const char *); + +/* The lookup function for the first entry of this service. */ +extern int __nss_publickey_lookup (service_user **nip, const char *name, + void **fctp); + + +int +getpublickey (const char *name, char *key) +{ + static service_user *startp = NULL; + static public_function start_fct; + service_user *nip; + public_function fct; + enum nss_status status = NSS_STATUS_UNAVAIL; + int no_more; + + if (startp == NULL) + { + no_more = __nss_publickey_lookup (&nip, "getpublickey", (void **) &fct); + if (no_more) + startp = (service_user *) -1; + else + { + startp = nip; + start_fct = fct; + } + } + else + { + fct = start_fct; + no_more = (nip = startp) == (service_user *) -1; + } + + while (! no_more) + { + status = (*fct) (name, key); + + no_more = __nss_next (&nip, "getpublickey", (void **) &fct, status, 0); + } + + return status == NSS_STATUS_SUCCESS; +} + + +int +getsecretkey (const char *name, char *key, const char *passwd) +{ + static service_user *startp = NULL; + static secret_function start_fct; + service_user *nip; + secret_function fct; + enum nss_status status = NSS_STATUS_UNAVAIL; + int no_more; + + if (startp == NULL) + { + no_more = __nss_publickey_lookup (&nip, "getsecretkey", (void **) &fct); + if (no_more) + startp = (service_user *) -1; + else + { + startp = nip; + start_fct = fct; + } + } + else + { + fct = start_fct; + no_more = (nip = startp) == (service_user *) -1; + } + + while (! no_more) + { + status = (*fct) (name, key, passwd); + + no_more = __nss_next (&nip, "getsecretkey", (void **) &fct, status, 0); + } + + return status == NSS_STATUS_SUCCESS; +} |