Annotation of 43BSDReno/contrib/isode-beta/quipu/dish/dishlib.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.