Annotation of researchv10no/cmd/worm/oscsi/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: 
                      7: extern Device genericdev;
                      8: static Device *dev = 0;
                      9: static Function *function(char *, Device **);
                     10: static void parse(FILE *);
                     11: 
                     12: main()
                     13: {
                     14:        setbuf(stdout, (char *)0);
                     15:        scsi_target(2);
                     16:        set_sony();
                     17:        printf("dev=%s, target=%d:\n", dev? dev->name:genericdev.name, s_id);
                     18:        parse(stdin);
                     19:        exit(0);
                     20: }
                     21: 
                     22: static void
                     23: parse(FILE *fp)
                     24: {
                     25:        int i, n;
                     26:        char *param;
                     27:        char buf[4096];
                     28:        char *ptrs[100], *cargs[20];
                     29:        int iargs[20];
                     30:        int nc, ni;
                     31:        Function *fn;
                     32:        Device *thatdev;
                     33:        char err[512];
                     34: 
                     35:        for(;;){
                     36:                printf("> ");
                     37:                fflush(stdout);
                     38:                if(fgets(buf, sizeof buf, fp) == NULL)
                     39:                        break;
                     40:                if(param = strchr(buf, '\n'))
                     41:                        *param = 0;
                     42:                n = getmfields(buf, ptrs, sizeof ptrs/sizeof ptrs[0]);
                     43:                if(n < 1)
                     44:                        continue;
                     45:                if((fn = function(ptrs[0], &thatdev)) == 0){
                     46:                        fprintf(stderr, "can't find cmd '%s'\n", ptrs[0]);
                     47:                        continue;
                     48:                }
                     49:                ni = nc = 0;
                     50:                param = fn->param;
                     51:                for(i = 1; i < n; i++){
                     52:                        switch(*param++)
                     53:                        {
                     54:                        case 'I':
                     55:                                iargs[ni++] = atoi(ptrs[i]);
                     56:                                break;
                     57:                        case 'L':
                     58:                                iargs[ni++] = atoi(ptrs[i]);
                     59:                                if((iargs[ni-1] < 0) || (iargs[ni-1] > 7)){
                     60:                                        fprintf(stderr, "%s: lun %d out of range\n", ptrs[0], iargs[ni-1]);
                     61:                                        continue;
                     62:                                }
                     63:                                break;
                     64:                        case 'S':
                     65:                                cargs[nc++] = ptrs[i];
                     66:                                break;
                     67:                        default:
                     68:                                break;
                     69:                        }
                     70:                        if(*param == '?')
                     71:                                param++;
                     72:                }
                     73:                while(param[0] && param[1] && (param[1] == '?'))
                     74:                        param += 2;
                     75:                if((i == n) != (*param == 0)){
                     76:                        printf("param mismatch: %s: i=%d/n=%d param='%s'\n",
                     77:                                ptrs[0], i, n, param);
                     78:                        printf("device %s: %s\n", thatdev->name, fn->help);
                     79:                        continue;
                     80:                }
                     81:                if((*fn->fn)(ni, iargs, nc, cargs, err))
                     82:                        fprintf(stderr, "error in '%s': %s\n", fn->name, err);
                     83:        }
                     84: }
                     85: 
                     86: static Function *
                     87: flook(Function *f, char *name)
                     88: {
                     89:        for(; f->help; f++)
                     90:                if(strncmp(f->name, name, strlen(f->name)) == 0)
                     91:                        return(f);
                     92:        return(0);
                     93: }
                     94: 
                     95: static Function *
                     96: function(char *name, Device **devptr)
                     97: {
                     98:        Function *f = 0;
                     99: 
                    100:        if(dev && dev->fns && (f = flook(dev->fns, name)))
                    101:                *devptr = dev;
                    102:        else if(f = flook(genericdev.fns, name))
                    103:                *devptr = &genericdev;
                    104:        return(f);
                    105: }
                    106: 
                    107: void
                    108: setdevice(Device *d)
                    109: {
                    110:        dev = d;
                    111:        ss_extsense = dev->extsense;
                    112: }
                    113: 
                    114: static
                    115: help(Device *d, char *cmd, Device *prec)
                    116: {
                    117:        Function *f;
                    118:        Function *base;
                    119: 
                    120:        base = (prec && prec->fns)? prec->fns:0;
                    121:        if(cmd == 0){
                    122:                printf("device %s(%s):\n", d->name, d->verbose);
                    123:                if(f = d->fns)
                    124:                        while(f->name){
                    125:                                if((base == 0) || (flook(base, f->name) == 0))
                    126:                                        printf("\t%s\n", f->help);
                    127:                                f++;
                    128:                        }
                    129:                return(0);
                    130:        } else {
                    131:                if(f = d->fns)
                    132:                        while(f->name)
                    133:                                if(strcmp(f->name, cmd) == 0){
                    134:                                        printf("(%s) %s\n", d->name, f->help);
                    135:                                        return(1);
                    136:                                } else
                    137:                                        f++;
                    138:                return(0);
                    139:        }
                    140: }
                    141: 
                    142: int
                    143: gen_help(int niargs, int *iargs, int ncargs, char **cargs)
                    144: {
                    145: #pragma ref niargs
                    146: #pragma ref iargs
                    147: 
                    148:        if(dev)
                    149:                if(help(dev, ncargs == 0? 0:cargs[0], (Device *)0))
                    150:                        return(0);
                    151:        help(&genericdev, ncargs == 0? 0:cargs[0], dev);
                    152:        return(0);
                    153: }
                    154: 
                    155: extern Device sonydev;
                    156: extern Device wrendev;
                    157: static Device *devs[] = {
                    158:        &genericdev,
                    159:        &sonydev,
                    160:        &wrendev,
                    161:        0
                    162: };
                    163: 
                    164: int
                    165: gen_dev(int niargs, int *iargs, int ncargs, char **cargs)
                    166: {
                    167:        Device **d;
                    168: 
                    169: #pragma ref niargs
                    170: #pragma ref iargs
                    171: 
                    172:        if(ncargs == 0)
                    173:                printf("dev=%s\n", dev? dev->name : genericdev.name);
                    174:        else if(strcmp(cargs[0], "?") == 0){
                    175:                printf("available devices:\n");
                    176:                for(d = devs; *d; d++)
                    177:                        printf("\t%s(%s)\n", (*d)->name, (*d)->verbose);
                    178:        } else {
                    179:                for(d = devs; *d; d++)
                    180:                        if(strcmp(cargs[0], (*d)->name) == 0)
                    181:                                break;
                    182:                if(*d)
                    183:                        setdevice(*d);
                    184:                else
                    185:                        fprintf(stderr, "device '%s' unknown\n", cargs[0]);
                    186:        }
                    187:        return(0);
                    188: }
                    189: 
                    190: void
                    191: scsi_target(int n)
                    192: {
                    193:        if((n < 0) || (n >= 8))
                    194:                fprintf(stderr, "%d is an invalid target\n", n);
                    195:        else
                    196:                s_id = n;
                    197: }
                    198: 
                    199: set_sony()
                    200: {
                    201:        int iargs[1];
                    202:        char *cargs[1];
                    203: 
                    204:        cargs[0] = "sony";
                    205:        gen_dev(0, iargs, 1, cargs);
                    206: }

unix.superglobalmegacorp.com

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