00001
00002
00003
00004
00005
00006
00007
00008 #include <SUM.h>
00009 #include <sys/socket.h>
00010 #include <sys/errno.h>
00011 #include <sys/time.h>
00012 #include <rpc/rpc.h>
00013 #include <rpc/pmap_clnt.h>
00014 #include <signal.h>
00015 #include <sum_rpc.h>
00016 #include <soi_error.h>
00017 #if defined(SUMS_TAPE_AVAILABLE) && SUMS_TAPE_AVAILABLE
00018 #include <tape.h>
00019 #endif
00020 #include <printk.h>
00021 #include <unistd.h>
00022 #include "serverdefs.h"
00023
00024 extern PART ptabx[];
00025
00026 void logkey();
00027 extern int errno;
00028 extern Sinfoarray sarray;
00029 static void sumprog_1();
00030 static void sumprog_1_array();
00031 struct timeval TIMEOUT = { 10, 0 };
00032 uint32_t rinfo;
00033 uint32_t sumprog, sumvers;
00034
00035 int rrid = 0;
00036 float ftmp;
00037 char jsoc_machine[MAX_STR];
00038 static struct timeval first[4], second[4];
00039
00040 FILE *logfp;
00041 CLIENT *current_client, *clnttape, *clnttape_old;
00042 SVCXPRT *glb_transp;
00043 char *dbname;
00044 char thishost[MAX_STR];
00045 char usedhost[MAX_STR];
00046 char hostn[MAX_STR];
00047 char logname[MAX_STR];
00048 char newlogname[MAX_STR];
00049 char datestr[32];
00050 char timetag[32];
00051 int thispid;
00052 int soi_errno = NO_ERROR;
00053 int debugflg = 0;
00054 int sim = 0;
00055 int tapeoffline = 0;
00056 int newlog = 0;
00057 int logcnt = 0;
00058
00059
00060 void StartTimer(int n)
00061 {
00062 gettimeofday (&first[n], NULL);
00063 }
00064
00065 float StopTimer(int n)
00066 {
00067 gettimeofday (&second[n], NULL);
00068 if (first[n].tv_usec > second[n].tv_usec) {
00069 second[n].tv_usec += 1000000;
00070 second[n].tv_sec--;
00071 }
00072 return (float) (second[n].tv_sec-first[n].tv_sec) +
00073 (float) (second[n].tv_usec-first[n].tv_usec)/1000000.0;
00074 }
00075
00076
00077 void open_log(char *filename)
00078 {
00079 if((logfp=fopen(filename, "a+")) == NULL) {
00080 fprintf(stderr, "Can't open the log file %s\n", filename);
00081 }
00082 }
00083
00084
00085
00086
00087 char *datestring()
00088 {
00089 struct timeval tvalr;
00090 struct tm *t_ptr;
00091
00092 gettimeofday(&tvalr, NULL);
00093 t_ptr = localtime((const time_t *)&tvalr);
00094 sprintf(datestr, "%s", asctime(t_ptr));
00095 datestr[19] = (char)NULL;
00096 return(&datestr[4]);
00097 }
00098
00099
00100 char *gettimetag()
00101 {
00102 struct timeval tvalr;
00103 struct tm *t_ptr;
00104
00105 gettimeofday(&tvalr, NULL);
00106 t_ptr = localtime((const time_t *)&tvalr);
00107 sprintf(timetag, "%04d.%02d.%02d.%02d%02d%02d",
00108 (t_ptr->tm_year+1900), (t_ptr->tm_mon+1), t_ptr->tm_mday, t_ptr->tm_hour, t_ptr->tm_min, t_ptr->tm_sec);
00109 return(timetag);
00110 }
00111
00112
00113
00114
00115 int write_log(const char *fmt, ...)
00116 {
00117 va_list args;
00118 char string[4096];
00119
00120 va_start(args, fmt);
00121 vsprintf(string, fmt, args);
00122 if(logfp) {
00123 fprintf(logfp, string);
00124 fflush(logfp);
00125 }
00126 else
00127 fprintf(stderr, string);
00128 va_end(args);
00129 return(0);
00130 }
00131
00132
00133 void sighandler(sig)
00134 int sig;
00135 {
00136 printf("sig = %d\n", sig);
00137 if(sig == SIGTERM) {
00138 write_log("*** %s Sdelser got SIGTERM. Exiting.\n", datestring());
00139 exit(1);
00140 }
00141 if(sig == SIGINT) {
00142 write_log("*** %s Sdelser got SIGINT. Exiting.\n", datestring());
00143 DS_DisConnectDB();
00144 exit(1);
00145 }
00146 write_log("*** %s Sdelser got an illegal signal %d, ignoring...\n",
00147 datestring(), sig);
00148 if (signal(SIGINT, SIG_IGN) != SIG_IGN)
00149 signal(SIGINT, sighandler);
00150 if (signal(SIGALRM, SIG_IGN) != SIG_IGN)
00151 signal(SIGALRM, sighandler);
00152 }
00153
00154
00155
00156
00157 void usr1_sig(int sig)
00158 {
00159 write_log("%s usr1_sig received by Sdelser\n", datestring());
00160
00161 logcnt++;
00162 write_log("%s Closing the current log file. Goodby.\n", datestring());
00163 fclose(logfp);
00164 sprintf(newlogname, "%s_%d", logname, logcnt);
00165 open_log(newlogname);
00166 write_log("\n## %s reopen log Sdelser on %s for pid = %d ##\n",
00167 datestring(), thishost, thispid);
00168 signal(SIGUSR1, &usr1_sig);
00169 }
00170
00171
00172 void get_cmd(int argc, char *argv[])
00173 {
00174 int c;
00175 char *username, *cptr, *cptr2;
00176
00177 if(!(username = (char *)getenv("USER"))) username = "nouser";
00178 if(strcmp(username, SUMS_MANAGER)) {
00179 printf("!!NOTE: You must be user %s to run sum_svc!\n", SUMS_MANAGER);
00180 exit(1);
00181 }
00182
00183 while((--argc > 0) && ((*++argv)[0] == '-')) {
00184 while((c = *++argv[0])) {
00185 switch(c) {
00186 case 'd':
00187 debugflg=1;
00188 break;
00189 case 's':
00190 sim=1;
00191 break;
00192 case 'o':
00193 tapeoffline=1;
00194 break;
00195 default:
00196 break;
00197 }
00198 }
00199 }
00200 if(argc != 2) {
00201 printf("!!ERROR: program needs 2 args: dbname and logfilename. e.g:\n");
00202 printf("Sdelser jsoc_sums sum_svc_2011.06.06.140140.log\n");
00203 exit(1);
00204 }
00205 dbname = argv[0];
00206
00207
00208
00209 sprintf(logname, "%s/%s", SUMLOG_BASEDIR, argv[1]);
00210 if(cptr = strstr(logname, "_R")) {
00211 if(cptr2 = strstr(logname, "log_R")) {
00212 *(cptr2+3) = (char)NULL;
00213 logcnt = 0;
00214 open_log(logname);
00215 }
00216 else if(cptr2 = strstr(logname, "log_")) {
00217 *cptr= (char)NULL;
00218 open_log(logname);
00219 *(cptr2+3) = (char)NULL;
00220 cptr2 = cptr2 + 4;
00221 sscanf(cptr2, "%d", &logcnt);
00222 }
00223 else {
00224 printf("!!ERROR: called with NG log file name: %s\n", logname);
00225 exit(1);
00226 }
00227 }
00228 else { open_log(logname); }
00229 }
00230
00231
00232 void setup()
00233 {
00234 FILE *fplog;
00235 int tpid, i;
00236 char *cptr, *machine;
00237 char lfile[MAX_STR], acmd[MAX_STR], line[MAX_STR];
00238
00239
00240
00241
00242
00243 sprintf(thishost, "localhost");
00244 gethostname(hostn, 80);
00245 cptr = index(hostn, '.');
00246 if(cptr) *cptr = (char)NULL;
00247
00248 sumprog = SUMDELSER;
00249 sumvers = SUMDELSERV;
00250
00251 thispid = getpid();
00252 if(!(machine = (char *)getenv("JSOC_MACHINE"))) {
00253 sprintf(jsoc_machine, "NOTGIVEN");
00254 write_log("!!WARNING: No JSOC_MACHINE in env\n");
00255 write_log("SUMLIB_InfoGetArray() calls will fail\n");
00256 }
00257 else
00258 sprintf(jsoc_machine, "%s", machine);
00259
00260
00261 printk_set(write_log, write_log);
00262 write_log("\n## %s Sdelser on %s (%s) for pid = %d ##\n",
00263 datestring(), thishost, hostn, thispid);
00264
00265
00266 signal(SIGINT, sighandler);
00267 if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
00268 signal(SIGTERM, sighandler);
00269 if (signal(SIGALRM, SIG_IGN) != SIG_IGN)
00270 signal(SIGALRM, sighandler);
00271 signal(SIGUSR1, &usr1_sig);
00272
00273
00274
00275 sprintf(lfile, "/tmp/find_tview.log");
00276 sprintf(acmd, "ps -ef | grep %s 1> %s 2>&1", TAPEVIEWERNAME, lfile);
00277 if(system(acmd)) {
00278 write_log("**Can't execute %s.\n", acmd);
00279 return;
00280 }
00281 if((fplog=fopen(lfile, "r")) == NULL) {
00282 write_log("**Can't open %s to find any %s\n", lfile, TAPEVIEWERNAME);
00283 return;
00284 }
00285 while(fgets(line, 128, fplog)) {
00286 if(!(strstr(line, "perl"))) continue;
00287 sscanf(line, "%s %d", acmd, &tpid);
00288 sprintf(lfile, "%s/sum_restart_%d.touch", SUMLOG_BASEDIR, tpid);
00289 sprintf(acmd, "/bin/touch %s", lfile);
00290 write_log("%s\n", acmd);
00291 system(acmd);
00292 }
00293 fclose(fplog);
00294 }
00295
00296
00297 void sumbye(void) {
00298 printf("sumbye() called by atexit() at %s\n", datestring());
00299 write_log("sumbye() called by atexit() at %s\n", datestring());
00300 }
00301
00302
00303 int main(int argc, char *argv[])
00304 {
00305 register SVCXPRT *transp;
00306 int i;
00307 pid_t pid;
00308 char dsvcname[80], cmd[128];
00309 char *args[5], pgport[32];
00310 char *simmode;
00311
00312 get_cmd(argc, argv);
00313 printf("\nPlease wait for sum_svc and tape inventory to initialize...\n");
00314 setup();
00315 if(atexit(sumbye)) {
00316 printf("Can't register sumbye() function in atexit()\n");
00317 }
00318
00319
00320 (void) pmap_unset(SUMDELSER, SUMDELSERV);
00321 transp = (SVCXPRT *)svctcp_create(RPC_ANYSOCK, 0, 0);
00322 if (transp == NULL) {
00323 write_log("***cannot create tcp service\n");
00324 exit(1);
00325 }
00326 write_log("svctcp_create() port# = %u\n", transp->xp_port);
00327 if (!svc_register(transp, SUMDELSER, SUMDELSERV, sumprog_1, IPPROTO_TCP)) {
00328 write_log("***unable to register (SUMDELSER, SUMDELSERV, tcp)\n");
00329 exit(1);
00330 }
00331
00332
00333 if(!(simmode = (char *)getenv("SUMSIMMODE"))) {
00334 sprintf(pgport, SUMPGPORT);
00335 setenv("SUMPGPORT", pgport, 1);
00336 write_log("Sdelser sets SUMPGPORT env to %s\n", pgport);
00337 }
00338 else {
00339 write_log("Sdelser sim mode SUMPGPORT %s\n", (char *)getenv("SUMPGPORT"));
00340 }
00341
00342 #ifndef __LOCALIZED_DEFS__
00343
00344
00345
00346 if(!strcmp(hostn, "dcs0") || !strcmp(hostn, "dcs1") || !strcmp(hostn, "dcs2") || !strcmp(hostn, "dcs3")) {
00347 if((pid = fork()) < 0) {
00348 write_log("***Can't fork(). errno=%d\n", errno);
00349 exit(1);
00350 }
00351 else if(pid == 0) {
00352 write_log("execvp of tape_svc\n");
00353 args[0] = "tape_svc";
00354 if(tapeoffline) {
00355 args[1] = "-o";
00356 args[2] = dbname;
00357 args[3] = timetag;
00358 args[4] = NULL;
00359 }
00360 else if(sim) {
00361 args[1] = "-s";
00362 args[2] = dbname;
00363 args[3] = timetag;
00364 args[4] = NULL;
00365 }
00366 else {
00367 args[1] = dbname;
00368 args[2] = timetag;
00369 args[3] = NULL;
00370 }
00371 if(execvp(args[0], args) < 0) {
00372 write_log("***Can't execvp() tape_svc. errno=%d\n", errno);
00373 exit(1);
00374 }
00375 }
00376 sleep(1);
00377 for(i=0; i < MAX_DRIVES; i++) {
00378 if((pid = fork()) < 0) {
00379 write_log("***Can't fork(). errno=%d\n", errno);
00380 exit(1);
00381 }
00382 else if(pid == 0) {
00383 sprintf(dsvcname, "drive%d_svc", i);
00384 write_log("execvp of %s\n", dsvcname);
00385 args[0] = dsvcname;
00386 if(tapeoffline) {
00387 args[1] = "-o";
00388 args[2] = dbname;
00389 args[3] = timetag;
00390 args[4] = NULL;
00391 }
00392 else if(sim) {
00393 args[1] = "-s";
00394 args[2] = dbname;
00395 args[3] = timetag;
00396 args[4] = NULL;
00397 }
00398 else {
00399 args[1] = dbname;
00400 args[2] = timetag;
00401 args[3] = NULL;
00402 }
00403 if(execvp(args[0], args) < 0) {
00404 write_log("***Can't execvp() %s. errno=%d\n", dsvcname, errno);
00405 exit(1);
00406 }
00407 }
00408 }
00409 if((pid = fork()) < 0) {
00410 write_log("***Can't fork(). errno=%d\n", errno);
00411 exit(1);
00412 }
00413 else if(pid == 0) {
00414 write_log("execvp of robot0_svc\n");
00415 args[0] = "robot0_svc";
00416 args[1] = dbname;
00417 args[2] = timetag;
00418 args[3] = NULL;
00419 if(execvp(args[0], args) < 0) {
00420 write_log("***Can't execvp() robot0_svc. errno=%d\n", errno);
00421 exit(1);
00422 }
00423 }
00424 }
00425 #endif
00426 #ifdef __LOCALIZED_DEFS__
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444 #endif
00445
00446 #ifndef __LOCALIZED_DEFS__
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487 #endif
00488
00489
00490
00491
00492
00493
00494 DS_ConnectDB(dbname);
00495 if(DS_PavailRequest2()) {
00496 write_log("***Can't SUM_Init()\n");
00497 exit(1);
00498 }
00499
00500 sleep(5);
00501 printf("Sdelser now available\n");
00502
00503
00504
00505
00506
00507 svc_run();
00508 write_log("!!Fatal Error: svc_run() returned in sum_svc\n");
00509 exit(1);
00510 }
00511
00512
00513
00514
00515
00516 static void
00517 sumprog_1(rqstp, transp)
00518 struct svc_req *rqstp;
00519 SVCXPRT *transp;
00520 {
00521 char procname[128];
00522 uint64_t ck_client;
00523
00524
00525 union __svcargun {
00526 Rkey sumdo_1_arg;
00527 } argument;
00528 char *result, *call_err;
00529 enum clnt_stat clnt_stat;
00530
00531 bool_t (*xdr_argument)(), (*xdr_result)();
00532 char *(*local)();
00533
00534 if(rqstp->rq_proc == INFODOARRAY) {
00535 sumprog_1_array(rqstp, transp);
00536 return;
00537 }
00538
00539 switch (rqstp->rq_proc) {
00540 case NULLPROC:
00541 (void) svc_sendreply(transp, (xdrproc_t)xdr_void, (char *)NULL);
00542 return;
00543 break;
00544
00545
00546
00547
00548
00549
00550 case OPENDO:
00551 sprintf(procname, "OPENDO");
00552 xdr_argument = xdr_Rkey;
00553 xdr_result = xdr_uint32_t;
00554 local = (char *(*)()) opendo_1;
00555 break;
00556 case SHUTDO:
00557 sprintf(procname, "SHUTDO");
00558 xdr_argument = xdr_Rkey;
00559 xdr_result = xdr_uint32_t;
00560 local = (char *(*)()) shutdo_1;
00561 break;
00562 case ALLOCDO:
00563 sprintf(procname, "ALLOCDO");
00564 xdr_argument = xdr_Rkey;
00565 xdr_result = xdr_Rkey;
00566 local = (char *(*)()) allocdo_1;
00567 break;
00568 case INFODO:
00569 sprintf(procname, "INFODO");
00570 xdr_argument = xdr_Rkey;
00571 xdr_result = xdr_Rkey;
00572 local = (char *(*)()) infodo_1;
00573 break;
00574 case INFODOX:
00575 sprintf(procname, "INFODOX");
00576 xdr_argument = xdr_Rkey;
00577 xdr_result = xdr_Rkey;
00578 local = (char *(*)()) infodoX_1;
00579 break;
00580 case GETDO:
00581 sprintf(procname, "GETDO");
00582 xdr_argument = xdr_Rkey;
00583 xdr_result = xdr_Rkey;
00584 local = (char *(*)()) getdo_1;
00585 break;
00586 case PUTDO:
00587 sprintf(procname, "PUTDO");
00588 xdr_argument = xdr_Rkey;
00589 xdr_result = xdr_Rkey;
00590 local = (char *(*)()) putdo_1;
00591 break;
00592 case CLOSEDO:
00593 sprintf(procname, "CLOSEDO");
00594 xdr_argument = xdr_Rkey;
00595 xdr_result = xdr_uint32_t;
00596 local = (char *(*)()) closedo_1;
00597 break;
00598 case SUMRESPDO:
00599 sprintf(procname, "SUMRESPDO");
00600 xdr_argument = xdr_Rkey;
00601 xdr_result = xdr_Rkey;
00602 local = (char *(*)()) sumrespdo_1;
00603 break;
00604 case DELSERIESDO:
00605 sprintf(procname, "DELSERIESDO");
00606 xdr_argument = xdr_Rkey;
00607 xdr_result = xdr_uint32_t;
00608 local = (char *(*)()) delseriesdo_1;
00609 break;
00610 case NOPDO:
00611 sprintf(procname, "NOPDO");
00612 xdr_argument = xdr_Rkey;
00613 xdr_result = xdr_uint32_t;
00614 local = (char *(*)()) nopdo_1;
00615 break;
00616 case TAPERECONNECTDO:
00617 sprintf(procname, "TAPERESTARTDO");
00618 xdr_argument = xdr_Rkey;
00619 xdr_result = xdr_uint32_t;
00620 local = (char *(*)()) tapereconnectdo_1;
00621 break;
00622 case SUMREPARTN:
00623 sprintf(procname, "SUMREPARTN");
00624 xdr_argument = xdr_Rkey;
00625 xdr_result = xdr_uint32_t;
00626 local = (char *(*)()) repartndo_1;
00627 break;
00628 default:
00629 write_log("**sumprog_1() dispatch default procedure %d,ignore\n", rqstp->rq_proc);
00630 svcerr_noproc(transp);
00631 return;
00632 }
00633 bzero((char *)&argument, sizeof(argument));
00634 if (!svc_getargs(transp, (xdrproc_t)xdr_argument, (char *)&argument)) {
00635 write_log("***Error on svc_getargs()\n");
00636 svcerr_decode(transp);
00637
00638
00639
00640
00641 svc_sendreply(transp, (xdrproc_t)xdr_void, (char *)NULL);
00642 return;
00643
00644 }
00645 glb_transp = transp;
00646 result = (*local)(&argument, rqstp);
00647
00648
00649
00650 if(result) {
00651 if(result == (char *)1) {
00652
00653 }
00654 else {
00655 if(debugflg) {
00656 write_log("\n###KEYLIST at return in sum_svc\n");
00657 keyiterate(logkey, (KEY *)result);
00658 }
00659 if(current_client == 0) {
00660 write_log("***Error on clnt_call() back to orig sum_svc caller\n");
00661 write_log(" current_client was NULL\n");
00662 }
00663 else {
00664 ck_client = ((uint64_t)current_client & 0xfc00000000000000) >> 58;
00665 if(!((ck_client == 0) || (ck_client == 0x3f))) {
00666 write_log("***Error invalid current_client\n");
00667
00668
00669 }
00670 else {
00671 clnt_stat=clnt_call(current_client, RESPDO, (xdrproc_t)xdr_result,
00672 result, (xdrproc_t)xdr_void, 0, TIMEOUT);
00673 if(clnt_stat != 0) {
00674 clnt_perrno(clnt_stat);
00675 write_log("***Error on clnt_call() back to RESPDO procedure\n");
00676 write_log("***The original client caller has probably exited\n");
00677 call_err = clnt_sperror(current_client, "Err");
00678 write_log("%s\n", call_err);
00679 }
00680 clnt_destroy(current_client);
00681 }
00682 }
00683 freekeylist((KEY **)&result);
00684 }
00685 }
00686 else {
00687 }
00688 if (!svc_freeargs(transp, (xdrproc_t)xdr_argument, (char *)&argument)) {
00689 write_log("**unable to free arguments\n");
00690
00691 }
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707 return;
00708 }
00709
00710
00711
00712 static void
00713 sumprog_1_array(rqstp, transp)
00714 struct svc_req *rqstp;
00715 SVCXPRT *transp;
00716 {
00717 char procname[128];
00718 uint64_t ck_client;
00719
00720
00721 union __svcargun {
00722 Sunumarray sumdo_1_arg;
00723 } argument;
00724 char *result, *call_err;
00725 enum clnt_stat clnt_stat;
00726
00727 bool_t (*xdr_argument)(), (*xdr_result)();
00728 char *(*local)();
00729
00730 switch (rqstp->rq_proc) {
00731 case INFODOARRAY:
00732 sprintf(procname, "INFODOARRAY");
00733 xdr_argument = xdr_Sunumarray;
00734 xdr_result = xdr_Rkey;
00735 local = (char *(*)()) infodoArray_1;
00736 break;
00737 default:
00738 write_log("**sumprog_1_array() dispatch default procedure %d,ignore\n", rqstp->rq_proc);
00739 svcerr_noproc(transp);
00740 return;
00741 }
00742 bzero((char *)&argument, sizeof(argument));
00743 if (!svc_getargs(transp, (xdrproc_t)xdr_argument, (char *)&argument)) {
00744 write_log("***Error on svc_getargs()\n");
00745 svcerr_decode(transp);
00746
00747
00748
00749
00750 svc_sendreply(transp, (xdrproc_t)xdr_void, (char *)NULL);
00751 return;
00752
00753 }
00754 glb_transp = transp;
00755 result = (*local)(&argument, rqstp);
00756
00757
00758
00759 if(result) {
00760 if(result == (char *)1) {
00761
00762 }
00763 else {
00764 if(debugflg) {
00765 }
00766 if(current_client == 0) {
00767 write_log("***Error on clnt_call() back to orig sum_svc caller\n");
00768 write_log(" current_client was NULL\n");
00769 }
00770 else {
00771 ck_client = ((uint64_t)current_client & 0xfc00000000000000) >> 58;
00772 if(!((ck_client == 0) || (ck_client == 0x3f))) {
00773 write_log("***Error invalid current_client\n");
00774
00775
00776 }
00777 else {
00778 clnt_stat=clnt_call(current_client, RESPDOARRAY,(xdrproc_t)xdr_result, result, (xdrproc_t)xdr_void, 0, TIMEOUT);
00779 if(clnt_stat != RPC_SUCCESS) {
00780 if(clnt_stat != RPC_TIMEDOUT) {
00781 clnt_perrno(clnt_stat);
00782 write_log("***Error on clnt_call() back to RESPDO procedure\n");
00783 write_log("***The original client caller has probably exited\n");
00784 call_err = clnt_sperror(current_client, "Err");
00785 write_log("%s\n", call_err);
00786
00787 }
00788 else {
00789 write_log("Timeout ignored on RESPDO back to current_client\n");
00790 }
00791 }
00792 clnt_destroy(current_client);
00793 }
00794 }
00795 freekeylist((KEY **)&result);
00796 }
00797 }
00798 else {
00799 }
00800 if (!svc_freeargs(transp, (xdrproc_t)xdr_argument, (char *)&argument)) {
00801 write_log("**unable to free arguments\n");
00802
00803 }
00804
00805
00806 return;
00807 }
00808