AutoXDR - NFSv4 Example Server 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 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.
Return to GNU's home page.

Please send FSF & GNU inquiries & questions to gnu@gnu.org. There are also other ways to contact the FSF.

Please send comments on these web pages to webmasters@www.gnu.org, send other questions to gnu@gnu.org.

This article, Copyright © 2000-2002 by Bruce Korb

Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved. Last modified: Sat Aug 30 11:02:02 PDT 2014

AltStyle によって変換されたページ (->オリジナル) /