linux/net/sunrpc/auth_null.c
<<
>>
Prefs
   1/*
   2 * linux/net/sunrpc/auth_null.c
   3 *
   4 * AUTH_NULL authentication. Really :-)
   5 *
   6 * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
   7 */
   8
   9#include <linux/types.h>
  10#include <linux/module.h>
  11#include <linux/utsname.h>
  12#include <linux/sunrpc/clnt.h>
  13
  14#ifdef RPC_DEBUG
  15# define RPCDBG_FACILITY        RPCDBG_AUTH
  16#endif
  17
  18static struct rpc_auth null_auth;
  19static struct rpc_cred null_cred;
  20
  21static struct rpc_auth *
  22nul_create(struct rpc_clnt *clnt, rpc_authflavor_t flavor)
  23{
  24        atomic_inc(&null_auth.au_count);
  25        return &null_auth;
  26}
  27
  28static void
  29nul_destroy(struct rpc_auth *auth)
  30{
  31}
  32
  33/*
  34 * Lookup NULL creds for current process
  35 */
  36static struct rpc_cred *
  37nul_lookup_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
  38{
  39        return get_rpccred(&null_cred);
  40}
  41
  42/*
  43 * Destroy cred handle.
  44 */
  45static void
  46nul_destroy_cred(struct rpc_cred *cred)
  47{
  48}
  49
  50/*
  51 * Match cred handle against current process
  52 */
  53static int
  54nul_match(struct auth_cred *acred, struct rpc_cred *cred, int taskflags)
  55{
  56        return 1;
  57}
  58
  59/*
  60 * Marshal credential.
  61 */
  62static __be32 *
  63nul_marshal(struct rpc_task *task, __be32 *p)
  64{
  65        *p++ = htonl(RPC_AUTH_NULL);
  66        *p++ = 0;
  67        *p++ = htonl(RPC_AUTH_NULL);
  68        *p++ = 0;
  69
  70        return p;
  71}
  72
  73/*
  74 * Refresh credential. This is a no-op for AUTH_NULL
  75 */
  76static int
  77nul_refresh(struct rpc_task *task)
  78{
  79        set_bit(RPCAUTH_CRED_UPTODATE, &task->tk_msg.rpc_cred->cr_flags);
  80        return 0;
  81}
  82
  83static __be32 *
  84nul_validate(struct rpc_task *task, __be32 *p)
  85{
  86        rpc_authflavor_t        flavor;
  87        u32                     size;
  88
  89        flavor = ntohl(*p++);
  90        if (flavor != RPC_AUTH_NULL) {
  91                printk("RPC: bad verf flavor: %u\n", flavor);
  92                return NULL;
  93        }
  94
  95        size = ntohl(*p++);
  96        if (size != 0) {
  97                printk("RPC: bad verf size: %u\n", size);
  98                return NULL;
  99        }
 100
 101        return p;
 102}
 103
 104const struct rpc_authops authnull_ops = {
 105        .owner          = THIS_MODULE,
 106        .au_flavor      = RPC_AUTH_NULL,
 107        .au_name        = "NULL",
 108        .create         = nul_create,
 109        .destroy        = nul_destroy,
 110        .lookup_cred    = nul_lookup_cred,
 111};
 112
 113static
 114struct rpc_auth null_auth = {
 115        .au_cslack      = 4,
 116        .au_rslack      = 2,
 117        .au_ops         = &authnull_ops,
 118        .au_flavor      = RPC_AUTH_NULL,
 119        .au_count       = ATOMIC_INIT(0),
 120};
 121
 122static
 123const struct rpc_credops null_credops = {
 124        .cr_name        = "AUTH_NULL",
 125        .crdestroy      = nul_destroy_cred,
 126        .crbind         = rpcauth_generic_bind_cred,
 127        .crmatch        = nul_match,
 128        .crmarshal      = nul_marshal,
 129        .crrefresh      = nul_refresh,
 130        .crvalidate     = nul_validate,
 131};
 132
 133static
 134struct rpc_cred null_cred = {
 135        .cr_lru         = LIST_HEAD_INIT(null_cred.cr_lru),
 136        .cr_auth        = &null_auth,
 137        .cr_ops         = &null_credops,
 138        .cr_count       = ATOMIC_INIT(1),
 139        .cr_flags       = 1UL << RPCAUTH_CRED_UPTODATE,
 140#ifdef RPC_DEBUG
 141        .cr_magic       = RPCAUTH_CRED_MAGIC,
 142#endif
 143};
 144