blob: 3e534c6155211d4e7506d7ce563ebc11e690bb37 [file] [log] [blame]
/*
* Copyright (c) 2009, Sun Microsystems, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Sun Microsystems, Inc. nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
#if defined(LIBC_SCCS) && !defined(lint)
static char *sccsid = "@(#)auth_none.c 1.19 87/08/11 Copyr 1984 Sun Micro";
static char *sccsid = "@(#)auth_none.c 2.1 88/07/29 4.0 RPCSRC";
#endif
#include <sys/cdefs.h>
__FBSDID("$FreeBSD: src/lib/libc/rpc/auth_none.c,v 1.12 2002/03/22 23:18:35 obrien Exp $");
*/
/*
* auth_none.c
* Creates a client authentication handle for passing "null"
* credentials and verifiers to remote systems.
*
* Copyright (C) 1984, Sun Microsystems, Inc.
*/
#include <config.h>
#include <assert.h>
#include <stdlib.h>
#include <errno.h>
#include <rpc/types.h>
#include <misc/portable.h>
#include <rpc/rpc.h>
#include <rpc/xdr_inline.h>
#include <rpc/auth_inline.h>
#include <rpc/auth.h>
#include <misc/opr.h>
#define MAX_MARSHAL_SIZE 20
/*
* Authenticator operations routines
*/
static bool authnone_marshal(AUTH *, XDR *);
static void authnone_verf(AUTH *);
static bool authnone_validate(AUTH *, struct opaque_auth *);
static bool authnone_refresh(AUTH *, void *);
static void authnone_destroy(AUTH *);
static struct auth_ops *authnone_ops(void);
struct authnone_private {
AUTH no_client;
char marshalled_client[MAX_MARSHAL_SIZE];
u_int mcnt;
};
static struct authnone_private auth_none_priv;
static struct authnone_private *ap;
static pthread_mutex_t init_lock = MUTEX_INITIALIZER;
AUTH *
authnone_ncreate(void)
{
XDR xdr_stream;
XDR *xdrs;
if (!ap) {
mutex_lock(&init_lock);
if (!ap) {
ap = &auth_none_priv; /* shared */
ap->no_client.ah_cred = ap->no_client.ah_verf =
_null_auth;
ap->no_client.ah_ops = authnone_ops();
xdrs = &xdr_stream;
xdrmem_create(xdrs, ap->marshalled_client,
(u_int) MAX_MARSHAL_SIZE, XDR_ENCODE);
(void)inline_xdr_opaque_auth(xdrs,
&ap->no_client.ah_cred);
(void)inline_xdr_opaque_auth(xdrs,
&ap->no_client.ah_verf);
ap->mcnt = XDR_GETPOS(xdrs);
XDR_DESTROY(xdrs);
}
mutex_unlock(&init_lock);
}
return (&ap->no_client);
}
/*ARGSUSED*/
static bool authnone_marshal(AUTH *client, XDR *xdrs)
{
struct authnone_private *ap =
opr_containerof(client, struct authnone_private, no_client);
return ((*xdrs->x_ops->x_putbytes)
(xdrs, ap->marshalled_client, ap->mcnt));
}
/* All these unused parameters are required to keep ANSI-C from grumbling */
/*ARGSUSED*/
static void authnone_verf(__attribute__ ((unused)) AUTH *client)
{
/* do nothing */
}
/*ARGSUSED*/
static bool authnone_validate(
__attribute__ ((unused)) AUTH *client,
__attribute__ ((unused)) struct opaque_auth *opaque)
{
return (true);
}
/*ARGSUSED*/
static bool
authnone_refresh(__attribute__ ((unused)) AUTH *client,
__attribute__ ((unused)) void *dummy)
{
return (false);
}
/*ARGSUSED*/
static void authnone_destroy(__attribute__ ((unused)) AUTH *client)
{
/* do nothing */
}
static bool
authnone_wrap(AUTH *auth, XDR *xdrs, xdrproc_t xfunc,
caddr_t xwhere)
{
return ((*xfunc) (xdrs, xwhere));
}
static struct auth_ops *
authnone_ops(void)
{
static struct auth_ops ops;
extern mutex_t ops_lock; /* XXXX does this need to be extern? */
/* VARIABLES PROTECTED BY ops_lock: ops */
mutex_lock(&ops_lock);
if (ops.ah_nextverf == NULL) {
ops.ah_nextverf = authnone_verf;
ops.ah_marshal = authnone_marshal;
ops.ah_validate = authnone_validate;
ops.ah_refresh = authnone_refresh;
ops.ah_destroy = authnone_destroy;
ops.ah_wrap = authnone_wrap;
ops.ah_unwrap = authnone_wrap;
}
mutex_unlock(&ops_lock);
return (&ops);
}