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 Sinfo got SIGTERM. Exiting.\n", datestring());
00138 exit(1);
00139 }
00140 if(sig == SIGINT) {
00141 write_log("*** %s Sinfo got SIGINT. Exiting.\n", datestring());
00142 DS_DisConnectDB();
00143 exit(1);
00144 }
00145 write_log("*** %s Sinfo 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 Sinfo\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 Sinfo 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("Sinfo 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 = SUMINFO;
00248 sumvers = SUMINFOV;
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 Sinfo 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(SUMINFO, SUMINFOV);
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, SUMINFO, SUMINFOV, sumprog_1, IPPROTO_TCP)) {
00327 write_log("***unable to register (SUMINFO, SUMINFOV, 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("Sinfo sets SUMPGPORT env to %s\n", pgport);
00336 }
00337 else {
00338 write_log("Sinfo 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("Sinfo 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 uint64_t uid;
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 if(findkey(result, "uid")) {
00677 uid = getkey_uint64(result, "uid");
00678 write_log("***The original client caller has probably exited. Its uid=%lu\n", uid);
00679 }
00680 else {
00681 write_log("***The original client caller has probably exited\n");
00682 }
00683 call_err = clnt_sperror(current_client, "Err");
00684 write_log("%s\n", call_err);
00685 }
00686 clnt_destroy(current_client);
00687 }
00688 }
00689 freekeylist((KEY **)&result);
00690 }
00691 }
00692 else {
00693 }
00694 if (!svc_freeargs(transp, (xdrproc_t)xdr_argument, (char *)&argument)) {
00695 write_log("**unable to free arguments\n");
00696
00697 }
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713 return;
00714 }
00715
00716
00717
00718 static void
00719 sumprog_1_array(rqstp, transp)
00720 struct svc_req *rqstp;
00721 SVCXPRT *transp;
00722 {
00723 char procname[128];
00724 uint64_t ck_client;
00725 uint64_t uid;
00726
00727
00728 union __svcargun {
00729 Sunumarray sumdo_1_arg;
00730 } argument;
00731 char *result, *call_err;
00732 enum clnt_stat clnt_stat;
00733
00734 bool_t (*xdr_argument)(), (*xdr_result)();
00735 char *(*local)();
00736
00737 switch (rqstp->rq_proc) {
00738 case INFODOARRAY:
00739 sprintf(procname, "INFODOARRAY");
00740 xdr_argument = xdr_Sunumarray;
00741 xdr_result = xdr_Rkey;
00742 local = (char *(*)()) infodoArray_1;
00743 break;
00744 default:
00745 write_log("**sumprog_1_array() dispatch default procedure %d,ignore\n", rqstp->rq_proc);
00746 svcerr_noproc(transp);
00747 return;
00748 }
00749 bzero((char *)&argument, sizeof(argument));
00750 if (!svc_getargs(transp, (xdrproc_t)xdr_argument, (char *)&argument)) {
00751 write_log("***Error on svc_getargs()\n");
00752 svcerr_decode(transp);
00753
00754
00755
00756
00757 svc_sendreply(transp, (xdrproc_t)xdr_void, (char *)NULL);
00758 return;
00759
00760 }
00761 glb_transp = transp;
00762 result = (*local)(&argument, rqstp);
00763
00764
00765
00766 if(result) {
00767 if(result == (char *)1) {
00768
00769 }
00770 else {
00771 if(debugflg) {
00772 }
00773 if(current_client == 0) {
00774 write_log("***Error on clnt_call() back to orig sum_svc caller\n");
00775 write_log(" current_client was NULL\n");
00776 }
00777 else {
00778 ck_client = ((uint64_t)current_client & 0xfc00000000000000) >> 58;
00779 if(!((ck_client == 0) || (ck_client == 0x3f))) {
00780 write_log("***Error invalid current_client\n");
00781
00782
00783 }
00784 else {
00785 clnt_stat=clnt_call(current_client, RESPDOARRAY,(xdrproc_t)xdr_result, result, (xdrproc_t)xdr_void, 0, TIMEOUT);
00786 if(clnt_stat != RPC_SUCCESS) {
00787 if(clnt_stat != RPC_TIMEDOUT) {
00788 clnt_perrno(clnt_stat);
00789 write_log("***Error on clnt_call() back to RESPDO procedure\n");
00790 if(findkey(result, "uid")) {
00791 uid = getkey_uint64(result, "uid");
00792 write_log("***The original client caller has probably exited. Its uid=%lu\n", uid);
00793 }
00794 else {
00795 write_log("***The original client caller has probably exited\n");
00796 }
00797 call_err = clnt_sperror(current_client, "Err");
00798 write_log("%s\n", call_err);
00799
00800 }
00801 else {
00802 write_log("Timeout ignored on RESPDO back to current_client\n");
00803 }
00804 }
00805 clnt_destroy(current_client);
00806 }
00807 }
00808 freekeylist((KEY **)&result);
00809 }
00810 }
00811 else {
00812 }
00813 if (!svc_freeargs(transp, (xdrproc_t)xdr_argument, (char *)&argument)) {
00814 write_log("**unable to free arguments\n");
00815
00816 }
00817
00818
00819 return;
00820 }
00821