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