Annotation of researchv10no/cmd/worm/scsi/scsish.c, revision 1.1.1.1

1.1       root        1: #include       <stddef.h>
                      2: #include       <stdio.h>
                      3: #include       <string.h>
                      4: #include       "scsi.h"
                      5: #include       "scsish.h"
                      6: #include       "tcl.h"
                      7: #include       "generic/fns.h"
                      8: 
                      9: extern Device genericdev;
                     10: static Device *dev = 0;
                     11: static void parse(FILE *);
                     12: Tcl_Interp *interp;
                     13: 
                     14: main()
                     15: {
                     16:        interp = Tcl_CreateInterp();
                     17:        scsi_target(2);
                     18:        setdevice(&genericdev);
                     19:        set_sony();
                     20:        printf("dev=%s, target=%d:\n", dev->name, s_id);
                     21:        parse(stdin);
                     22:        exit(0);
                     23: }
                     24: 
                     25: static void
                     26: parse(FILE *fp)
                     27: {
                     28:        char line[1000], *cmd;
                     29:        int result, partial;
                     30:        static Tcl_CmdBuf buffer;
                     31: 
                     32:        buffer = Tcl_CreateCmdBuf();
                     33:        partial = 0;
                     34:        for(;;){
                     35:                clearerr(fp);
                     36:                if(!partial){
                     37:                        fputs("% ", stdout);
                     38:                        fflush(stdout);
                     39:                }
                     40:                if(fgets(line, sizeof line, fp) == NULL){
                     41:                        if(!partial)
                     42:                                exit(0);
                     43:                        line[0] = 0;
                     44:                }
                     45:                cmd = Tcl_AssembleCmd(buffer, line);
                     46:                if(cmd == NULL){
                     47:                        partial = 1;
                     48:                        continue;
                     49:                }
                     50:                partial = 0;
                     51:                result = Tcl_RecordAndEval(interp, cmd, 0);
                     52:                if(result == TCL_OK){
                     53:                        if(interp->result[0])
                     54:                                printf("%s\n", interp->result);
                     55:                } else {
                     56:                        if(result == TCL_ERROR)
                     57:                                printf("Error");
                     58:                        else
                     59:                                printf("Error %d", result);
                     60:                        if(interp->result)
                     61:                                printf(": %s", interp->result);
                     62:                        printf("\n");
                     63:                }
                     64:        }
                     65: }
                     66: 
                     67: static Function *
                     68: flook(Function *f, char *name)
                     69: {
                     70:        for(; f->help; f++)
                     71:                if(strncmp(f->name, name, strlen(f->name)) == 0)
                     72:                        return(f);
                     73:        return(0);
                     74: }
                     75: 
                     76: void
                     77: setdevice(Device *d)
                     78: {
                     79:        Function *f;
                     80:        static char errbuf[256];
                     81: 
                     82:        dev = d;
                     83:        ss_extsense = dev->extsense;
                     84:        for(f = d->fns; f->name; f++){
                     85:                Tcl_CreateCommand(interp, f->name, f->fn, (ClientData)errbuf, NULL);
                     86:        }
                     87: }
                     88: 
                     89: static
                     90: help(Device *d, char *cmd, Device *prec)
                     91: {
                     92:        Function *f;
                     93:        Function *base;
                     94: 
                     95:        base = (prec && prec->fns)? prec->fns:0;
                     96:        if(cmd == 0){
                     97:                printf("device %s(%s):\n", d->name, d->verbose);
                     98:                if(f = d->fns)
                     99:                        while(f->name){
                    100:                                if((base == 0) || (flook(base, f->name) == 0))
                    101:                                        printf("\t%s\n", f->help);
                    102:                                f++;
                    103:                        }
                    104:                return(0);
                    105:        } else {
                    106:                if(f = d->fns)
                    107:                        while(f->name)
                    108:                                if(strcmp(f->name, cmd) == 0){
                    109:                                        printf("(%s) %s\n", d->name, f->help);
                    110:                                        return(1);
                    111:                                } else
                    112:                                        f++;
                    113:                return(0);
                    114:        }
                    115: }
                    116: 
                    117: int
                    118: gen_help(ClientData err, Tcl_Interp *it, int argc, char **argv)
                    119: {
                    120: #pragma ref it
                    121: #pragma ref err
                    122: 
                    123:        if(dev)
                    124:                if(help(dev, argc <= 1? 0:argv[1], (Device *)0))
                    125:                        return(0);
                    126:        help(&genericdev, argc <= 1? 0:argv[1], dev);
                    127:        return(TCL_OK);
                    128: }
                    129: 
                    130: extern Device sonydev;
                    131: extern Device wrendev;
                    132: static Device *devs[] = {
                    133:        &genericdev,
                    134:        &sonydev,
                    135:        &wrendev,
                    136:        0
                    137: };
                    138: 
                    139: int
                    140: gen_dev(ClientData err, Tcl_Interp *it, int argc, char **argv)
                    141: {
                    142:        Device **d;
                    143: 
                    144: #pragma ref it
                    145: #pragma ref err
                    146: 
                    147:        if(argc == 1)
                    148:                printf("dev=%s\n", dev? dev->name : genericdev.name);
                    149:        else if(strcmp(argv[1], "?") == 0){
                    150:                printf("available devices:\n");
                    151:                for(d = devs; *d; d++)
                    152:                        printf("\t%s(%s)\n", (*d)->name, (*d)->verbose);
                    153:        } else {
                    154:                for(d = devs; *d; d++)
                    155:                        if(strcmp(argv[1], (*d)->name) == 0)
                    156:                                break;
                    157:                if(*d){
                    158:                        setdevice(&genericdev);
                    159:                        setdevice(*d);
                    160:                } else
                    161:                        fprintf(stderr, "device '%s' unknown\n", argv[1]);
                    162:        }
                    163:        return(TCL_OK);
                    164: }
                    165: 
                    166: void
                    167: scsi_target(int n)
                    168: {
                    169:        if((n < 0) || (n >= 8))
                    170:                fprintf(stderr, "%d is an invalid target\n", n);
                    171:        else
                    172:                s_id = n;
                    173: }
                    174: 
                    175: set_sony()
                    176: {
                    177:        char *a[3];
                    178: 
                    179:        a[0] = "dev";
                    180:        a[1] = "sony";
                    181:        a[2] = 0;
                    182:        gen_dev(0L, interp, 2, a);
                    183: }

unix.superglobalmegacorp.com

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