diff options
author | Ulrich Drepper <drepper@redhat.com> | 2004-12-22 20:10:10 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2004-12-22 20:10:10 +0000 |
commit | a334319f6530564d22e775935d9c91663623a1b4 (patch) | |
tree | b5877475619e4c938e98757d518bb1e9cbead751 /sunrpc/key_call.c | |
parent | 0ecb606cb6cf65de1d9fc8a919bceb4be476c602 (diff) | |
download | glibc-a334319f6530564d22e775935d9c91663623a1b4.tar.gz |
(CFLAGS-tst-align.c): Add -mpreferred-stack-boundary=4.
Diffstat (limited to 'sunrpc/key_call.c')
-rw-r--r-- | sunrpc/key_call.c | 91 |
1 files changed, 85 insertions, 6 deletions
diff --git a/sunrpc/key_call.c b/sunrpc/key_call.c index 611c37256c..211f61db70 100644 --- a/sunrpc/key_call.c +++ b/sunrpc/key_call.c @@ -51,6 +51,10 @@ #include <rpc/key_prot.h> #include <bits/libc-lock.h> +#ifdef HAVE_DOORS +# include "door/door.h" +#endif + #define KEY_TIMEOUT 5 /* per-try timeout in seconds */ #define KEY_NRETRY 12 /* number of retries */ @@ -382,7 +386,7 @@ getkeyserv_handle (int vers) struct timeval wait_time; int fd; struct sockaddr_un name; - socklen_t namelen = sizeof(struct sockaddr_un); + int namelen = sizeof(struct sockaddr_un); #define TOTAL_TIMEOUT 30 /* total timeout talking to keyserver */ #define TOTAL_TRIES 5 /* Number of tries */ @@ -400,7 +404,6 @@ getkeyserv_handle (int vers) /* if pid has changed, destroy client and rebuild */ if (kcp->client != NULL && kcp->pid != __getpid ()) { - auth_destroy (kcp->client->cl_auth); clnt_destroy (kcp->client); kcp->client = NULL; } @@ -500,6 +503,73 @@ key_call_socket (u_long proc, xdrproc_t xdr_arg, char *arg, return result; } +#ifdef HAVE_DOORS +/* returns 0 on failure, 1 on success */ +static int +internal_function +key_call_door (u_long proc, xdrproc_t xdr_arg, char *arg, + xdrproc_t xdr_rslt, char *rslt) +{ + XDR xdrs; + int fd, ret; + door_arg_t args; + char *data_ptr; + u_long data_len = 0; + char res[255]; + + if ((fd = open("/var/run/keyservdoor", O_RDONLY)) < 0) + return 0; + res[0] = 0; + + data_len = xdr_sizeof (xdr_arg, arg); + data_ptr = calloc (1, data_len + 2 * sizeof (u_long)); + if (data_ptr == NULL) + return 0; + + INTUSE(xdrmem_create) (&xdrs, &data_ptr[2 * sizeof (u_long)], data_len, + XDR_ENCODE); + if (!xdr_arg (&xdrs, arg)) + { + xdr_destroy (&xdrs); + free (data_ptr); + return 0; + } + xdr_destroy (&xdrs); + + memcpy (data_ptr, &proc, sizeof (u_long)); + memcpy (&data_ptr[sizeof (proc)], &data_len, sizeof (u_long)); + + args.data_ptr = data_ptr; + args.data_size = data_len + 2 * sizeof (u_long); + args.desc_ptr = NULL; + args.desc_num = 0; + args.rbuf = res; + args.rsize = sizeof (res); + + ret = __door_call (fd, &args); + free (data_ptr); + close (fd); + + if (ret < 0) + return 0; + + memcpy (&data_len, args.data_ptr, sizeof (u_long)); + if (data_len != 0) + return 0; + + memcpy (&data_len, &args.data_ptr[sizeof (u_long)], sizeof (u_long)); + INTUSE(xdrmem_create) (&xdrs, &args.data_ptr[2 * sizeof (u_long)], + data_len, XDR_DECODE); + if (!xdr_rslt (&xdrs, rslt)) + { + xdr_destroy (&xdrs); + return 0; + } + xdr_destroy (&xdrs); + + return 1; +} +#endif /* returns 0 on failure, 1 on success */ static int @@ -510,6 +580,9 @@ key_call (u_long proc, xdrproc_t xdr_arg, char *arg, #ifndef SO_PASSCRED static int use_keyenvoy; #endif +#ifdef HAVE_DOORS + static int not_use_doors; +#endif if (proc == KEY_ENCRYPT_PK && __key_encryptsession_pk_LOCAL) { @@ -533,6 +606,15 @@ key_call (u_long proc, xdrproc_t xdr_arg, char *arg, return 1; } +#ifdef HAVE_DOORS + if (!not_use_doors) + { + if (key_call_door (proc, xdr_arg, arg, xdr_rslt, rslt)) + return 1; + not_use_doors = 1; + } +#endif + #ifdef SO_PASSCRED return key_call_socket (proc, xdr_arg, arg, xdr_rslt, rslt); #else @@ -553,11 +635,8 @@ __rpc_thread_key_cleanup (void) struct key_call_private *kcp = RPC_THREAD_VARIABLE(key_call_private_s); if (kcp) { - if (kcp->client) { - if (kcp->client->cl_auth) - auth_destroy (kcp->client->cl_auth); + if (kcp->client) clnt_destroy(kcp->client); - } free (kcp); } } |