|
|
1.1 ! root 1: /* dish.c - */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/quipu/dish/RCS/dishlib.c,v 7.3 90/07/09 14:47:06 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/quipu/dish/RCS/dishlib.c,v 7.3 90/07/09 14:47:06 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: dishlib.c,v $ ! 12: * Revision 7.3 90/07/09 14:47:06 mrose ! 13: * sync ! 14: * ! 15: * Revision 7.2 90/04/18 08:49:37 mrose ! 16: * 6.2 ! 17: * ! 18: * Revision 7.1 90/03/15 11:18:23 mrose ! 19: * quipu-sync ! 20: * ! 21: * Revision 7.1 89/12/19 16:21:01 mrose ! 22: * sync ! 23: * ! 24: * Revision 7.0 89/11/23 22:20:01 mrose ! 25: * Release 6.0 ! 26: * ! 27: */ ! 28: ! 29: /* ! 30: * NOTICE ! 31: * ! 32: * Acquisition, use, and distribution of this module and related ! 33: * materials are subject to the restrictions of a license agreement. ! 34: * Consult the Preface in the User's Manual for the full terms of ! 35: * this agreement. ! 36: * ! 37: */ ! 38: ! 39: ! 40: #include <stdio.h> ! 41: #include <signal.h> ! 42: #include "quipu/util.h" ! 43: #include "quipu/name.h" ! 44: #include <varargs.h> ! 45: ! 46: #ifdef SOCKETS ! 47: #include "internet.h" ! 48: extern int sd_current; ! 49: #endif ! 50: ! 51: #define MAXARGS 50 ! 52: ! 53: extern LLog *log_dsap; ! 54: DN dn = NULLDN; /* This actually stores the current position. */ ! 55: ! 56: #define OPT (!frompipe || rps -> ps_byteno == 0 ? opt : rps) ! 57: #define RPS (!frompipe || opt -> ps_byteno == 0 ? rps : opt) ! 58: char frompipe; ! 59: PS opt, rps; ! 60: ! 61: DN savename; ! 62: ! 63: SFD dish_quit (); ! 64: SFD dish_intr (); ! 65: unsigned cache_time = 3600; /* time to keep process alive */ ! 66: unsigned connect_time = 120; /* time to keep connection open */ ! 67: ! 68: char inbuf[LINESIZE]; ! 69: char bound = FALSE; ! 70: char remote_prob; ! 71: char doneget; ! 72: char *TidyString(); ! 73: char search_result; /* another horrid global ! */ ! 74: ! 75: extern int call_list (), call_compare (), call_search (), ! 76: call_add (), call_delete (), call_showentry (), call_showname (), ! 77: call_showattribute (), call_unbind (), call_help (), call_ds (), ! 78: unknown_cmd (), dsa_control (), call_modify (), call_modifyrdn (), ! 79: call_quit (), call_bind (), call_moveto (), call_fred (); ! 80: ! 81: static struct { ! 82: char *command; ! 83: int (*handler) (); ! 84: int unique; ! 85: char defaults [LINESIZE]; ! 86: } Commands[MAXARGS]; ! 87: static int num_cmd = 0; ! 88: ! 89: add_dish_command (name,func,len) ! 90: char * name; ! 91: IFP func; ! 92: int len; ! 93: { ! 94: Commands[num_cmd].command = name; ! 95: Commands[num_cmd].handler = func; ! 96: Commands[num_cmd].unique = (len == 0 ? strlen(name) : len); ! 97: bzero (Commands[num_cmd].defaults,LINESIZE); ! 98: num_cmd++; ! 99: } ! 100: ! 101: dish_cmd_init () ! 102: { ! 103: add_dish_command ("list", call_list, 1); ! 104: add_dish_command ("compare", call_compare, 1); ! 105: add_dish_command ("search", call_search, 2); ! 106: add_dish_command ("add", call_add, 1); ! 107: add_dish_command ("delete", call_delete, 2); ! 108: add_dish_command ("modify", call_modify, 3); ! 109: add_dish_command ("modifyrdn", call_modifyrdn, 7); ! 110: add_dish_command ("showentry", call_showentry, 2); ! 111: add_dish_command ("showname", call_showname, 5); ! 112: add_dish_command ("bind", call_bind, 1); ! 113: add_dish_command ("unbind", call_unbind, 1); ! 114: add_dish_command ("moveto", call_moveto, 3); ! 115: add_dish_command ("dsacontrol", dsa_control, 2); ! 116: add_dish_command ("quit", call_quit, 1); /* quick way out for interactive program */ ! 117: add_dish_command ("squid", call_ds, 2); ! 118: add_dish_command ("?", call_help, 1); ! 119: add_dish_command ("help", call_help, 1); ! 120: add_dish_command ("fred", call_fred, 4); ! 121: dish_help_init (); ! 122: }; ! 123: ! 124: jmp_buf dish_env; ! 125: ! 126: #ifndef IDLE ! 127: #define IDLE 0 ! 128: #endif ! 129: #ifndef BUSY ! 130: #define BUSY 1 ! 131: #endif ! 132: static char dish_state; ! 133: ! 134: #ifndef NO_STATS ! 135: extern LLog *log_stat; ! 136: #endif ! 137: extern LLog *log_dsap; ! 138: ! 139: char no_rcfile; ! 140: ! 141: dish_init (argc, argv) ! 142: int argc; ! 143: char **argv; ! 144: { ! 145: int i; ! 146: char *ttyname (), *getenv(); ! 147: char *vec [1]; ! 148: char **vecptr; ! 149: extern char * tailfile; ! 150: ! 151: dish_cmd_init (); ! 152: ! 153: (void) signal (SIGHUP, dish_quit); ! 154: (void) signal (SIGQUIT, dish_quit); ! 155: (void) signal (SIGILL, dish_quit); ! 156: (void) signal (SIGBUS, dish_quit); ! 157: (void) signal (SIGSEGV, dish_quit); ! 158: (void) signal (SIGSYS, dish_quit); ! 159: (void) signal (SIGTERM, dish_quit); ! 160: ! 161: no_rcfile = FALSE; ! 162: for (i=1; i<argc; i++) { ! 163: if (test_arg (argv[i],"-fast",1)) { ! 164: no_rcfile = TRUE; ! 165: shuffle_up (argc--, argv, i); ! 166: continue; ! 167: } ! 168: if (test_arg (argv[i],"-help",1)) { ! 169: if ((opt = ps_alloc (std_open)) == NULLPS) ! 170: fatal (-62, "ps_alloc failed"); ! 171: if (std_setup (opt, stderr) == NOTOK) ! 172: fatal (-63, "std_setup failed"); ! 173: ! 174: if ((rps = ps_alloc (std_open)) == NULLPS) ! 175: fatal (-64, "ps_alloc 2 failed"); ! 176: if (std_setup (rps, stdout) == NOTOK) ! 177: fatal (-65, "std_setup 2 failed"); ! 178: ! 179: help_arg ("dish"); ! 180: exit (0); ! 181: } ! 182: if (test_arg(argv[i],"-tailor",1)) { ! 183: shuffle_up (argc--, argv, i); ! 184: if (i == argc) ! 185: fatal (-66,"Tailor file name missing"); ! 186: tailfile = argv[i]; ! 187: shuffle_up (argc--, argv, i); ! 188: } ! 189: } ! 190: ! 191: if ( (argc >1) && (test_arg (argv[1], "-pipe",3))) { ! 192: if (init_pipe () != OK) ! 193: exit (-61); ! 194: frompipe = TRUE; ! 195: opt = rps = NULLPS; ! 196: } else { ! 197: frompipe = FALSE; ! 198: ! 199: if ((opt = ps_alloc (std_open)) == NULLPS) ! 200: fatal (-62, "ps_alloc failed"); ! 201: if (std_setup (opt, stderr) == NOTOK) ! 202: fatal (-63, "std_setup failed"); ! 203: ! 204: if ((rps = ps_alloc (std_open)) == NULLPS) ! 205: fatal (-64, "ps_alloc 2 failed"); ! 206: if (std_setup (rps, stdout) == NOTOK) ! 207: fatal (-65, "std_setup 2 failed"); ! 208: ! 209: (void) printf ("Welcome to Dish (DIrectory SHell)\n"); ! 210: (void) fflush (stdout); ! 211: } ! 212: ! 213: i = 1; ! 214: vec[0] = argv[0]; ! 215: vecptr = vec; ! 216: ! 217: want_oc_hierarchy (); /* for add/modify ! */ ! 218: ! 219: #ifndef NO_STATS ! 220: log_stat -> ll_file = "dish.log"; ! 221: log_stat -> ll_stat &= ~LLOGCRT; ! 222: #endif ! 223: log_dsap -> ll_stat &= ~LLOGCRT; ! 224: dsap_init (&i, &vecptr); ! 225: ! 226: #ifndef NO_STATS ! 227: ll_hdinit (log_stat,vec[0]); ! 228: #endif ! 229: ! 230: check_known_oids(); ! 231: ! 232: if (user_tailor () != OK) { ! 233: ! 234: (void) fprintf (stderr, "Tailoring failed\n"); ! 235: ! 236: if (frompipe) ! 237: exit_pipe (); ! 238: ! 239: exit (-66); ! 240: } ! 241: ! 242: if (! frompipe) { ! 243: ! 244: #ifndef NO_STATS ! 245: char buf [LINESIZE]; ! 246: *buf = 0; ! 247: ! 248: for (i=0; i<argc; i++) { ! 249: (void) strcat (buf,argv[i]); ! 250: (void) strcat (buf," "); ! 251: if (test_arg (argv[i], "-password",2) && ++i < argc) ! 252: (void) strcat (buf, "????"); ! 253: } ! 254: LLOG (log_stat,LLOG_NOTICE,("%s",buf)); ! 255: #endif ! 256: if (setjmp (dish_env)) ! 257: exit (-66); ! 258: ! 259: if (call_bind (argc,argv) != OK) ! 260: exit (-67); ! 261: } ! 262: } ! 263: ! 264: unknown_cmd () ! 265: { ! 266: if (frompipe) ! 267: ps_print (opt,"Serious dish error\n"); ! 268: else { ! 269: if (print_arg_error (opt) != OK) ! 270: ps_print (opt,"Unknown command --- type '?' for help\n"); ! 271: } ! 272: } ! 273: ! 274: do_dish () ! 275: { ! 276: char *brkset; ! 277: char *command; ! 278: char cmd_buf [LINESIZE]; ! 279: char *ptr; ! 280: char *vector[MAXARGS]; ! 281: int no_of_args; ! 282: int x; ! 283: char noarg; ! 284: extern int parse_line; ! 285: extern int dsa_dead; ! 286: extern int errno; ! 287: ! 288: Commands[num_cmd].command = NULLCP; ! 289: Commands[num_cmd].handler = unknown_cmd; ! 290: Commands[num_cmd].unique = 0; ! 291: ! 292: (void) signal (SIGINT, dish_intr); ! 293: if (setjmp (dish_env) == 1) ! 294: goto tidy_up; ! 295: ! 296: while (1) { ! 297: dish_state = IDLE; ! 298: if (dsa_dead) { ! 299: (void) ds_unbind (); ! 300: bound = FALSE; ! 301: dsa_dead = FALSE; ! 302: } ! 303: ! 304: parse_line = 0; ! 305: reset_arg (); ! 306: set_current_pos(); ! 307: remote_prob = FALSE; ! 308: doneget = FALSE; ! 309: ! 310: if (frompipe) { ! 311: set_alarm (); ! 312: ! 313: if (read_pipe (inbuf,LINESIZE) == -1) ! 314: continue; ! 315: ! 316: (void) signal (SIGALRM, SIG_IGN); ! 317: /* unset alarm */ ! 318: #ifdef SOCKETS ! 319: command = inbuf; ! 320: #else ! 321: command = index (inbuf, ':'); ! 322: *command++ = 0; ! 323: #endif ! 324: ! 325: #ifdef SOCKETS ! 326: if ((opt = ps_alloc (fdx_open)) == NULLPS) { ! 327: exit_pipe (); ! 328: fatal (-68, "ps_alloc failed"); ! 329: } ! 330: if (fdx_setup (opt, sd_current) == NOTOK) { ! 331: exit_pipe (); ! 332: fatal (-69, "fdx_setup failed"); ! 333: } ! 334: (void) (*opt -> ps_writeP) (opt, "2", 1, 0); ! 335: ! 336: if ((rps = ps_alloc (fdx_open)) == NULLPS) { ! 337: exit_pipe (); ! 338: fatal (-70, "ps_alloc 2 failed"); ! 339: } ! 340: if (fdx_setup (rps, sd_current) == NOTOK) { ! 341: exit_pipe (); ! 342: fatal (-71, "fdx_setup 2 failed"); ! 343: } ! 344: (void) (*rps -> ps_writeP) (rps, "1", 1, 0); ! 345: #else ! 346: if ((opt = ps_alloc (str_open)) == NULLPS) { ! 347: exit_pipe (); ! 348: fatal (-68, "ps_alloc failed"); ! 349: } ! 350: if (str_setup (opt, NULLCP, BUFSIZ, 0) == NOTOK) { ! 351: exit_pipe (); ! 352: fatal (-69, "str_setup failed"); ! 353: } ! 354: opt->ps_ptr++, opt->ps_cnt--; ! 355: ! 356: if ((rps = ps_alloc (str_open)) == NULLPS) { ! 357: exit_pipe (); ! 358: fatal (-70, "ps_alloc 2 failed"); ! 359: } ! 360: if (str_setup (rps, NULLCP , BUFSIZ, 0) == NOTOK) { ! 361: exit_pipe (); ! 362: fatal (-71, "str_setup 2 failed"); ! 363: } ! 364: rps->ps_ptr++, rps->ps_cnt--; ! 365: #endif ! 366: if (!no_rcfile) ! 367: test_rc_file (opt); ! 368: } else { ! 369: do { ! 370: set_alarm (); ! 371: (void) printf ("Dish -> "); ! 372: if (fgets (inbuf, sizeof inbuf, stdin) == 0) ! 373: call_quit(); ! 374: for (ptr = inbuf; isspace (*ptr); ptr++) ! 375: continue; ! 376: } while (*ptr == 0); ! 377: (void) signal (SIGALRM, SIG_IGN); /* unset alarm */ ! 378: command = TidyString(inbuf); ! 379: } ! 380: savename = dn_cpy (dn); ! 381: hide_picture(); ! 382: dish_state = BUSY; ! 383: ! 384: ptr = command; ! 385: while (*ptr) ! 386: if (isspace (*ptr)) ! 387: break; ! 388: else ! 389: ptr++; ! 390: ! 391: if (*ptr == 0) { ! 392: noarg = TRUE; ! 393: } else { ! 394: *ptr = 0; ! 395: noarg = FALSE; ! 396: } ! 397: for (x = 0; Commands[x].command != 0; x++) ! 398: if (test_arg (command, Commands[x].command, Commands[x].unique)) ! 399: break; ! 400: ! 401: if (! noarg) ! 402: *ptr++ = ' '; ! 403: ! 404: if (* Commands[x].defaults != 0) { ! 405: if (noarg) { ! 406: (void) sprintf (cmd_buf,"%s %s",Commands[x].command,Commands[x].defaults); ! 407: } else { ! 408: (void) sprintf (cmd_buf,"%s %s %s",Commands[x].command,Commands[x].defaults,ptr); ! 409: } ! 410: command = cmd_buf; ! 411: } ! 412: ! 413: if (strncmp (command, "fred -ufn ", 9) == 0) { ! 414: command[4] = command[9] = ','; ! 415: brkset = ","; ! 416: } ! 417: else ! 418: brkset = " \t"; ! 419: if ((no_of_args = sstr2arg (command, MAXARGS, vector, brkset)) == NOTOK) ! 420: ps_printf (OPT, "Too many arguments... Can't cope.\n"); ! 421: else { ! 422: char help_flag = FALSE; ! 423: int y; ! 424: #ifndef NO_STATS ! 425: char buf [LINESIZE]; ! 426: #endif ! 427: ! 428: vector[0] = Commands[x].command; ! 429: ! 430: #ifndef NO_STATS ! 431: if (vector[0] != NULLCP) { ! 432: (void) strcpy (buf,vector[0]); ! 433: (void) strcat (buf," "); ! 434: } ! 435: #endif ! 436: for (y=1; y<no_of_args; y++) { ! 437: ! 438: #ifndef NO_STATS ! 439: (void) strcat (buf,vector[y]); ! 440: (void) strcat (buf," "); ! 441: ! 442: if (test_arg (vector[y], "-password",2) && y+1 < no_of_args) { ! 443: (void) strcat (buf, "????"); ! 444: y++; ! 445: continue; ! 446: } ! 447: #endif ! 448: if (test_arg (vector[y],"-help",1)) { ! 449: if (vector[0] != NULLCP) ! 450: help_arg (vector[0]); ! 451: else ! 452: unknown_cmd(); ! 453: help_flag = TRUE; ! 454: } ! 455: } ! 456: #ifndef NO_STATS ! 457: LLOG (log_stat,LLOG_NOTICE,("%s",buf)); ! 458: #endif ! 459: if ( ! help_flag) ! 460: (*Commands[x].handler) (no_of_args, vector); ! 461: } ! 462: ! 463: /* if from pipe, return results */ ! 464: tidy_up:; ! 465: ! 466: if (frompipe && !remote_prob) { ! 467: #ifdef SOCKETS ! 468: if (rps -> ps_byteno > 0) { ! 469: (void) ps_flush (rps); ! 470: } else ! 471: if (opt -> ps_byteno > 0) ! 472: (void) ps_flush (opt); ! 473: #else ! 474: if (opt->ps_byteno == 0) { ! 475: *rps->ps_ptr = 0; ! 476: send_pipe (rps->ps_base); ! 477: } else { ! 478: *opt->ps_ptr = 0; ! 479: if (search_result == OK) ! 480: *opt->ps_base = '2'; ! 481: else ! 482: *opt->ps_base = '3'; /* Signal search ok but >1 hit, with -hitone option */ ! 483: send_pipe (opt->ps_base); ! 484: } ! 485: #endif ! 486: ps_free (opt); ! 487: ps_free (rps); ! 488: #ifdef SOCKETS ! 489: (void) close_tcp_socket (sd_current); ! 490: sd_current = NOTOK; ! 491: #endif ! 492: } else { ! 493: (void) fflush (stdout); ! 494: (void) ps_flush (opt); ! 495: (void) ps_flush (rps); ! 496: } ! 497: } ! 498: } ! 499: ! 500: call_quit () ! 501: { ! 502: /* can only get called if run interactively - dont worry about pipe */ ! 503: (void) signal (SIGINT, SIG_DFL); ! 504: ! 505: DLOG (log_dsap, LLOG_DEBUG, ("Dish:- Exiting Dish successfully...")); ! 506: if (bound) ! 507: (void) ds_unbind (); ! 508: bound = FALSE; ! 509: ps_free (opt); ! 510: ps_free (rps); ! 511: hide_picture(); ! 512: exit (0); ! 513: } ! 514: ! 515: set_cmd_default (cmd, dflt) ! 516: char * cmd; ! 517: char * dflt; ! 518: { ! 519: int x; ! 520: ! 521: for (x = 0; Commands[x].command != 0; x++) ! 522: if (strcmp (cmd, Commands[x].command) == 0) { ! 523: if (* Commands[x].defaults != 0) ! 524: (void) strcat (Commands[x].defaults, " "); ! 525: (void) strcat (Commands[x].defaults, dflt); ! 526: return (OK); ! 527: } ! 528: ! 529: return (NOTOK); ! 530: ! 531: } ! 532: ! 533: SFD dish_intr () ! 534: { ! 535: #ifndef BSDSIGS ! 536: (void) signal (SIGINT, dish_intr); ! 537: #endif ! 538: ! 539: if (dish_state == IDLE) ! 540: (void) fprintf (stderr,"\n"); ! 541: else { ! 542: (void) fprintf (stderr,"(Interrupted)\n"); ! 543: dish_state = IDLE; ! 544: } ! 545: ! 546: longjmp (dish_env,2); ! 547: } ! 548: ! 549: void advise (va_alist) ! 550: va_dcl ! 551: { ! 552: int code; ! 553: va_list ap; ! 554: extern LLog *log_dsap; ! 555: ! 556: va_start (ap); ! 557: ! 558: code = va_arg (ap, int); ! 559: ! 560: (void) _ll_log (log_dsap, code, ap); ! 561: ! 562: va_end (ap); ! 563: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.