From ead743db5d57afa175f5dc0828b76881bcbcbf54 Mon Sep 17 00:00:00 2001 From: Simon Wilkinson Date: Wed, 7 Sep 2011 18:31:32 +0100 Subject: [PATCH] afsd: Tidy up system calls Tidy up the way that we do system calls from afsd, by making afsd_syscall a va_arg function, using a structure to pass system call information around, and simplifying the #ifdef ladder that converts our platform independent system calls into something platform specific. This fixes all of the warnings in afsd which required the -Wno-error option, the only warnings remaining are related to daemon being deprecated on Darwin. Change-Id: I357c7d175b5327007d50d213c6181881c842050e Reviewed-on: http://gerrit.openafs.org/7188 Tested-by: BuildBot Tested-by: Derrick Brashear Reviewed-by: Derrick Brashear --- README.WARNINGS | 2 - src/afs/UKERNEL/afsd_uafs.c | 6 +- src/afsd/Makefile.in | 2 - src/afsd/afsd.c | 247 +++++++++++++++++++++++++++++--------------- src/afsd/afsd.h | 23 ++++- src/afsd/afsd_kernel.c | 238 +++++++++++++++++++++++------------------- 6 files changed, 317 insertions(+), 201 deletions(-) diff --git a/README.WARNINGS b/README.WARNINGS index 2861fb4..9de861d 100644 --- a/README.WARNINGS +++ b/README.WARNINGS @@ -42,9 +42,7 @@ Inhibited warnings afs/afs_syscall.c : old-style : strict-proto : all (ukernel) : syscall pointer issues -afsd/afsd.c : all : call_syscall nonsense afsd/afsd_kernel.c : deprecated : daemon() marked as deprecated on Darwin - : strict-proto : call_syscall missing prototype auth/ktc.c : all (ukernel) : call_syscall doesn't have a prototype bozo/bosserver.c : deprecated : daemon() marked as deprecated on Darwin bucoord/ubik_db_if.c : strict-proto : Ubik_Call diff --git a/src/afs/UKERNEL/afsd_uafs.c b/src/afs/UKERNEL/afsd_uafs.c index 97994a8..5e2dcdd 100644 --- a/src/afs/UKERNEL/afsd_uafs.c +++ b/src/afs/UKERNEL/afsd_uafs.c @@ -53,10 +53,10 @@ afsd_check_mount(const char *rn, const char *mountdir) } int -afsd_call_syscall(long param1, long param2, long param3, long param4, - long param5) +afsd_call_syscall(struct afsd_syscall_args *args) { - return call_syscall(AFSCALL_CALL, param1, param2, param3, param4, param5); + return call_syscall(AFSCALL_CALL, args->syscall, args->params[0], + args->params[1], args->params[2], args->params[3]); } int diff --git a/src/afsd/Makefile.in b/src/afsd/Makefile.in index 5f96195..861a37c 100644 --- a/src/afsd/Makefile.in +++ b/src/afsd/Makefile.in @@ -51,8 +51,6 @@ vsys: vsys.o # # Objects # -CFLAGS_afsd.o = @CFLAGS_NOERROR@ -CFLAGS_afsd_kernel.o = @CFLAGS_NOERROR@ CFLAGS_afsd_fuse.o = -I${TOP_SRCDIR}/afs -I${TOP_SRCDIR}/afs/UKERNEL \ -I${TOP_SRCDIR}/rx/UKERNEL -DUKERNEL @FUSE_CFLAGS@ diff --git a/src/afsd/afsd.c b/src/afsd/afsd.c index a75e56c..96d3add 100644 --- a/src/afsd/afsd.c +++ b/src/afsd/afsd.c @@ -57,10 +57,6 @@ #include #include -#ifdef IGNORE_SOME_GCC_WARNINGS -# pragma GCC diagnostic warning "-Wdeprecated-declarations" -#endif - #define VFS 1 #include @@ -211,15 +207,15 @@ struct in_addr_42 { /* * Global configuration variables. */ -static afs_int32 enable_rxbind = 0; -static afs_int32 afs_shutdown = 0; -static afs_int32 cacheBlocks; /*Num blocks in the cache */ -static afs_int32 cacheFiles; /*Optimal # of files in workstation cache */ -static afs_int32 rwpct = 0; -static afs_int32 ropct = 0; -static afs_int32 cacheStatEntries; /*Number of stat cache entries */ -static char *cacheBaseDir; /*Where the workstation AFS cache lives */ -static char *confDir; /*Where the workstation AFS configuration lives */ +static int enable_rxbind = 0; +static int afs_shutdown = 0; +static int cacheBlocks; /*Num blocks in the cache */ +static int cacheFiles; /*Optimal # of files in workstation cache */ +static int rwpct = 0; +static int ropct = 0; +static int cacheStatEntries; /*Number of stat cache entries */ +static char *cacheBaseDir; /*Where the workstation AFS cache lives */ +static char *confDir; /*Where the workstation AFS configuration lives */ static char fullpn_DCacheFile[1024]; /*Full pathname of DCACHEFILE */ static char fullpn_VolInfoFile[1024]; /*Full pathname of VOLINFOFILE */ static char fullpn_CellInfoFile[1024]; /*Full pathanem of CELLINFOFILE */ @@ -303,11 +299,13 @@ struct afs_cacheParams cparams; /* params passed to cache manager */ int PartSizeOverflow(char *path, int cs); +static int afsd_syscall(int code, ...); + #if defined(AFS_SUN510_ENV) && defined(RXK_LISTENER_ENV) -static void fork_rx_syscall_wait(); +static void fork_rx_syscall_wait(const char *rn, int syscall, ...); #endif -static void fork_rx_syscall(); -static void fork_syscall(); +static void fork_rx_syscall(const char *rn, int syscall, ...); +static void fork_syscall(const char *rn, int syscall, ...); enum optionsList { OPT_blocks, @@ -398,7 +396,7 @@ afsd_update_addresses(CFRunLoopTimerRef timer, void *info) afs_uint32 addrbuf[MAXIPADDRS], maskbuf[MAXIPADDRS], mtubuf[MAXIPADDRS]; char reason[1024]; - afs_int32 code; + int code; code = parseNetFiles(addrbuf, maskbuf, mtubuf, MAXIPADDRS, reason, @@ -408,7 +406,7 @@ afsd_update_addresses(CFRunLoopTimerRef timer, void *info) if (code > 0) { /* Note we're refreshing */ code = code | 0x40000000; - afsd_call_syscall(AFSOP_ADVISEADDR, code, addrbuf, maskbuf, mtubuf); + afsd_syscall(AFSOP_ADVISEADDR, code, addrbuf, maskbuf, mtubuf); } else printf("ADVISEADDR: Error in specifying interface addresses:%s\n", reason); @@ -538,7 +536,7 @@ ParseCacheInfoFile(void) static char rn[] = "ParseCacheInfoFile"; /*This routine's name */ FILE *cachefd; /*Descriptor for cache info file */ int parseResult; /*Result of our fscanf() */ - afs_int32 tCacheBlocks; + int tCacheBlocks; char tCacheBaseDir[1024], *tbd, tCacheMountDir[1024], *tmd; if (afsd_debug) @@ -1412,7 +1410,7 @@ ConfigCell(struct afsconf_cell *aci, void *arock, struct afsconf_dir *adir) { int isHomeCell; int i, code; - afs_int32 cellFlags = 0; + int cellFlags = 0; afs_int32 hosts[MAXHOSTSPERCELL]; /* figure out if this is the home cell */ @@ -1431,7 +1429,7 @@ ConfigCell(struct afsconf_cell *aci, void *arock, struct afsconf_dir *adir) * for upwards compatibility */ /* configure one cell */ - code = afsd_call_syscall(AFSOP_ADDCELL2, hosts, /* server addresses */ + code = afsd_syscall(AFSOP_ADDCELL2, hosts, /* server addresses */ aci->name, /* cell name */ cellFlags, /* is this the home cell? */ aci->linkedCell); /* Linked cell, if any */ @@ -1445,7 +1443,7 @@ ConfigCellAlias(struct afsconf_cellalias *aca, void *arock, struct afsconf_dir *adir) { /* push the alias into the kernel */ - afsd_call_syscall(AFSOP_ADDCELLALIAS, aca->aliasName, aca->realName); + afsd_syscall(AFSOP_ADDCELLALIAS, aca->aliasName, aca->realName); return 0; } @@ -1476,7 +1474,7 @@ AfsdbLookupHandler(void) /* On some platforms you only get 4 args to an AFS call */ int sizeArg = ((sizeof acellName) << 16) | (sizeof kernelMsg); code = - afsd_call_syscall(AFSOP_AFSDB_HANDLER, acellName, kernelMsg, sizeArg); + afsd_syscall(AFSOP_AFSDB_HANDLER, acellName, kernelMsg, sizeArg); if (code) { /* Something is wrong? */ sleep(1); continue; @@ -1531,7 +1529,7 @@ BkgHandler(void) /* pushing in a buffer this large */ uspc->bufSz = 256; - code = afsd_call_syscall(AFSOP_BKG_HANDLER, uspc, srcName, dstName); + code = afsd_syscall(AFSOP_BKG_HANDLER, uspc, srcName, dstName); if (code) { /* Something is wrong? */ if (code == -2) /* shutting down */ break; @@ -1646,10 +1644,8 @@ daemon_thread(void *rock) exit(1); } BkgHandler(); -#elif defined(AFS_AIX32_ENV) - afsd_call_syscall(AFSOP_START_BKG, 0); #else - afsd_call_syscall(AFSOP_START_BKG); + afsd_syscall(AFSOP_START_BKG, 0); #endif return NULL; } @@ -1765,7 +1761,7 @@ mainproc(struct cmd_syndesc *as, void *arock) * Cold shutdown is the default */ printf("afsd: Shutting down all afs processes and afs state\n"); - code = afsd_call_syscall(AFSOP_SHUTDOWN, 1); + code = afsd_syscall(AFSOP_SHUTDOWN, 1); if (code) { printf("afsd: AFS still mounted; Not shutting down\n"); exit(1); @@ -1819,7 +1815,7 @@ mainproc(struct cmd_syndesc *as, void *arock) int rxpck; cmd_OptionAsInt(as, OPT_rxpck, &rxpck); printf("afsd: set rxpck = %d\n", rxpck); - code = afsd_call_syscall(AFSOP_SET_RXPCK, rxpck); + code = afsd_syscall(AFSOP_SET_RXPCK, rxpck); if (code) { printf("afsd: failed to set rxpck\n"); exit(1); @@ -1886,7 +1882,7 @@ afsd_run(void) struct afsconf_dir *cdir; /* config dir */ int lookupResult; /*Result of GetLocalCellName() */ int i; - afs_int32 code; /*Result of fork() */ + int code; /*Result of fork() */ char *fsTypeMsg = NULL; int cacheIteration; /*How many times through cache verification */ int vFilesFound; /*How many data cache files were found in sweep */ @@ -2116,7 +2112,7 @@ afsd_run(void) /* * Set the primary cell name. */ - afsd_call_syscall(AFSOP_SET_THISCELL, LclCellName); + afsd_syscall(AFSOP_SET_THISCELL, LclCellName); /* Initialize RX daemons and services */ @@ -2133,7 +2129,7 @@ afsd_run(void) if (code > 0) { if (enable_rxbind) code = code | 0x80000000; - afsd_call_syscall(AFSOP_ADVISEADDR, code, addrbuf, maskbuf, mtubuf); + afsd_syscall(AFSOP_ADVISEADDR, code, addrbuf, maskbuf, mtubuf); } else printf("ADVISEADDR: Error in specifying interface addresses:%s\n", reason); @@ -2167,7 +2163,7 @@ afsd_run(void) fork_rx_syscall(rn, AFSOP_START_RXCALLBACK, preallocs, enable_peer_stats, enable_process_stats); #else - fork_syscall(rn, AFSOP_START_RXCALLBACK, preallocs); + fork_syscall(rn, AFSOP_START_RXCALLBACK, preallocs, 0, 0); #endif #if defined(AFS_SUN5_ENV) || defined(RXK_LISTENER_ENV) || defined(RXK_UPCALL_ENV) if (afsd_verbose) @@ -2180,7 +2176,7 @@ afsd_run(void) printf("%s: Forking AFSDB lookup handler.\n", rn); afsd_fork(0, afsdb_thread, NULL); } - code = afsd_call_syscall(AFSOP_BASIC_INIT, 1); + code = afsd_syscall(AFSOP_BASIC_INIT, 1); if (code) { printf("%s: Error %d in basic initialization.\n", rn, code); exit(1); @@ -2204,16 +2200,16 @@ afsd_run(void) cparams.setTimeFlag = 0; cparams.memCacheFlag = cacheFlags; cparams.dynamic_vcaches = afsd_dynamic_vcaches; - afsd_call_syscall(AFSOP_CACHEINIT, &cparams); + afsd_syscall(AFSOP_CACHEINIT, &cparams); /* do it before we init the cache inodes */ if (enable_splitcache) { - afsd_call_syscall(AFSOP_BUCKETPCT, 1, rwpct); - afsd_call_syscall(AFSOP_BUCKETPCT, 2, ropct); + afsd_syscall(AFSOP_BUCKETPCT, 1, rwpct); + afsd_syscall(AFSOP_BUCKETPCT, 2, ropct); } if (afsd_CloseSynch) - afsd_call_syscall(AFSOP_CLOSEWAIT); + afsd_syscall(AFSOP_CLOSEWAIT); /* * Sweep the workstation AFS cache directory, remembering the inodes of @@ -2254,7 +2250,7 @@ afsd_run(void) fullpn_DCacheFile); /* once again, meaningless for a memory-based cache. */ if (!(cacheFlags & AFSCALL_INIT_MEMCACHE)) - afsd_call_syscall(AFSOP_CACHEINFO, fullpn_DCacheFile); + afsd_syscall(AFSOP_CACHEINFO, fullpn_DCacheFile); /* * Pass the kernel the name of the workstation cache file holding the @@ -2264,13 +2260,13 @@ afsd_run(void) if (afsd_debug) printf("%s: Calling AFSOP_CELLINFO: cell info file is '%s'\n", rn, fullpn_CellInfoFile); - afsd_call_syscall(AFSOP_CELLINFO, fullpn_CellInfoFile); + afsd_syscall(AFSOP_CELLINFO, fullpn_CellInfoFile); } if (rxmaxfrags) { if (afsd_verbose) printf("%s: Setting rxmaxfrags in kernel = %d\n", rn, rxmaxfrags); - code = afsd_call_syscall(AFSOP_SET_RXMAXFRAGS, rxmaxfrags); + code = afsd_syscall(AFSOP_SET_RXMAXFRAGS, rxmaxfrags); if (code) printf("%s: Error seting rxmaxfrags\n", rn); } @@ -2278,7 +2274,7 @@ afsd_run(void) if (rxmaxmtu) { if (afsd_verbose) printf("%s: Setting rxmaxmtu in kernel = %d\n", rn, rxmaxmtu); - code = afsd_call_syscall(AFSOP_SET_RXMAXMTU, rxmaxmtu); + code = afsd_syscall(AFSOP_SET_RXMAXMTU, rxmaxmtu); if (code) printf("%s: Error seting rxmaxmtu\n", rn); } @@ -2287,7 +2283,7 @@ afsd_run(void) if (afsd_verbose) printf("%s: Enabling dynroot support in kernel%s.\n", rn, (enable_dynroot==2)?", not showing cells.":""); - code = afsd_call_syscall(AFSOP_SET_DYNROOT, 1); + code = afsd_syscall(AFSOP_SET_DYNROOT, 1); if (code) printf("%s: Error enabling dynroot support.\n", rn); } @@ -2297,7 +2293,7 @@ afsd_run(void) printf("%s: Enabling fakestat support in kernel%s.\n", rn, (enable_fakestat==1)?" for all mountpoints." :" for crosscell mountpoints"); - code = afsd_call_syscall(AFSOP_SET_FAKESTAT, enable_fakestat); + code = afsd_syscall(AFSOP_SET_FAKESTAT, enable_fakestat); if (code) printf("%s: Error enabling fakestat support.\n", rn); } @@ -2305,7 +2301,7 @@ afsd_run(void) if (enable_backuptree) { if (afsd_verbose) printf("%s: Enabling backup tree support in kernel.\n", rn); - code = afsd_call_syscall(AFSOP_SET_BACKUPTREE, enable_backuptree); + code = afsd_syscall(AFSOP_SET_BACKUPTREE, enable_backuptree); if (code) printf("%s: Error enabling backup tree support.\n", rn); } @@ -2353,7 +2349,7 @@ afsd_run(void) if (afsd_verbose) printf("%s: Calling AFSOP_ROOTVOLUME with '%s'\n", rn, rootVolume); - afsd_call_syscall(AFSOP_ROOTVOLUME, rootVolume); + afsd_syscall(AFSOP_ROOTVOLUME, rootVolume); } /* @@ -2365,7 +2361,7 @@ afsd_run(void) fullpn_VolInfoFile); /* once again, meaningless for a memory-based cache. */ if (!(cacheFlags & AFSCALL_INIT_MEMCACHE)) - afsd_call_syscall(AFSOP_VOLUMEINFO, fullpn_VolInfoFile); + afsd_syscall(AFSOP_VOLUMEINFO, fullpn_VolInfoFile); /* * Give the kernel the names of the AFS files cached on the workstation's @@ -2381,7 +2377,7 @@ afsd_run(void) for (currVFile = 0; currVFile < cacheFiles; currVFile++) { if (!nocachefile) { sprintf(fullpn_VFile, "%s/D%d/V%d", cacheBaseDir, dir_for_V[currVFile], currVFile); - code = afsd_call_syscall(AFSOP_CACHEFILE, fullpn_VFile); + code = afsd_syscall(AFSOP_CACHEFILE, fullpn_VFile); if (code) { if (currVFile == 0) { if (afsd_debug) @@ -2400,12 +2396,8 @@ afsd_run(void) } /* fall through to setup-by-inode */ } -#ifdef AFS_SGI62_ENV - afsd_call_syscall(AFSOP_CACHEINODE, - (afs_uint32) (inode_for_V[currVFile] >> 32), - (afs_uint32) (inode_for_V[currVFile] & 0xffffffff)); -#elif !(defined(AFS_LINUX26_ENV) || defined(AFS_CACHE_VNODE_PATH)) - afsd_call_syscall(AFSOP_CACHEINODE, inode_for_V[currVFile]); +#if defined(AFS_SGI62_ENV) || !(defined(AFS_LINUX26_ENV) || defined(AFS_CACHE_VNODE_PATH)) + afsd_syscall(AFSOP_CACHEINODE, inode_for_V[currVFile]); #else printf ("%s: Error calling AFSOP_CACHEINODE: not configured\n", @@ -2422,7 +2414,7 @@ afsd_run(void) if (afsd_debug) printf("%s: Calling AFSOP_GO with cacheSetTime = %d\n", rn, 0); - afsd_call_syscall(AFSOP_GO, 0); + afsd_syscall(AFSOP_GO, 0); /* * At this point, we have finished passing the kernel all the info @@ -2562,17 +2554,6 @@ afsd_parse(int argc, char **argv) return cmd_Dispatch(argc, argv); } -struct afsd_syscall_args { - long syscall; - long param1; - long param2; - long param3; - long param4; - long param5; - const char *rn; - int rxpri; -}; - /** * entry point for calling a syscall from another proc/thread. * @@ -2591,8 +2572,7 @@ call_syscall_thread(void *rock) afsd_set_rx_rtpri(); } - code = afsd_call_syscall(args->syscall, args->param1, args->param2, - args->param3, args->param4, args->param5); + code = afsd_call_syscall(args); if (code && args->syscall == AFSOP_START_CS) { printf("%s: No check server daemon in client.\n", args->rn); } @@ -2602,6 +2582,86 @@ call_syscall_thread(void *rock) return NULL; } +static void +afsd_syscall_populate(struct afsd_syscall_args *args, int syscall, va_list ap) +{ + afsd_syscall_param_t *params; + + memset(args, 0, sizeof(struct afsd_syscall_args)); + + args->syscall = syscall; + params = args->params; + + switch (syscall) { + case AFSOP_RXEVENT_DAEMON: + break; + case AFSOP_START_BKG: + case AFSOP_SHUTDOWN: + case AFSOP_SET_RXPCK: + case AFSOP_BASIC_INIT: + case AFSOP_SET_RXMAXFRAGS: + case AFSOP_SET_RXMAXMTU: + case AFSOP_SET_DYNROOT: + case AFSOP_SET_FAKESTAT: + case AFSOP_SET_BACKUPTREE: + case AFSOP_GO: + params[0] = CAST_SYSCALL_PARAM((va_arg(ap, int))); + break; + case AFSOP_SET_THISCELL: + case AFSOP_ROOTVOLUME: + case AFSOP_VOLUMEINFO: + case AFSOP_CACHEFILE: + params[0] = CAST_SYSCALL_PARAM((va_arg(ap, void *))); + break; + case AFSOP_ADDCELLALIAS: + params[0] = CAST_SYSCALL_PARAM((va_arg(ap, void *))); + params[1] = CAST_SYSCALL_PARAM((va_arg(ap, void *))); + break; + case AFSOP_AFSDB_HANDLER: + params[0] = CAST_SYSCALL_PARAM((va_arg(ap, void *))); + params[1] = CAST_SYSCALL_PARAM((va_arg(ap, void *))); + params[2] = CAST_SYSCALL_PARAM((va_arg(ap, int))); + break; + case AFSOP_BKG_HANDLER: + params[0] = CAST_SYSCALL_PARAM((va_arg(ap, void *))); + params[1] = CAST_SYSCALL_PARAM((va_arg(ap, void *))); + params[2] = CAST_SYSCALL_PARAM((va_arg(ap, void *))); + break; + case AFSOP_RXLISTENER_DAEMON: + case AFSOP_START_RXCALLBACK: + params[0] = CAST_SYSCALL_PARAM((va_arg(ap, int))); + params[1] = CAST_SYSCALL_PARAM((va_arg(ap, int))); + params[2] = CAST_SYSCALL_PARAM((va_arg(ap, int))); + break; + case AFSOP_ADVISEADDR: + params[0] = CAST_SYSCALL_PARAM((va_arg(ap, int))); + params[1] = CAST_SYSCALL_PARAM((va_arg(ap, void *))); + params[2] = CAST_SYSCALL_PARAM((va_arg(ap, void *))); + params[3] = CAST_SYSCALL_PARAM((va_arg(ap, void *))); + break; + case AFSOP_ADDCELL2: + params[0] = CAST_SYSCALL_PARAM((va_arg(ap, void *))); + params[1] = CAST_SYSCALL_PARAM((va_arg(ap, void *))); + params[2] = CAST_SYSCALL_PARAM((va_arg(ap, afs_int32))); + params[3] = CAST_SYSCALL_PARAM((va_arg(ap, void *))); + break; + case AFSOP_CACHEINODE: +#if defined AFS_SGI62_ENV + { + afs_int64 tmp = va_arg(ap, afs_int64); + params[0] = CAST_SYSCALL_PARAM((afs_uint32)(tmp >> 32)); + params[1] = CAST_SYSCALL_PARAM((afs_uint32)(tmp & 0xffffffff)); + } +#else + params[0] = CAST_SYSCALL_PARAM((va_arg(ap, afs_uint32))); +#endif + break; + default: + printf("Unknown syscall enountered: %d\n", syscall); + opr_Assert(0); + } +} + /** * common code for calling a syscall in another proc/thread. * @@ -2612,19 +2672,12 @@ call_syscall_thread(void *rock) * @param[in] syscall syscall to run */ static void -fork_syscall_impl(int rx, int wait, const char *rn, long syscall, long param1, - long param2, long param3, long param4, long param5) +fork_syscall_impl(int rx, int wait, const char *rn, int syscall, va_list ap) { struct afsd_syscall_args *args; args = malloc(sizeof(*args)); - - args->syscall = syscall; - args->param1 = param1; - args->param2 = param2; - args->param3 = param3; - args->param4 = param4; - args->param5 = param5; + afsd_syscall_populate(args, syscall, ap); args->rxpri = rx; args->rn = rn; @@ -2635,20 +2688,26 @@ fork_syscall_impl(int rx, int wait, const char *rn, long syscall, long param1, * call a syscall in another process or thread. */ static void -fork_syscall(const char *rn, long syscall, long param1, long param2, - long param3, long param4, long param5) +fork_syscall(const char *rn, int syscall, ...) { - fork_syscall_impl(0, 0, rn, syscall, param1, param2, param3, param4, param5); + va_list ap; + + va_start(ap, syscall); + fork_syscall_impl(0, 0, rn, syscall, ap); + va_end(ap); } /** * call a syscall in another process or thread, and give it RX priority. */ static void -fork_rx_syscall(const char *rn, long syscall, long param1, long param2, - long param3, long param4, long param5) +fork_rx_syscall(const char *rn, int syscall, ...) { - fork_syscall_impl(1, 0, rn, syscall, param1, param2, param3, param4, param5); + va_list ap; + + va_start(ap, syscall); + fork_syscall_impl(1, 0, rn, syscall, ap); + va_end(ap); } #if defined(AFS_SUN510_ENV) && defined(RXK_LISTENER_ENV) @@ -2657,9 +2716,25 @@ fork_rx_syscall(const char *rn, long syscall, long param1, long param2, * for it to finish before returning. */ static void -fork_rx_syscall_wait(const char *rn, long syscall, long param1, long param2, - long param3, long param4, long param5) +fork_rx_syscall_wait(const char *rn, int syscall, ...) { - fork_syscall_impl(1, 1, rn, syscall, param1, param2, param3, param4, param5); + va_list ap; + + va_start(ap, syscall); + fork_syscall_impl(1, 1, rn, syscall, ap); + va_end(ap); } #endif /* AFS_SUN510_ENV && RXK_LISTENER_ENV */ + +static int +afsd_syscall(int syscall, ...) +{ + va_list ap; + struct afsd_syscall_args args; + + va_start(ap, syscall); + afsd_syscall_populate(&args, syscall, ap); + va_end(ap); + + return afsd_call_syscall(&args); +} diff --git a/src/afsd/afsd.h b/src/afsd/afsd.h index 28b5ec3..a30d565 100644 --- a/src/afsd/afsd.h +++ b/src/afsd/afsd.h @@ -25,12 +25,33 @@ int afsd_run(void); /* a function that is called from afsd_fork in a new process/thread */ typedef void* (*afsd_callback_func) (void *rock); +/* syscall nonsense. Here goes! */ +#ifdef AFS_DARWIN100_ENV +typedef user_addr_t afsd_syscall_param_t; +#elif AFS_DARWIN80_ENV +typedef unsigned int afsd_syscall_param_t; +#else +typedef long afsd_syscall_param_t; +#endif + +#ifdef AFS_DARWIN100_ENV +#define CAST_SYSCALL_PARAM(X) CAST_USER_ADDR_T(X) +#else +#define CAST_SYSCALL_PARAM(X) ((afsd_syscall_param_t) X) +#endif +struct afsd_syscall_args { + int syscall; + afsd_syscall_param_t params[7]; + const char *rn; + int rxpri; +}; + /* afsd.c expects these to be implemented; it does not implement them itself! */ void afsd_mount_afs(const char *rn, const char *mountdir); int afsd_check_mount(const char *rn, const char *mountdir); void afsd_set_rx_rtpri(void); void afsd_set_afsd_rtpri(void); -int afsd_call_syscall(); +int afsd_call_syscall(struct afsd_syscall_args *args); int afsd_fork(int wait, afsd_callback_func cbf, void *rock); int afsd_daemon(int nochdir, int noclose); diff --git a/src/afsd/afsd_kernel.c b/src/afsd/afsd_kernel.c index eeb42af..8e5caee 100644 --- a/src/afsd/afsd_kernel.c +++ b/src/afsd/afsd_kernel.c @@ -12,6 +12,10 @@ #include +#ifdef IGNORE_SOME_GCC_WARNINGS +# pragma GCC diagnostic warning "-Wdeprecated-declarations" +#endif + #define VFS 1 #include @@ -128,136 +132,156 @@ afsd_set_afsd_rtpri(void) SET_AFSD_RTPRI(); } -#if !defined(AFS_SGI_ENV) && !defined(AFS_AIX32_ENV) - +#if defined(AFS_LINUX20_ENV) int -afsd_call_syscall(long param1, long param2, long param3, long param4, long param5, - long param6, long param7) +os_syscall(struct afsd_syscall_args *args) { int error; -# ifdef AFS_LINUX20_ENV - long eparm[4]; struct afsprocdata syscall_data; + int fd = open(PROC_SYSCALL_FNAME, O_RDWR); if (fd < 0) fd = open(PROC_SYSCALL_ARLA_FNAME, O_RDWR); - eparm[0] = param4; - eparm[1] = param5; - eparm[2] = param6; - eparm[3] = param7; - param4 = (long)eparm; + if (fd < 0) + return -1; syscall_data.syscall = AFSCALL_CALL; - syscall_data.param1 = param1; - syscall_data.param2 = param2; - syscall_data.param3 = param3; - syscall_data.param4 = param4; - if (fd > 0) { - error = ioctl(fd, VIOC_SYSCALL, &syscall_data); - close(fd); - } else -# endif /* AFS_LINUX20_ENV */ -# ifdef AFS_DARWIN80_ENV - struct afssysargs syscall_data; - void *ioctldata; - int fd = open(SYSCALL_DEV_FNAME,O_RDWR); - int syscallnum; -#ifdef AFS_DARWIN100_ENV - int is64 = 0; - struct afssysargs64 syscall64_data; - if (sizeof(param1) == 8) { - syscallnum = VIOC_SYSCALL64; - is64 = 1; - ioctldata = &syscall64_data; - syscall64_data.syscall = (int)AFSCALL_CALL; - syscall64_data.param1 = param1; - syscall64_data.param2 = param2; - syscall64_data.param3 = param3; - syscall64_data.param4 = param4; - syscall64_data.param5 = param5; - syscall64_data.param6 = param6; - } else { -#endif - syscallnum = VIOC_SYSCALL; - ioctldata = &syscall_data; - syscall_data.syscall = AFSCALL_CALL; - syscall_data.param1 = param1; - syscall_data.param2 = param2; - syscall_data.param3 = param3; - syscall_data.param4 = param4; - syscall_data.param5 = param5; - syscall_data.param6 = param6; -#ifdef AFS_DARWIN100_ENV - } -#endif - if(fd >= 0) { - error = ioctl(fd, syscallnum, ioctldata); - close(fd); - } else { - error = -1; - } - if (!error) { -#ifdef AFS_DARWIN100_ENV - if (is64) - error=syscall64_data.retval; - else -#endif - error=syscall_data.retval; - } -# elif defined(AFS_SUN511_ENV) - { - int rval; - rval = ioctl_sun_afs_syscall(AFSCALL_CALL, param1, param2, param3, - param4, param5, param6, &error); - if (rval) { - error = rval; - } - } -# else /* AFS_DARWIN80_ENV */ - error = - syscall(AFS_SYSCALL, AFSCALL_CALL, param1, param2, param3, param4, - param5, param6, param7); -# endif /* !AFS_DARWIN80_ENV */ + syscall_data.param1 = args->syscall; + syscall_data.param2 = args->params[0]; + syscall_data.param3 = args->params[1]; + syscall_data.param4 = (long) &args->params[2]; - if (afsd_debug) { -#ifdef AFS_NBSD40_ENV - char *s = strerror(errno); - printf("SScall(%d, %d, %d)=%d (%d, %s)\n", AFS_SYSCALL, AFSCALL_CALL, - param1, error, errno, s); -#else - printf("SScall(%d, %d, %ld)=%d ", AFS_SYSCALL, AFSCALL_CALL, param1, - error); -#endif - } + error = ioctl(fd, VIOC_SYSCALL, &syscall_data); + close(fd); - return (error); + return error; } -#else /* !AFS_SGI_ENV && !AFS_AIX32_ENV */ -# if defined(AFS_SGI_ENV) -int -afsd_call_syscall(call, parm0, parm1, parm2, parm3, parm4) +#elif defined(AFS_DARWIN80_ENV) + +# if defined(AFS_DARWIN100_ENV) +static int +os_syscall64(struct afsd_syscall_args *args) { + int error; + struct afssysargs64 syscall64_data; + int fd = open(SYSCALL_DEV_FNAME, O_RDWR); + if (fd < 0) + return -1; + + syscall64_data.syscall = (int)AFSCALL_CALL; + syscall64_data.param1 = args->syscall; + syscall64_data.param2 = args->params[0]; + syscall64_data.param3 = args->params[1]; + syscall64_data.param4 = args->params[2]; + syscall64_data.param5 = args->params[3]; + syscall64_data.param6 = args->params[4]; + + error = ioctl(fd, VIOC_SYSCALL64, syscall64_data); + close(fd); + + if (error) + return error; + + return syscall64_data.retval; +} +# endif + +static int +os_syscall(struct afsd_syscall_args *args) +{ int error; + struct afssysargs syscall_data; + int fd; - error = afs_syscall(call, parm0, parm1, parm2, parm3, parm4); - if (afsd_verbose) - printf("SScall(%d, %d)=%d ", call, parm0, error); +# ifdef AFS_DARWIN100_ENV + if (sizeof(long) == 8) + return os_syscall64(args); +# endif - return error; + fd = open(SYSCALL_DEV_FNAME, O_RDWR); + if (fd < 0) + return -1; + + syscall_data.syscall = AFSCALL_CALL; + syscall_data.param1 = (unsigned int)(uintptr_t)args->syscall; + syscall_data.param2 = (unsigned int)(uintptr_t)args->params[0]; + syscall_data.param3 = (unsigned int)(uintptr_t)args->params[1]; + syscall_data.param4 = (unsigned int)(uintptr_t)args->params[2]; + syscall_data.param5 = (unsigned int)(uintptr_t)args->params[3]; + syscall_data.param6 = (unsigned int)(uintptr_t)args->params[4]; + + error = ioctl(fd, VIOC_SYSCALL, syscall_data); + close(fd); + + if (error) + return error; + + return syscall_data.retval; } -# else /* AFS_SGI_ENV */ -int -afsd_call_syscall(call, parm0, parm1, parm2, parm3, parm4, parm5, parm6) + +#elif defined(AFS_SUN511_ENV) +static int +os_syscall(struct afsd_syscall_args *args) { + int retval; + + error = ioctl_sun_afs_syscall(AFSCALL_CALL, args->syscall, + args->params[0], args->params[1], + args->params[2], args->params[3], + args->params[4], &retval); + if (error) + return error; - return syscall(AFSCALL_CALL, call, parm0, parm1, parm2, parm3, parm4, - parm5, parm6); + return retval; } -# endif /* !AFS_SGI_ENV */ -#endif /* AFS_SGI_ENV || AFS_AIX32_ENV */ +#elif defined(AFS_SGI_ENV) +static int +os_syscall(struct afsd_syscall_args *args) +{ + return afs_syscall(args->syscall, args->params[0], args->params[1], + args->params[2], args->params[3], args->params[4]); +} +#elif defined(AFS_AIX32_ENV) +static int +os_syscall(struct afsd_syscall_args *args) +{ + return syscall(AFSCALL_CALL, args->syscall, + args->params[0], args->params[1], args->params[2], + args->params[3], args->params[4], args->params[5], + args->params[6]); +} +#else +static int +os_syscall(struct afsd_syscall_args *args) +{ + return syscall(AFS_SYSCALL, AFSCALL_CALL, args->syscall, + args->params[0], args->params[1], args->params[2], + args->params[3], args->params[4], args->params[5]); +} +#endif + +int +afsd_call_syscall(struct afsd_syscall_args *args) +{ + int error; + + error = os_syscall(args); + if (afsd_debug) { +#ifdef AFS_NBSD40_ENV + char *s = strerror(errno); + printf("SScall(%d, %d, %d)=%d (%d, %s)\n", AFS_SYSCALL, AFSCALL_CALL, + (int)args->params[0], error, errno, s); +#else + printf("SScall(%d, %d, %d)=%d ", AFS_SYSCALL, AFSCALL_CALL, + (int)args->params[0], error); +#endif + } + + return error; +} #ifdef AFS_AIX_ENV /* Special handling for AIX's afs mount operation since they require much more -- 1.9.4