|
i |
|
This is a brief example extracted from a prototype
implementation for NFSv4. This is hand crafted code showing how
one might write code to test out the generated interfaces.
#include <stdio.h>
#include "nfsv4.h"
#include "nfsv4-clhdr.h"
int command_was_sent = 0;
void
finish_access4(
void* user_cookie,
nfs4_compound_res* p_cp_res,
nfs4_status final_status,
uint32_t requested /* in */,
ACCESS4res* p_res /* out */ )
{
fputs( "finish_access4 called\n", stderr );
if (command_was_sent == 0) {
fputs( "command completed out of sequence\n", stderr );
exit( 1 );
}
if (p_res == NULL) {
/* no deallocations to do */
return;
}
if (p_res->status != NFS4_STATUS_OK) {
fputs( "I could not access what I wanted >:-(\n", stderr );
return;
}
if ( (requested != p_res->ACCESS4res_u.resok4.supported)
|| (requested != p_res->ACCESS4res_u.resok4.access)) {
fputs( "I did not get the access I wanted >:-(\n", stderr );
return;
}
command_was_sent--;
}
nfs4_status
nfs4_access4_svc(
nfs4_compound_args* p_cpd_args,
ACCESS4res* p_res,
ACCESS4args* p_args )
{
uint32_t req = p_args->requested;
if (req == 0)
req = ~0;
if (p_res != NULL)
p_res->ACCESS4res_u.resok4.access =
p_res->ACCESS4res_u.resok4.supported = p_args->requested;
fputs( "nfs4_access4_svc called\n", stderr );
return NFS4_STATUS_OK;
}
int
main( int argc,
char** argv )
{
int res = 0;
t_nfs_cookie nfs_cookie;
static utf8string tag = { sizeof( "mytag" ), "mytag" };
int fail_test = 0;
if (argc > 1)
fail_test = atoi( argv[1] );
fprintf( stderr, "Hello, NFS world!\n" );
if (nfs4_null_4( NULL, NULL ) == (void*)NULL) {
fprintf( stderr, "nfs4_null_4 failed\n" );
res++;
}
if (--fail_test == 0) {
fputs( "We are about to die horribly. Expect it.\n", stderr );
do_nfs4_access4( nfs_cookie, finish_access4, ACCESS4_LOOKUP );
fputs( "WORSE YET!! We did *not* die :-(\n", stderr );
}
if (init_nfs4_compound( &nfs_cookie, &tag, NULL ) != RPC_SUCCESS) {
fprintf( stderr, "init_nfs4_compound failed\n" );
res++;
}
{
uint32_t mode = ACCESS4_EXECUTE << 1;
int cmd_ct = 0;
do {
mode >>= 1;
if (do_nfs4_access4( nfs_cookie, finish_access4, mode ) != 0) {
fprintf( stderr, "do_nfs4_access4 for %d failed\n", mode );
res++;
}
cmd_ct++;
} while (mode != 0);
command_was_sent = cmd_ct;
}
if (send_nfs4_compound( nfs_cookie, NULL ) != 0) {
fprintf( stderr, "send_nfs4_compound failed\n" );
res++;
}
if (--fail_test == 0) {
fputs( "We are about to die horribly. Expect it.\n", stderr );
do_nfs4_access4( nfs_cookie, finish_access4, ACCESS4_LOOKUP );
fputs( "WORSE YET!! We did *not* die :-(\n", stderr );
}
if (command_was_sent)
res++;
if (res != 0)
fprintf( stderr, "%d FAILURES\n", res );
else
fprintf( stderr, "SUCCESSFUL!\n" );
return res;
}
|