Annotation of researchv10no/cmd/worm/scsi/scsish.c, revision 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.