diff options
-rw-r--r-- | ChangeLog | 18 | ||||
-rw-r--r-- | include/rpc/rpc.h | 2 | ||||
-rw-r--r-- | sunrpc/auth_none.c | 65 | ||||
-rw-r--r-- | sunrpc/rpc_thread.c | 1 |
4 files changed, 51 insertions, 35 deletions
diff --git a/ChangeLog b/ChangeLog index b0a65b5612..bee1ad5489 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2002-04-11 Zack Weinberg <zack@codesourcery.com> + + * include/rpc/rpc.h (struct rpc_thread_variables): Remove + authnone_private_s. + * sunrpc/auth_none.c: Include bits/libc-lock.h. + Delete #ifdef _RPC_THREAD_SAFE_ block. + (authnone_private): Make a struct, not a pointer to struct. + (authnone_private_guard): New once-control variable. + (authnone_create_once): New function, split out of + authnone_create. No need to allocate memory. + (authnone_create): Just call authnone_create_once via + __libc_once, then return &authnone_private->no_client. + (authnone_marshal): Access private data via CLIENT argument, + not authnone_private pointer. + Fix typo (MAX_MARSHEL_SIZE -> MAX_MARSHAL_SIZE). + * sunrpc/rpc_thread.c (__rpc_thread_destroy): No need to free + authnone_private_s. + 2002-04-12 H.J. Lu <hjl@gnu.org> * sunrpc/clnt_raw.c (clntraw_create): Properly set xdrs and client. diff --git a/include/rpc/rpc.h b/include/rpc/rpc.h index f4dee74afe..9f90ae135d 100644 --- a/include/rpc/rpc.h +++ b/include/rpc/rpc.h @@ -16,8 +16,6 @@ struct rpc_thread_variables { struct pollfd *svc_pollfd_s; /* Global, rpc_common.c */ int svc_max_pollfd_s; /* Global, rpc_common.c */ - void *authnone_private_s; /* auth_none.c */ - void *clnt_perr_buf_s; /* clnt_perr.c */ void *clntraw_private_s; /* clnt_raw.c */ diff --git a/sunrpc/auth_none.c b/sunrpc/auth_none.c index b235ec3b95..4a1b46f274 100644 --- a/sunrpc/auth_none.c +++ b/sunrpc/auth_none.c @@ -36,8 +36,9 @@ */ #include <rpc/rpc.h> +#include <bits/libc-lock.h> -#define MAX_MARSHEL_SIZE 20 +#define MAX_MARSHAL_SIZE 20 /* * Authenticator operations routines @@ -56,54 +57,54 @@ static struct auth_ops ops = { authnone_destroy }; +/* Internal data and routines */ + struct authnone_private_s { AUTH no_client; - char marshalled_client[MAX_MARSHEL_SIZE]; + char marshalled_client[MAX_MARSHAL_SIZE]; u_int mcnt; }; -#ifdef _RPC_THREAD_SAFE_ -#define authnone_private ((struct authnone_private_s *)RPC_THREAD_VARIABLE(authnone_private_s)) -#else -static struct authnone_private_s *authnone_private; -#endif -AUTH * -authnone_create (void) +static struct authnone_private_s authnone_private; +__libc_once_define(static, authnone_private_guard); + +static void authnone_create_once (void); + +static void +authnone_create_once (void) { struct authnone_private_s *ap; XDR xdr_stream; XDR *xdrs; - ap = (struct authnone_private_s *) authnone_private; - if (ap == NULL) - { - ap = (struct authnone_private_s *) calloc (1, sizeof (*ap)); - if (ap == NULL) - return NULL; - authnone_private = ap; - } - if (!ap->mcnt) - { - ap->no_client.ah_cred = ap->no_client.ah_verf = _null_auth; - ap->no_client.ah_ops = &ops; - xdrs = &xdr_stream; - INTUSE(xdrmem_create) (xdrs, ap->marshalled_client, - (u_int) MAX_MARSHEL_SIZE, XDR_ENCODE); - (void) INTUSE(xdr_opaque_auth) (xdrs, &ap->no_client.ah_cred); - (void) INTUSE(xdr_opaque_auth) (xdrs, &ap->no_client.ah_verf); - ap->mcnt = XDR_GETPOS (xdrs); - XDR_DESTROY (xdrs); - } - return (&ap->no_client); + ap = &authnone_private; + + ap->no_client.ah_cred = ap->no_client.ah_verf = _null_auth; + ap->no_client.ah_ops = &ops; + xdrs = &xdr_stream; + INTUSE(xdrmem_create) (xdrs, ap->marshalled_client, + (u_int) MAX_MARSHAL_SIZE, XDR_ENCODE); + (void) INTUSE(xdr_opaque_auth) (xdrs, &ap->no_client.ah_cred); + (void) INTUSE(xdr_opaque_auth) (xdrs, &ap->no_client.ah_verf); + ap->mcnt = XDR_GETPOS (xdrs); + XDR_DESTROY (xdrs); +} + +AUTH * +authnone_create (void) +{ + __libc_once (authnone_private_guard, authnone_create_once); + return &authnone_private.no_client; } -/*ARGSUSED */ static bool_t authnone_marshal (AUTH *client, XDR *xdrs) { struct authnone_private_s *ap; - ap = (struct authnone_private_s *) authnone_private; + /* authnone_create returned authnone_private->no_client, which is + the first field of struct authnone_private_s. */ + ap = (struct authnone_private_s *) client; if (ap == NULL) return FALSE; return (*xdrs->x_ops->x_putbytes) (xdrs, ap->marshalled_client, ap->mcnt); diff --git a/sunrpc/rpc_thread.c b/sunrpc/rpc_thread.c index d0dc40b559..7f2e351749 100644 --- a/sunrpc/rpc_thread.c +++ b/sunrpc/rpc_thread.c @@ -26,7 +26,6 @@ __rpc_thread_destroy (void) __rpc_thread_svc_cleanup (); __rpc_thread_clnt_cleanup (); __rpc_thread_key_cleanup (); - free (tvp->authnone_private_s); free (tvp->clnt_perr_buf_s); free (tvp->clntraw_private_s); free (tvp->svcraw_private_s); |