Annotation of 43BSD/ingres/source/monitor/ttymon.c, revision 1.1.1.1

1.1       root        1: # include      "monitor.h"
                      2: # include      <ingres.h>
                      3: # include      <version.h>
                      4: # include      <opsys.h>
                      5: # include      <pv.h>
                      6: # include      <func.h>
                      7: # include      <signal.h>
                      8: # include      <pipes.h>
                      9: # include      <setjmp.h>
                     10: # include      <sccs.h>
                     11: 
                     12: SCCSID(@(#)ttymon.c    8.1     12/31/84)
                     13: 
                     14: 
                     15: 
                     16: # define       ERRDELIM        '~'
                     17: 
                     18: /*
                     19: **  INTERACTIVE TERMINAL MONITOR
                     20: **
                     21: **     The monitor gathers text from the standard input and performs
                     22: **     a variety of rudimentary editting functions.  This program
                     23: **     is the main setup.  Monitor() is then called, which does the
                     24: **     real work.
                     25: **
                     26: **     variables:
                     27: **     Nodayfile -- zero prints all messages; positive one suppresses
                     28: **             dayfile and logout but not prompts; negative one
                     29: **             suppresses all printed material except results from \p.
                     30: **     Newline -- set when the last character in the query buffer
                     31: **             is a newline.
                     32: **     Prompt -- set when a prompt character is needed.
                     33: **     Autoclear -- set when the query buffer should be cleared before
                     34: **             putting another character in.
                     35: **     Nautoclear -- if set, suppresses the autoclear function
                     36: **             entirely.
                     37: **
                     38: **     flags:
                     39: **     -M -- trace flag
                     40: **     -d -- suppress dayfile
                     41: **     -s -- suppress prompt (sets -d)
                     42: **     -a -- disable autoclear function
                     43: **
                     44: **     The last three options can be set by stating "+x".
                     45: **
                     46: **     Trace Flags:
                     47: **             9
                     48: **             11 (proc_err)
                     49: */
                     50: 
                     51: extern char    *Usercode;
                     52: extern         tm_mon();
                     53: extern         tm_init();
                     54: extern         tm_intr();
                     55: short          tTttymon[100];
                     56: 
                     57: struct fn_def  TtyMonFn =
                     58: {
                     59:        "MONITOR",
                     60:        tm_mon,
                     61:        tm_init,
                     62:        tm_intr,
                     63:        NULL,
                     64:        0,
                     65:        tTttymon,
                     66:        100,
                     67:        'M',
                     68:        0
                     69: };
                     70: 
                     71: tm_init(argc, argv)
                     72: int    argc;
                     73: char   *argv[];
                     74: {
                     75:        register int    ndx;
                     76:        register char   *p;
                     77:        extern          quit();
                     78:        extern int      (*ExitFn)();
                     79:        extern int      Equel;
                     80:        char            buff[100];
                     81:        extern char     *getufield();
                     82:        extern jmp_buf  CmReset;
                     83:        extern char     SysIdent[];
                     84: 
                     85: 
                     86:        /* insure that permissions are ok */
                     87:        setuid(getuid());
                     88: #      ifndef xB_UNIX
                     89:        setgid(getgid());
                     90: #      endif
                     91: 
                     92:        setjmp(CmReset);
                     93:        signal(SIGPIPE, quit);
                     94: 
                     95:        ExitFn = quit;
                     96:        set_si_buf();
                     97: 
                     98:        /* process arguments */
                     99:        if (!setflag(argv, 'd', 1))
                    100:                Nodayfile = 1;
                    101:        if (!setflag(argv, 's', 1))
                    102:                Nodayfile = -1;
                    103:        Nautoclear = !setflag(argv, 'a', 1);
                    104: 
                    105:        /* preinitialize macros */
                    106:        macinit(0, 0, 0);
                    107:        macdefine("{pathname}", Pathname, 1);
                    108: 
                    109:        /* print the dayfile */
                    110:        if (Nodayfile >= 0)
                    111:        {
                    112:                time(buff);
                    113:                printf("%s login\n%s", SysIdent, ctime(buff));
                    114:        }
                    115:        if (Nodayfile == 0 && (Qryiop = fopen(ztack(ztack(Pathname, "/files/dayfile"), VERSION), "r")) != NULL)
                    116:        {
                    117:                while ((ndx = getc(Qryiop)) > 0)
                    118:                        putchar(ndx);
                    119:                fclose(Qryiop);
                    120:        }
                    121: 
                    122:        /* SET UP LOGICAL QUERY-BUFFER FILE */
                    123:        concat("/tmp/INGQ", Fileset, Qbname);
                    124:        if ((Qryiop = fopen(Qbname, "w")) == NULL)
                    125:                syserr("main: open(%s)", Qbname);
                    126: 
                    127:        /* GO TO IT ... */
                    128:        Prompt = Newline = TRUE;
                    129:        Userdflag = Nodayfile;
                    130:        Nodayfile = -1;
                    131: 
                    132:        /* run the system initialization file */
                    133:        setjmp(CmReset);
                    134:        Phase++;
                    135:        include(ztack(Pathname, "/files/startup"));
                    136: 
                    137:        /* find out what the user initialization file is */
                    138:        setjmp(CmReset);
                    139:        if (getuser(Usercode, buff) == 0)
                    140:        {
                    141:                p = getufield(buff, 7);
                    142:                if (*p != 0)
                    143:                        include(p);
                    144:        }
                    145:        getuser(0, 0);
                    146: 
                    147:        Nodayfile = Userdflag;
                    148: 
                    149:        /*
                    150:        **  Get user input from terminal
                    151:        **
                    152:        **      THIS CODE IS A CLUDGE!!!
                    153:        **
                    154:        **      This code should return right after the setbuf call,
                    155:        **      but it doesn't because we want the monitor to be in
                    156:        **      control initially.  The way the control module is
                    157:        **      written, this will work.  But we are definitely
                    158:        **      cheating....
                    159:        */
                    160: 
                    161:        Input = stdin;
                    162:        setbuf(stdin, NULL);
                    163:        monitor(FALSE);
                    164:        quit();
                    165: }
                    166: /*
                    167: **  CATCH SIGNALS
                    168: **
                    169: **     clear out pipes and respond to user
                    170: **
                    171: **     Uses trace flag 10
                    172: */
                    173: 
                    174: tm_intr(typ)
                    175: int    typ;
                    176: {
                    177:        register int    i;
                    178: 
                    179:        if (typ != 2)
                    180:                syserr("tm_intr: typ %d", typ);
                    181: 
                    182:        if (Xwaitpid == 0)
                    183:                printf("\nInterrupt\n");
                    184: 
                    185:        lseek(stdin->_file, 0L, 2);
                    186:        Newline = Prompt = TRUE;
                    187:        Nodayfile = Userdflag;
                    188:        Oneline = FALSE;
                    189:        Idepth = 0;
                    190:        setbuf(stdin, NULL);
                    191:        Input = stdin;
                    192:        xwait();
                    193: }
                    194: /*
                    195: **  PROCESS ERROR MESSAGE
                    196: **
                    197: **     This routine takes an error message off of the pipe and
                    198: **     processes it for output to the terminal.  This involves doing
                    199: **     a lookup in the .../files/error? files, where ? is the thous-
                    200: **     ands digit of the error number.  The associated error message
                    201: **     then goes through parameter substitution and is printed.
                    202: **
                    203: **     In the current version, the error message is just printed.
                    204: **
                    205: **     We unquestionably cheat, by doing a longjmp rather than a
                    206: **     return here -- this is so that the synchronization works right.
                    207: **
                    208: **     Trace Flags:
                    209: **             30
                    210: */
                    211: 
                    212: proc_err(ppb, pc, pv)
                    213: pb_t   *ppb;
                    214: int    pc;
                    215: PARM   pv[];
                    216: {
                    217:        register char   c;
                    218:        register char   *p;
                    219:        int             i;
                    220:        char            buf[512];
                    221:        int             err;
                    222:        FILE            *iop;
                    223:        char            *errfilen();
                    224:        extern char     *mcall();
                    225:        bool            fatal;
                    226:        extern jmp_buf  GoJmpBuf;
                    227: 
                    228:        if (pc <= 0 || pv[0].pv_type != PV_INT)
                    229:                syserr("proc_err: pc %d pv0type %d", pc, pv[0].pv_type);
                    230:        err = pv[0].pv_val.pv_int;
                    231:        Error_id = err;
                    232:        fatal = !bitset(PB_INFO, ppb->pb_stat);
                    233: 
                    234:        /* try calling the {catcherror} macro -- maybe not print */
                    235:        p = buf;
                    236:        p += smove("{catcherror; ", p);
                    237:        p += smove(iocv(err), p);
                    238:        p += smove("}", p);
                    239: 
                    240:        p = mcall(buf);
                    241:        if (sequal(p, "0"))
                    242:                return (1);
                    243: 
                    244:        /* open the appropriate error file */
                    245:        p = errfilen(err / 1000);
                    246: 
                    247: #      ifdef xMTR3
                    248:        if (tTf(30, -1))
                    249:                printf("proc_error: ");
                    250:        if (tTf(30, 0))
                    251:                printf("%d, %s", err, p);
                    252: #      endif
                    253: 
                    254:        if ((iop = fopen(p, "r")) == NULL)
                    255:                syserr("proc_error: open(%s)", p);
                    256: 
                    257:        /* read in the code and check for correct */
                    258:        for (;;)
                    259:        {
                    260:                p = buf;
                    261:                while ((c = getc(iop)) != '\t')
                    262:                {
                    263:                        if (c <= 0)
                    264:                        {
                    265:                                /* no code exists, print the args */
                    266:                                printf("%d:", err);
                    267:                                for (i = 0; i < pc; i++)
                    268:                                        printf(" `%s'", pv[i].pv_val.pv_str);
                    269:                                printf("\n");
                    270:                                fclose(iop);
                    271:                                if (fatal)
                    272:                                        longjmp(CmReset, 1);
                    273:                                else
                    274:                                        longjmp(GoJmpBuf, 1);
                    275:                        }
                    276:                        *p++ = c;
                    277:                }
                    278:                *p = 0;
                    279:                i = atoi(buf);
                    280: 
                    281:                if (i != err)
                    282:                {
                    283:                        while ((c = getc(iop)) != ERRDELIM)
                    284:                                if (c <= 0)
                    285:                                        syserr("proc_error: format err %d", err);
                    286:                        getc(iop);      /* throw out the newline */
                    287:                        continue;
                    288:                }
                    289: 
                    290:                /* got the correct line, print it doing parameter substitution */
                    291:                printf("%d: ", err);
                    292:                c = '\n';
                    293:                for (;;)
                    294:                {
                    295:                        c = getc(iop);
                    296:                        if (c <= 0 || c == ERRDELIM)
                    297:                        {
                    298:                                printf("\n");
                    299:                                fclose(iop);
                    300:                                if (fatal)
                    301:                                        longjmp(CmReset, 1);
                    302:                                else
                    303:                                        longjmp(GoJmpBuf, 1);
                    304:                        }
                    305:                        if (c == '%')
                    306:                        {
                    307:                                c = getc(iop) - '0' + 1;
                    308:                                if (c >= pc)
                    309:                                        syserr("proc_err: parm %d", c - 1);
                    310:                                switch (pv[c].pv_type)
                    311:                                {
                    312:                                  case PV_STR:
                    313:                                        for (p = pv[c].pv_val.pv_str; c = *p; p++)
                    314:                                                xputchar(c);
                    315:                                        continue;
                    316: 
                    317:                                  case PV_INT:
                    318:                                        printf("%d", pv[c].pv_val.pv_int);
                    319:                                        continue;
                    320: 
                    321:                                  default:
                    322:                                        syserr("proc_err: arg %d type %d", c, pv[c].pv_type);
                    323:                                }
                    324:                        }
                    325:                        printf("%c", c);
                    326:                }
                    327:        }
                    328: }
                    329: /*
                    330: **  TM_MON -- "function to implement this module"
                    331: **
                    332: **     Since we have cludged up this module to work, and hence
                    333: **     the init routine should never return, this routine just
                    334: **     syserr's.
                    335: */
                    336: 
                    337: tm_mon()
                    338: {
                    339:        syserr("tm_mon");
                    340: }
                    341: /*
                    342: **  ACC_INIT, PAGEFLUSH -- dummy access method routines
                    343: **
                    344: **     Since the CM wants to do some basic access method functions,
                    345: **     we will let it.
                    346: */
                    347: 
                    348: acc_init()
                    349: {
                    350: }
                    351: 
                    352: pageflush(x)
                    353: char   *x;
                    354: {
                    355:        return (0);
                    356: }
                    357: /*
                    358: **  CLOSECATALOG -- dummy catalog close routine.
                    359: **
                    360: **     To keep from loading access methods.
                    361: */
                    362: 
                    363: closecatalog()
                    364: {
                    365: }

unix.superglobalmegacorp.com

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