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