#include #include #include "nfs.h" static void nfs_program_2(); static void mountprog_1(); static void mountprog_2(); main() { SVCXPRT *transp; #ifdef WIN32 rpc_nt_init(); #endif (void)pmap_unset(NFS_PROGRAM, NFS_VERSION); (void)pmap_unset(MOUNTPROG, MOUNTVERS); (void)pmap_unset(MOUNTPROG, MOUNTVERS_POSIX); transp = svcudp_create(RPC_ANYSOCK); if (transp == NULL) { (void)fprintf(stderr, "cannot create udp service.\n"); #ifdef WIN32 rpc_nt_exit(); #endif exit(1); } if (!svc_register(transp, NFS_PROGRAM, NFS_VERSION, nfs_program_2, IPPROTO_UDP)) { (void)fprintf(stderr, "unable to register (NFS_PROGRAM, NFS_VERSION, udp).\n"); #ifdef WIN32 rpc_nt_exit(); #endif exit(1); } if (!svc_register(transp, MOUNTPROG, MOUNTVERS, mountprog_1, IPPROTO_UDP)) { (void)fprintf(stderr, "unable to register (MOUNTPROG, MOUNTVERS, udp).\n"); #ifdef WIN32 rpc_nt_exit(); #endif exit(1); } if (!svc_register(transp, MOUNTPROG, MOUNTVERS_POSIX, mountprog_2, IPPROTO_UDP)) { (void)fprintf(stderr, "unable to register (MOUNTPROG, MOUNTVERS_POSIX, udp).\n"); #ifdef WIN32 rpc_nt_exit(); #endif exit(1); } transp = svctcp_create(RPC_ANYSOCK, 0, 0); if (transp == NULL) { (void)fprintf(stderr, "cannot create tcp service.\n"); #ifdef WIN32 rpc_nt_exit(); #endif exit(1); } if (!svc_register(transp, NFS_PROGRAM, NFS_VERSION, nfs_program_2, IPPROTO_TCP)) { (void)fprintf(stderr, "unable to register (NFS_PROGRAM, NFS_VERSION, tcp).\n"); #ifdef WIN32 rpc_nt_exit(); #endif exit(1); } if (!svc_register(transp, MOUNTPROG, MOUNTVERS, mountprog_1, IPPROTO_TCP)) { (void)fprintf(stderr, "unable to register (MOUNTPROG, MOUNTVERS, tcp).\n"); #ifdef WIN32 rpc_nt_exit(); #endif exit(1); } if (!svc_register(transp, MOUNTPROG, MOUNTVERS_POSIX, mountprog_2, IPPROTO_TCP)) { (void)fprintf(stderr, "unable to register (MOUNTPROG, MOUNTVERS_POSIX, tcp).\n"); #ifdef WIN32 rpc_nt_exit(); #endif exit(1); } svc_run(); (void)fprintf(stderr, "svc_run returned\n"); #ifdef WIN32 rpc_nt_exit(); #endif exit(1); } #ifdef MULTITHREAD struct call_params { struct svc_req *rqstp; SVCXPRT *transp; void *arg; char *(*local)(); bool_t (*xdr_argument)(), (*xdr_result)(); }; static void nfs_program_2_a (); #endif static void nfs_program_2(rqstp, transp) struct svc_req *rqstp; SVCXPRT *transp; { union { fhandle nfsproc_getattr_2_arg; sattrargs nfsproc_setattr_2_arg; diropargs nfsproc_lookup_2_arg; fhandle nfsproc_readlink_2_arg; readargs nfsproc_read_2_arg; writeargs nfsproc_write_2_arg; createargs nfsproc_create_2_arg; diropargs nfsproc_remove_2_arg; renameargs nfsproc_rename_2_arg; linkargs nfsproc_link_2_arg; symlinkargs nfsproc_symlink_2_arg; createargs nfsproc_mkdir_2_arg; diropargs nfsproc_rmdir_2_arg; readdirargs nfsproc_readdir_2_arg; fhandle nfsproc_statfs_2_arg; } argument; char *result; bool_t (*xdr_argument)(), (*xdr_result)(); char *(*local)(); #ifdef MULTITHREAD DWORD TID = 0; HANDLE threadHandle = NULL; struct call_params *params; #endif switch (rqstp->rq_proc) { case NFSPROC_NULL: xdr_argument = xdr_void; xdr_result = xdr_void; local = (char *(*)()) nfsproc_null_2; break; case NFSPROC_GETATTR: xdr_argument = xdr_fhandle; xdr_result = xdr_attrstat; local = (char *(*)()) nfsproc_getattr_2; break; case NFSPROC_SETATTR: xdr_argument = xdr_sattrargs; xdr_result = xdr_attrstat; local = (char *(*)()) nfsproc_setattr_2; break; case NFSPROC_ROOT: xdr_argument = xdr_void; xdr_result = xdr_void; local = (char *(*)()) nfsproc_root_2; break; case NFSPROC_LOOKUP: xdr_argument = xdr_diropargs; xdr_result = xdr_diropres; local = (char *(*)()) nfsproc_lookup_2; break; case NFSPROC_READLINK: xdr_argument = xdr_fhandle; xdr_result = xdr_readlinkres; local = (char *(*)()) nfsproc_readlink_2; break; case NFSPROC_READ: xdr_argument = xdr_readargs; xdr_result = xdr_readres; local = (char *(*)()) nfsproc_read_2; break; case NFSPROC_WRITECACHE: xdr_argument = xdr_void; xdr_result = xdr_void; local = (char *(*)()) nfsproc_writecache_2; break; case NFSPROC_WRITE: xdr_argument = xdr_writeargs; xdr_result = xdr_attrstat; local = (char *(*)()) nfsproc_write_2; break; case NFSPROC_CREATE: xdr_argument = xdr_createargs; xdr_result = xdr_diropres; local = (char *(*)()) nfsproc_create_2; break; case NFSPROC_REMOVE: xdr_argument = xdr_diropargs; xdr_result = xdr_stat_enum; local = (char *(*)()) nfsproc_remove_2; break; case NFSPROC_RENAME: xdr_argument = xdr_renameargs; xdr_result = xdr_stat_enum; local = (char *(*)()) nfsproc_rename_2; break; case NFSPROC_LINK: xdr_argument = xdr_linkargs; xdr_result = xdr_stat_enum; local = (char *(*)()) nfsproc_link_2; break; case NFSPROC_SYMLINK: xdr_argument = xdr_symlinkargs; xdr_result = xdr_stat_enum; local = (char *(*)()) nfsproc_symlink_2; break; case NFSPROC_MKDIR: xdr_argument = xdr_createargs; xdr_result = xdr_diropres; local = (char *(*)()) nfsproc_mkdir_2; break; case NFSPROC_RMDIR: xdr_argument = xdr_diropargs; xdr_result = xdr_stat_enum; local = (char *(*)()) nfsproc_rmdir_2; break; case NFSPROC_READDIR: xdr_argument = xdr_readdirargs; xdr_result = xdr_readdirres; local = (char *(*)()) nfsproc_readdir_2; break; case NFSPROC_STATFS: xdr_argument = xdr_fhandle; xdr_result = xdr_statfsres; local = (char *(*)()) nfsproc_statfs_2; break; default: svcerr_noproc(transp); return; } bzero((char *)&argument, sizeof(argument)); if (!svc_getargs(transp, xdr_argument, &argument)) { svcerr_decode(transp); return; } #ifdef MULTITHREAD params = (struct call_params*) malloc (sizeof(struct call_params)); params->rqstp = (struct svc_req*) malloc (sizeof(struct svc_req)); bcopy(rqstp, params->rqstp, sizeof(struct svc_req)); params->transp = transp; params->arg = malloc (sizeof(argument)); bcopy(&argument, params->arg, sizeof(argument)); params->local = local; params->xdr_argument = xdr_argument; params->xdr_result = xdr_result; threadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)nfs_program_2_a, params, 0, &TID); if (!threadHandle) nfs_program_2_a(¶ms); } static void nfs_program_2_a(params) struct call_params *params; { struct svc_req *rqstp; SVCXPRT *transp; void *argument; void (*destroy_proc)(); char *result; bool_t (*xdr_argument)(), (*xdr_result)(); char *(*local)(); argument = params->arg; rqstp = params->rqstp; transp = params->transp; xdr_argument = params->xdr_argument; xdr_result = params->xdr_result; local = params->local; destroy_proc = transp->xp_ops->xp_destroy; transp->xp_ops->xp_destroy = xprt_unregister; #endif result = (*local)(&argument, rqstp); if (result != NULL && !svc_sendreply(transp, xdr_result, result)) { svcerr_systemerr(transp); } #ifdef MULTITHREAD free(params->rqstp); free(params); #endif if (!svc_freeargs(transp, xdr_argument, &argument)) { (void)fprintf(stderr, "unable to free arguments\n"); #ifdef WIN32 rpc_nt_exit(); #endif exit(1); } #ifdef MULTITHREAD free(argument); transp->xp_ops->xp_destroy = destroy_proc; #endif } #ifdef MULTITHREAD struct call_params { struct svc_req *rqstp; SVCXPRT *transp; void *arg; char *(*local)(); bool_t (*xdr_argument)(), (*xdr_result)(); }; static void mountprog_1_a (); static void mountprog_2_a (); #endif static void mountprog_1(rqstp, transp) struct svc_req *rqstp; SVCXPRT *transp; { union { dirpath mountproc_mnt_1_arg; dirpath mountproc_umnt_1_arg; } argument; char *result; bool_t (*xdr_argument)(), (*xdr_result)(); char *(*local)(); #ifdef MULTITHREAD DWORD TID = 0; HANDLE threadHandle = NULL; struct call_params *params; #endif switch (rqstp->rq_proc) { case MOUNTPROC_NULL: xdr_argument = xdr_void; xdr_result = xdr_void; local = (char *(*)()) mountproc_null_1; break; case MOUNTPROC_MNT: xdr_argument = xdr_dirpath; xdr_result = xdr_fhstatus; local = (char *(*)()) mountproc_mnt_1; break; case MOUNTPROC_DUMP: xdr_argument = xdr_void; xdr_result = xdr_mountlist; local = (char *(*)()) mountproc_dump_1; break; case MOUNTPROC_UMNT: xdr_argument = xdr_dirpath; xdr_result = xdr_void; local = (char *(*)()) mountproc_umnt_1; break; case MOUNTPROC_UMNTALL: xdr_argument = xdr_void; xdr_result = xdr_void; local = (char *(*)()) mountproc_umntall_1; break; case MOUNTPROC_EXPORT: xdr_argument = xdr_void; xdr_result = xdr_exports; local = (char *(*)()) mountproc_export_1; break; case MOUNTPROC_EXPORTALL: xdr_argument = xdr_void; xdr_result = xdr_exports; local = (char *(*)()) mountproc_exportall_1; break; default: svcerr_noproc(transp); return; } bzero((char *)&argument, sizeof(argument)); if (!svc_getargs(transp, xdr_argument, &argument)) { svcerr_decode(transp); return; } #ifdef MULTITHREAD params = (struct call_params*) malloc (sizeof(struct call_params)); params->rqstp = (struct svc_req*) malloc (sizeof(struct svc_req)); bcopy(rqstp, params->rqstp, sizeof(struct svc_req)); params->transp = transp; params->arg = malloc (sizeof(argument)); bcopy(&argument, params->arg, sizeof(argument)); params->local = local; params->xdr_argument = xdr_argument; params->xdr_result = xdr_result; threadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)mountprog_1_a, params, 0, &TID); if (!threadHandle) mountprog_1_a(¶ms); } static void mountprog_1_a(params) struct call_params *params; { struct svc_req *rqstp; SVCXPRT *transp; void *argument; void (*destroy_proc)(); char *result; bool_t (*xdr_argument)(), (*xdr_result)(); char *(*local)(); argument = params->arg; rqstp = params->rqstp; transp = params->transp; xdr_argument = params->xdr_argument; xdr_result = params->xdr_result; local = params->local; destroy_proc = transp->xp_ops->xp_destroy; transp->xp_ops->xp_destroy = xprt_unregister; #endif result = (*local)(&argument, rqstp); if (result != NULL && !svc_sendreply(transp, xdr_result, result)) { svcerr_systemerr(transp); } #ifdef MULTITHREAD free(params->rqstp); free(params); #endif if (!svc_freeargs(transp, xdr_argument, &argument)) { (void)fprintf(stderr, "unable to free arguments\n"); #ifdef WIN32 rpc_nt_exit(); #endif exit(1); } #ifdef MULTITHREAD free(argument); transp->xp_ops->xp_destroy = destroy_proc; #endif } static void mountprog_2(rqstp, transp) struct svc_req *rqstp; SVCXPRT *transp; { union { dirpath mountproc_mnt_2_arg; dirpath mountproc_umnt_2_arg; dirpath mountproc_pathconf_2_arg; } argument; char *result; bool_t (*xdr_argument)(), (*xdr_result)(); char *(*local)(); #ifdef MULTITHREAD DWORD TID = 0; HANDLE threadHandle = NULL; struct call_params *params; #endif switch (rqstp->rq_proc) { case MOUNTPROC_NULL: xdr_argument = xdr_void; xdr_result = xdr_void; local = (char *(*)()) mountproc_null_2; break; case MOUNTPROC_MNT: xdr_argument = xdr_dirpath; xdr_result = xdr_fhstatus; local = (char *(*)()) mountproc_mnt_2; break; case MOUNTPROC_DUMP: xdr_argument = xdr_void; xdr_result = xdr_mountlist; local = (char *(*)()) mountproc_dump_2; break; case MOUNTPROC_UMNT: xdr_argument = xdr_dirpath; xdr_result = xdr_void; local = (char *(*)()) mountproc_umnt_2; break; case MOUNTPROC_UMNTALL: xdr_argument = xdr_void; xdr_result = xdr_void; local = (char *(*)()) mountproc_umntall_2; break; case MOUNTPROC_EXPORT: xdr_argument = xdr_void; xdr_result = xdr_exports; local = (char *(*)()) mountproc_export_2; break; case MOUNTPROC_EXPORTALL: xdr_argument = xdr_void; xdr_result = xdr_exports; local = (char *(*)()) mountproc_exportall_2; break; case MOUNTPROC_PATHCONF: xdr_argument = xdr_dirpath; xdr_result = xdr_ppathcnf; local = (char *(*)()) mountproc_pathconf_2; break; default: svcerr_noproc(transp); return; } bzero((char *)&argument, sizeof(argument)); if (!svc_getargs(transp, xdr_argument, &argument)) { svcerr_decode(transp); return; } #ifdef MULTITHREAD params = (struct call_params*) malloc (sizeof(struct call_params)); params->rqstp = (struct svc_req*) malloc (sizeof(struct svc_req)); bcopy(rqstp, params->rqstp, sizeof(struct svc_req)); params->transp = transp; params->arg = malloc (sizeof(argument)); bcopy(&argument, params->arg, sizeof(argument)); params->local = local; params->xdr_argument = xdr_argument; params->xdr_result = xdr_result; threadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)mountprog_2_a, params, 0, &TID); if (!threadHandle) mountprog_2_a(¶ms); } static void mountprog_2_a(params) struct call_params *params; { struct svc_req *rqstp; SVCXPRT *transp; void *argument; void (*destroy_proc)(); char *result; bool_t (*xdr_argument)(), (*xdr_result)(); char *(*local)(); argument = params->arg; rqstp = params->rqstp; transp = params->transp; xdr_argument = params->xdr_argument; xdr_result = params->xdr_result; local = params->local; destroy_proc = transp->xp_ops->xp_destroy; transp->xp_ops->xp_destroy = xprt_unregister; #endif result = (*local)(&argument, rqstp); if (result != NULL && !svc_sendreply(transp, xdr_result, result)) { svcerr_systemerr(transp); } #ifdef MULTITHREAD free(params->rqstp); free(params); #endif if (!svc_freeargs(transp, xdr_argument, &argument)) { (void)fprintf(stderr, "unable to free arguments\n"); #ifdef WIN32 rpc_nt_exit(); #endif exit(1); } #ifdef MULTITHREAD free(argument); transp->xp_ops->xp_destroy = destroy_proc; #endif }