|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.