AutoXDR - NFSv4 Example Server code

Main
AutoGen
Pages

Home
Announce
FAQ
docs
XML Defs
testimonials
downloads

Automated
Options

AutoOpts
Comparison
Man example
Redistribute
Licensing
local use
using getopt

GCC's
Fixincludes

fixincludes

Automated
FSM

description
example
usagefsm

Addons
addon

Autoconf
Config
Tests

create form
M4 Quoting

Automated
XDR

xdr project
  definitions
  XDR

  client
  clt. head
  server
  srv. head

  enums

  debug
  test code

i

This is the code that implements the NULL procedure and calls the server side implementation routines for queued procedures.

Please note that some implementations of rpcgen omit the "_svc" suffix on the names of the server side procedures. To accommodate these, you must specify the AutoGen command line option, "-DXDR_NO_SVC_SUFFIX" or set the XDR_NO_SVC_SUFFIX environment variable before generating the output. Also please note that in such an environment there is a naming conflict between the client side stubs and the server side implementation routines. It may be necessary to hand edit these modules to be able to link them into a single executable for debugging.

The following example is from NFSv4 with all but one queued call removed:

/*
 *  DO NOT EDIT THIS FILE   (nfsv4-server.c)
 *  
 *  It has been AutoGen-ed  March  1, 2010 at 02:26:41 PM by AutoGen 5.10.1
 *  From the definitions    nfsv4.def
 *  and the template file   autoxdr.tpl
 *
 *  This file has been generated by the AutoXDR AutoGen template suite.
 *
 *  These files are compatible with:
 *  RFC1831 - Remote Procedure Call Protocol Specification Version 2
 *  RFC1832 - External Data Representation Standard
 *  and are intended to be used as a layer on top of the ONC IDL
 *  in conjunction with RPCGEN.
 *
 */
#include <stdio.h>
#include <errno.h>

#include "nfsv4-svhdr.h"
#include "nfsv4.h"

/*
 *  NULL Server Routine
 */
void*
nfs4_null_4_svc( void* arg, struct svc_req *rqstp )
{
  static char z;
  return (void*)&z;
}

/*
 *  COMPOUND Server Dispatch Routine
 */
nfs4_compound_res*
nfs4_compound_4_svc( nfs4_compound_args* args, struct svc_req *rqstp )
{
  static nfs4_compound_res res;
  nfs4_status stat = NFS4_STATUS_OK;

  if (res.resarray.resarray_len != 0)
    xdr_free( (xdrproc_t)xdr_nfs4_compound_res, (void*)&res );
  memset( (void*)&res, 0, sizeof( res ));

  {
    u_nfs4_compound_args* p_op  = args->argarray.argarray_val;
    int ct  = args->argarray.argarray_len / sizeof( *p_op );
    int idx = 0;
    u_nfs4_compound_res*  p_res =
      (u_nfs4_compound_res*)malloc( ct * sizeof( *p_res ));

    if (p_res == NULL)
      return (nfs4_compound_res*)NULL;
    res.resarray.resarray_val = p_res;

    while (--ct >= 0)
      {
        p_res[idx].resop = p_op->argop;
        switch (p_op->argop)
        {
        case NFS4_ACCESS4:
          stat =
            nfs4_access4_svc( args,
                 &(p_res[idx].u_nfs4_compound_res_u.op_access4),
                 &(p_op->u_nfs4_compound_args_u.op_access4) );
          break;

        default:
          stat = EINVAL;
        }

        /*
         *  The status field is always defined to be in the same place for
         *  all the commands:  the start of the reply structure
         */
        *(nfs4_status*)(void*)(p_res + idx) = stat;
        if (stat != NFS4_STATUS_OK)
          break;
        idx++;
        p_op++;
      }

    res.resarray.resarray_len = idx * sizeof( *p_res );
    res.status = stat;
  }

  return &res;
}

top  Viewable With Any Browser  SourceForge Logo   Support This Project   Valid XHTML 1.0!


AutoGen, AutoOpts, columns, getdefs, AutoFSM, AutoXDR and these web pages copyright (c) 1999-2012 Bruce Korb, all rights reserved.

AutoXDR copyright (c) 2000-2012 Bruce Korb, all rights reserved. Last modified: Sat Aug 30 10:58:54 PDT 2014