|
|
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.