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 = 0;
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 Salloc got SIGTERM. Exiting.\n", datestring());
00138 exit(1);
00139 }
00140 if(sig == SIGINT) {
00141 write_log("*** %s Salloc got SIGINT. Exiting.\n", datestring());
00142 DS_DisConnectDB();
00143 exit(1);
00144 }
00145 write_log("*** %s Salloc 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 Salloc\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 Salloc 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("Salloc 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 = SUMALLOC;
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 Salloc 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(SUMALLOC, 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, SUMALLOC, SUMALLOCV, sumprog_1, IPPROTO_TCP)) {
00327 write_log("***unable to register (SUMALLOC, SUMALLOCV, tcp)\n");
00328 exit(1);
00329 }
00330
00331
00332
00333 if(!(simmode = (char *)getenv("SUMSIMMODE"))) {
00334 sprintf(pgport, SUMPGPORT);
00335 setenv("SUMPGPORT", pgport, 1);
00336 write_log("Salloc sets SUMPGPORT env to %s\n", pgport);
00337 }
00338 else {
00339 write_log("Salloc 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("Salloc 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 uint64_t uid;
00524
00525
00526 union __svcargun {
00527 Rkey sumdo_1_arg;
00528 } argument;
00529 char *result, *call_err;
00530 enum clnt_stat clnt_stat;
00531
00532 bool_t (*xdr_argument)(), (*xdr_result)();
00533 char *(*local)();
00534
00535 if(rqstp->rq_proc == INFODOARRAY) {
00536 sumprog_1_array(rqstp, transp);
00537 return;
00538 }
00539
00540 switch (rqstp->rq_proc) {
00541 case NULLPROC:
00542 (void) svc_sendreply(transp, (xdrproc_t)xdr_void, (char *)NULL);
00543 return;
00544 break;
00545
00546
00547
00548
00549
00550
00551 case OPENDO:
00552 sprintf(procname, "OPENDO");
00553 xdr_argument = xdr_Rkey;
00554 xdr_result = xdr_uint32_t;
00555 local = (char *(*)()) opendo_1;
00556 break;
00557 case SHUTDO:
00558 sprintf(procname, "SHUTDO");
00559 xdr_argument = xdr_Rkey;
00560 xdr_result = xdr_uint32_t;
00561 local = (char *(*)()) shutdo_1;
00562 break;
00563 case ALLOCDO:
00564 sprintf(procname, "ALLOCDO");
00565 xdr_argument = xdr_Rkey;
00566 xdr_result = xdr_Rkey;
00567 local = (char *(*)()) allocdo_1;
00568 break;
00569 case INFODO:
00570 sprintf(procname, "INFODO");
00571 xdr_argument = xdr_Rkey;
00572 xdr_result = xdr_Rkey;
00573 local = (char *(*)()) infodo_1;
00574 break;
00575 case INFODOX:
00576 sprintf(procname, "INFODOX");
00577 xdr_argument = xdr_Rkey;
00578 xdr_result = xdr_Rkey;
00579 local = (char *(*)()) infodoX_1;
00580 break;
00581 case GETDO:
00582 sprintf(procname, "GETDO");
00583 xdr_argument = xdr_Rkey;
00584 xdr_result = xdr_Rkey;
00585 local = (char *(*)()) getdo_1;
00586 break;
00587 case PUTDO:
00588 sprintf(procname, "PUTDO");
00589 xdr_argument = xdr_Rkey;
00590 xdr_result = xdr_Rkey;
00591 local = (char *(*)()) putdo_1;
00592 break;
00593 case CLOSEDO:
00594 sprintf(procname, "CLOSEDO");
00595 xdr_argument = xdr_Rkey;
00596 xdr_result = xdr_uint32_t;
00597 local = (char *(*)()) closedo_1;
00598 break;
00599 case SUMRESPDO:
00600 sprintf(procname, "SUMRESPDO");
00601 xdr_argument = xdr_Rkey;
00602 xdr_result = xdr_Rkey;
00603 local = (char *(*)()) sumrespdo_1;
00604 break;
00605 case DELSERIESDO:
00606 sprintf(procname, "DELSERIESDO");
00607 xdr_argument = xdr_Rkey;
00608 xdr_result = xdr_uint32_t;
00609 local = (char *(*)()) delseriesdo_1;
00610 break;
00611 case NOPDO:
00612 sprintf(procname, "NOPDO");
00613 xdr_argument = xdr_Rkey;
00614 xdr_result = xdr_uint32_t;
00615 local = (char *(*)()) nopdo_1;
00616 break;
00617 case TAPERECONNECTDO:
00618 sprintf(procname, "TAPERESTARTDO");
00619 xdr_argument = xdr_Rkey;
00620 xdr_result = xdr_uint32_t;
00621 local = (char *(*)()) tapereconnectdo_1;
00622 break;
00623 case SUMREPARTN:
00624 sprintf(procname, "SUMREPARTN");
00625 xdr_argument = xdr_Rkey;
00626 xdr_result = xdr_uint32_t;
00627 local = (char *(*)()) repartndo_1;
00628 break;
00629 default:
00630 write_log("**sumprog_1() dispatch default procedure %d,ignore\n", rqstp->rq_proc);
00631 svcerr_noproc(transp);
00632 return;
00633 }
00634 bzero((char *)&argument, sizeof(argument));
00635 if (!svc_getargs(transp, (xdrproc_t)xdr_argument, (char *)&argument)) {
00636 write_log("***Error on svc_getargs()\n");
00637 svcerr_decode(transp);
00638
00639
00640
00641
00642 svc_sendreply(transp, (xdrproc_t)xdr_void, (char *)NULL);
00643 return;
00644
00645 }
00646 glb_transp = transp;
00647 result = (*local)(&argument, rqstp);
00648
00649
00650
00651 if(result) {
00652 if(result == (char *)1) {
00653
00654 }
00655 else {
00656 if(debugflg) {
00657 write_log("\n###KEYLIST at return in sum_svc\n");
00658 keyiterate(logkey, (KEY *)result);
00659 }
00660 if(current_client == 0) {
00661 write_log("***Error on clnt_call() back to orig sum_svc caller\n");
00662 write_log(" current_client was NULL\n");
00663 }
00664 else {
00665 ck_client = ((uint64_t)current_client & 0xfc00000000000000) >> 58;
00666 if(!((ck_client == 0) || (ck_client == 0x3f))) {
00667 write_log("***Error invalid current_client\n");
00668
00669
00670 }
00671 else {
00672 clnt_stat=clnt_call(current_client, RESPDO, (xdrproc_t)xdr_result,
00673 result, (xdrproc_t)xdr_void, 0, TIMEOUT);
00674 if(clnt_stat != 0) {
00675 clnt_perrno(clnt_stat);
00676 write_log("***Error on clnt_call() back to RESPDO procedure\n");
00677 if(findkey(result, "uid")) {
00678 uid = getkey_uint64(result, "uid");
00679 write_log("***The original client caller has probably exited. Its uid=%lu\n", uid);
00680 }
00681 else {
00682 write_log("***The original client caller has probably exited\n");
00683 }
00684 call_err = clnt_sperror(current_client, "Err");
00685 write_log("%s\n", call_err);
00686 }
00687 clnt_destroy(current_client);
00688 }
00689 }
00690 freekeylist((KEY **)&result);
00691 }
00692 }
00693 else {
00694 }
00695 if (!svc_freeargs(transp, (xdrproc_t)xdr_argument, (char *)&argument)) {
00696 write_log("**unable to free arguments\n");
00697
00698 }
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714 return;
00715 }
00716
00717
00718
00719 static void
00720 sumprog_1_array(rqstp, transp)
00721 struct svc_req *rqstp;
00722 SVCXPRT *transp;
00723 {
00724 char procname[128];
00725 uint64_t ck_client;
00726 uint64_t uid;
00727
00728
00729 union __svcargun {
00730 Sunumarray sumdo_1_arg;
00731 } argument;
00732 char *result, *call_err;
00733 enum clnt_stat clnt_stat;
00734
00735 bool_t (*xdr_argument)(), (*xdr_result)();
00736 char *(*local)();
00737
00738 switch (rqstp->rq_proc) {
00739 case INFODOARRAY:
00740 sprintf(procname, "INFODOARRAY");
00741 xdr_argument = xdr_Sunumarray;
00742 xdr_result = xdr_Rkey;
00743 local = (char *(*)()) infodoArray_1;
00744 break;
00745 default:
00746 write_log("**sumprog_1_array() dispatch default procedure %d,ignore\n", rqstp->rq_proc);
00747 svcerr_noproc(transp);
00748 return;
00749 }
00750 bzero((char *)&argument, sizeof(argument));
00751 if (!svc_getargs(transp, (xdrproc_t)xdr_argument, (char *)&argument)) {
00752 write_log("***Error on svc_getargs()\n");
00753 svcerr_decode(transp);
00754
00755
00756
00757
00758 svc_sendreply(transp, (xdrproc_t)xdr_void, (char *)NULL);
00759 return;
00760
00761 }
00762 glb_transp = transp;
00763 result = (*local)(&argument, rqstp);
00764
00765
00766
00767 if(result) {
00768 if(result == (char *)1) {
00769
00770 }
00771 else {
00772 if(debugflg) {
00773 }
00774 if(current_client == 0) {
00775 write_log("***Error on clnt_call() back to orig sum_svc caller\n");
00776 write_log(" current_client was NULL\n");
00777 }
00778 else {
00779 ck_client = ((uint64_t)current_client & 0xfc00000000000000) >> 58;
00780 if(!((ck_client == 0) || (ck_client == 0x3f))) {
00781 write_log("***Error invalid current_client\n");
00782
00783
00784 }
00785 else {
00786 clnt_stat=clnt_call(current_client, RESPDOARRAY,(xdrproc_t)xdr_result, result, (xdrproc_t)xdr_void, 0, TIMEOUT);
00787 if(clnt_stat != RPC_SUCCESS) {
00788 if(clnt_stat != RPC_TIMEDOUT) {
00789 clnt_perrno(clnt_stat);
00790 write_log("***Error on clnt_call() back to RESPDO procedure\n");
00791 if(findkey(result, "uid")) {
00792 uid = getkey_uint64(result, "uid");
00793 write_log("***The original client caller has probably exited. Its uid=%lu\n", uid);
00794 }
00795 else {
00796 write_log("***The original client caller has probably exited\n");
00797 }
00798 call_err = clnt_sperror(current_client, "Err");
00799 write_log("%s\n", call_err);
00800
00801 }
00802 else {
00803 write_log("Timeout ignored on RESPDO back to current_client\n");
00804 }
00805 }
00806 clnt_destroy(current_client);
00807 }
00808 }
00809 freekeylist((KEY **)&result);
00810 }
00811 }
00812 else {
00813 }
00814 if (!svc_freeargs(transp, (xdrproc_t)xdr_argument, (char *)&argument)) {
00815 write_log("**unable to free arguments\n");
00816
00817 }
00818
00819
00820 return;
00821 }
00822