This code translates enumerations into strings and back. It can be used on either the client or server side, but the interface is declared in the client header.
/* * DO NOT EDIT THIS FILE (nfsv4-enum.c) * * It has been AutoGen-ed Saturday May 26, 2001 at 04:36:08 PM PDT * 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 "nfsv4-clhdr.h" #include "nfsv4.h" static const char zOopFmt[] = "`%d' is not in NFS4's %s enumeration\n"; static const char zOopFmt2[] = "`%s' is not in NFS4's %s enumeration\n"; static char zOops[ sizeof(zOopFmt) + 64 ]; typedef struct enum_info { int eid; const char* pz_name; const char* pz_info; int unused; } t_enum_info; /* * NFS4's status enumeration conversions */ static t_enum_info a_nfs4_status_info[] = { { 0, "OK", "successful completion", 0 }, { 1, "PERM", "caller is either not privileged or not owner", 0 }, { 2, "NOENT", "No such file or directory", 0 }, { 256, "OMITTED", "operation omitted", 0 } }; const char* info_nfs4_status( nfs4_status eid ) { int lo = 0; int hi = 3; int av = (lo + hi)/2; for (;;) { int c = (int)eid - a_nfs4_status_info[ av ].eid; if (c == 0) return a_nfs4_status_info[ av ].pz_info; if (c < 0) hi = av - 1; else lo = av + 1; if (hi < lo) break; av = (lo + hi)/2; } snprintf( zOops, sizeof( zOops ), zOopFmt, eid, "status" ); return zOops; } const char* name_nfs4_status( nfs4_status eid ) { int lo = 0; int hi = 3; int av = (lo + hi)/2; for (;;) { int c = (int)eid - a_nfs4_status_info[ av ].eid; if (c == 0) return a_nfs4_status_info[ av ].pz_name; if (c < 0) hi = av - 1; else lo = av + 1; if (hi < lo) break; av = (lo + hi)/2; } snprintf( zOops, sizeof( zOops ), zOopFmt, eid, "status" ); return zOops; } nfs4_status nfs4_status_enum( const char* pz_name ) { int i = 0; do { const char* pz = a_nfs4_status_info[i].pz_name; if ((pz != NULL) && (strcmp( pz, pz_name ) == 0)) return a_nfs4_status_info[i].eid; } while (++i < 4); fprintf( stderr, zOopFmt2, pz_name, "status" ); return (nfs4_status)-1; } const char* name_nfs4_compound_ops( nfs4_compound_ops op ) { static const char* apz_op_names[] = { "ACCESS4" }; int idx = (int)op - 3; if ((unsigned)idx > 0) return (const char*)NULL; return apz_op_names[ idx ]; }