Annotation of 43BSDReno/bin/adb/common_source/main.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)main.c     5.4 (Berkeley) 9/15/89";
                      3: #endif
                      4: 
                      5: /*
                      6:  * adb - main command loop and error/interrupt handling
                      7:  */
                      8: 
                      9: #include "defs.h"
                     10: #include <setjmp.h>
                     11: #include <sys/file.h>
                     12: #include <sys/uio.h>
                     13: #include "pathnames.h"
                     14: 
                     15: extern char NOEOR[];           /* "newline expected" */
                     16: 
                     17: /*
                     18:  * executing is set by command.c whenever we are running a subprocess.
                     19:  */
                     20: int    executing;
                     21: 
                     22: int    infile;                 /* XXX */
                     23: char   *Ipath = _PATH_SCRIPTS; /* XXX */
                     24: 
                     25: static int xargc;              /* remembers argc for getfile() */
                     26: 
                     27: static int reading;            /* set whenever reading input */
                     28: static jmp_buf mainloop;       /* label for error jumps */
                     29: 
                     30: void   fault();
                     31: off_t  lseek();
                     32: 
                     33: main(argc, argv)
                     34:        register int argc;
                     35:        register char **argv;
                     36: {
                     37:        int waserr;
                     38:        char line[LINELEN];
                     39: 
                     40:        radix = 16;             /* default radix is hex */
                     41:        maxoff = MAXOFF;
                     42:        maxcol = MAXCOL;
                     43: 
                     44:        /*
                     45:         * Set up machine dependent code (e.g., instruction decoding tables),
                     46:         * then look at arguments, and open the object and core files;
                     47:         * finally, set up signal handlers.  Alas, cannot really use getopt.
                     48:         */
                     49:        mch_init();
                     50:        symfile.name = "a.out";
                     51:        corefile.name = "core";
                     52:        while (argc > 1 && argv[1][0] == '-') {
                     53:                register char *p = argv[1] + 1;
                     54: 
                     55:                if (*p == 'w' && p[1] == 0) {
                     56:                        wtflag = 2;     /* suitable for open() */
                     57:                        argc--, argv++;
                     58:                } else if (*p == 'k' && p[1] == 0) {
                     59:                        kernel = 1;
                     60:                        argc--, argv++;
                     61:                } else if (*p == 'I') {
                     62:                        Ipath = argv[1] + 2;
                     63:                        argc--, argv++;
                     64:                } else
                     65:                        break;
                     66:        }
                     67:        if (argc > 1)
                     68:                symfile.name = argv[1];
                     69:        if (argc > 2)
                     70:                corefile.name = argv[2];
                     71:        xargc = argc;           /* remember for getfile() */
                     72:        setsym();
                     73:        setcore();
                     74:        if ((sigint = signal(SIGINT, SIG_IGN)) != SIG_IGN) {
                     75:                intcatch = fault;
                     76:                (void) signal(SIGINT, fault);
                     77:        }
                     78:        sigquit = signal(SIGQUIT, SIG_IGN);
                     79: 
                     80:        /*
                     81:         * Errors jump back to the main loop here.
                     82:         * If the error occurred while the process was running,
                     83:         * we need to remove any breakpoints.
                     84:         */
                     85:        (void) setjmp(mainloop);
                     86:        if (executing) {
                     87:                executing = 0;
                     88:                delbp();
                     89:        }
                     90: 
                     91:        /*
                     92:         * Main loop:
                     93:         *      flush pending output, and print any error message(s);
                     94:         *      read a line; if end of file, close current input and
                     95:         *      continue, unless input == stdin; otherwise, perform
                     96:         *      the command(s) on the line and make sure that that
                     97:         *      consumed the whole line.
                     98:         */
                     99:        for (;;) {
                    100:                flushbuf();
                    101:                if (errflag) {
                    102:                        adbprintf("%s\n", errflag);
                    103:                        waserr = 1;
                    104:                        errflag = NULL;
                    105:                }
                    106:                if (mkfault) {
                    107:                        mkfault = 0;
                    108:                        prints("\nadb\n");
                    109:                }
                    110:                if (readline(line, sizeof line)) {
                    111:                        if (infile == 0)
                    112:                                done(waserr);
                    113:                        iclose(-1, 0);
                    114:                } else {
                    115:                        waserr = 0;
                    116:                        command(line, 0);
                    117:                        if (/* lp && */ lastc != '\n')
                    118:                                errflag = NOEOR;
                    119:                }
                    120:        }
                    121: }
                    122: 
                    123: /*
                    124:  * Exit with optional error status.
                    125:  */
                    126: done(err)
                    127:        int err;
                    128: {
                    129: 
                    130:        endpcs();
                    131:        exit(err);
                    132: }
                    133: 
                    134: /*
                    135:  * Open the a.out (1) or core (2) file.  If the name was given,
                    136:  * rather than defaulted, and we were asked to open for writing,
                    137:  * create the file if necessary.
                    138:  */
                    139: getfile(which)
                    140:        int which;
                    141: {
                    142:        char *fname;
                    143:        int flags, fd;
                    144:        char *strerror();
                    145: 
                    146:        switch (which) {
                    147:        case 1:
                    148:                fname = symfile.name;
                    149:                break;
                    150:        case 2:
                    151:                fname = corefile.name;
                    152:                break;
                    153:        default:
                    154:                panic("getfile");
                    155:                /* NOTREACHED */
                    156:        }
                    157:        if (fname[0] == '-' && fname[1] == 0)
                    158:                return (-1);
                    159:        if ((flags = wtflag) != 0 && xargc > which)
                    160:                flags |= O_CREAT;
                    161:        if ((fd = open(fname, flags, 0666)) < 0 && xargc > which)
                    162:                adbprintf("cannot open `%s': %s\n", fname, strerror(errno));
                    163:        return (fd);
                    164: }
                    165: 
                    166: 
                    167: /*
                    168:  * Input routines
                    169:  */
                    170: 
                    171: /*
                    172:  * Read a character, skipping white space.
                    173:  */
                    174: rdc()
                    175: {
                    176: 
                    177:        while (*lp == ' ' || *lp == '\t')
                    178:                lp++;
                    179:        return (readchar());
                    180: }
                    181: 
                    182: #ifndef readchar
                    183: /*
                    184:  * Read a character, incrementing the pointer if not at end.
                    185:  */
                    186: readchar()
                    187: {
                    188: 
                    189:        if ((lastc = *lp) != 0)
                    190:                lp++;
                    191:        return (lastc);
                    192: }
                    193: #endif
                    194: 
                    195: /*
                    196:  * Read a line.  Return -1 at end of file.
                    197:  * Alas, cannot read more than one character at a time here (except
                    198:  * possibly on tty devices; must think about that later).
                    199:  */
                    200: static
                    201: readline(p, n)
                    202:        register char *p;
                    203:        register int n;
                    204: {
                    205: 
                    206:        n--;            /* for \0 */
                    207:        reading++;
                    208:        do {
                    209:                if (--n > 0) {
                    210:                        if (read(infile, p, 1) != 1)
                    211:                                return (-1);
                    212:                } else 
                    213:                        *p = '\n';
                    214:        } while (*p++ != '\n');
                    215:        reading = 0;
                    216:        *p = 0;         /* can we perhaps eliminate this? */
                    217:        return (0);
                    218: }
                    219: 
                    220: /*
                    221:  * Return the next non-white non-end-of-line character.
                    222:  */
                    223: nextchar()
                    224: {
                    225:        int c = rdc();
                    226: 
                    227:        if (eol(c)) {
                    228:                unreadc();
                    229:                return (0);
                    230:        }
                    231:        return (c);
                    232: }
                    233: 
                    234: 
                    235: /*
                    236:  * Error handlers
                    237:  */
                    238: 
                    239: #ifndef checkerr
                    240: /*
                    241:  * If there has been an error or a fault, take the error.
                    242:  */
                    243: checkerr()
                    244: {
                    245: 
                    246:        if (errflag || mkfault)
                    247:                error(errflag);
                    248: }
                    249: #endif
                    250: 
                    251: /*
                    252:  * An error occurred.  Save the message for later printing,
                    253:  * close open files, and reset to main command loop.
                    254:  */
                    255: error(which)
                    256:        char *which;
                    257: {
                    258: 
                    259:        errflag = which;
                    260:        iclose(0, 1);
                    261:        oclose();
                    262:        longjmp(mainloop, 1);
                    263:        /* NOTREACHED */
                    264: }
                    265: 
                    266: /*
                    267:  * An interrupt occurred.  Seek to the end of the current input file.
                    268:  * If we were reading commands, jump back to the main loop.
                    269:  */
                    270: /* ARGSUSED */
                    271: void
                    272: fault(sig)
                    273:        int sig;
                    274: {
                    275:        /* (void) signal(sig, fault); */        /* unnecessary */
                    276:        (void) lseek(infile, 0L, 2);
                    277:        mkfault++;
                    278:        if (reading) {
                    279:                reading = 0;
                    280:                error((char *)NULL);
                    281:        }
                    282: }
                    283: 
                    284: /*
                    285:  * Panic announces an internally detected error.
                    286:  */
                    287: panic(s)
                    288:        char *s;
                    289: {
                    290:        static char p[] = "panic: \n";
                    291:        static struct iovec iov[3] = { { p, 7 }, { 0 }, { p + 7, 1 } };
                    292: 
                    293:        iov[1].iov_base = s;
                    294:        iov[1].iov_len = strlen(s);
                    295:        (void) writev(2, iov, 3);
                    296:        abort();        /* beware, overwrites current core file! */
                    297: /*     exit(1); */
                    298: }

unix.superglobalmegacorp.com

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