|
|
1.1 root 1: #include <fio.h>
2: #include <libc.h>
3: #include "ipc.h"
4:
5: #define NULL 0
6:
7: extern char *optarg;
8: extern int optind;
9:
10: int debug;
11:
12: main(ac, av)
13: int ac;
14: char *av[];
15: {
16: int c;
17: char buf[256];
18: char *ns = "/cs/ns";
19:
20: while((c = getopt(ac, av, "n:d")) != -1){
21: switch(c){
22: case 'n':
23: ns = optarg;
24: break;
25: case 'd':
26: debug++;
27: break;
28: }
29: }
30: if(optind<ac) {
31: /*
32: * do a single command
33: */
34: if (command(ns, optind, ac, av)<0)
35: exit(1);
36: } else {
37: /*
38: * make a connection and just shuttle bytes
39: */
40: call(ns);
41: }
42: _exit(0);
43: }
44:
45: /*
46: * do the command from the command line
47: */
48: command(ns, optind, ac, av)
49: char *ns;
50: int optind, ac;
51: char *av[];
52: {
53: char *cp;
54: char *types;
55: Qset *sp;
56: Qtuple *tp;
57: char buf[1024];
58: int fd;
59: extern char *qvalue();
60: extern Qset *qset();
61:
62: if(strcmp(av[optind], "value")==0 && ac-optind>=3){
63: /*
64: * just return the value
65: */
66: types = av[++optind];
67: for(++optind; optind<ac; optind++){
68: strcat(buf, av[optind]);
69: strcat(buf, " ");
70: }
71: cp = qvalue(types, buf, ns);
72: if(cp!=NULL){
73: fprint(1, "%s\n", cp);
74: } else if(errno!=0){
75: fprint(2, "error: %s\n", errstr);
76: exit(1);
77: }
78: return 0;
79: } else if(strcmp(av[optind], "values")==0 && ac-optind>=3){
80: /*
81: * return a set of tuples (one tuple per line)
82: */
83: types = av[++optind];
84: for(++optind; optind<ac; optind++){
85: strcat(buf, av[optind]);
86: strcat(buf, " ");
87: }
88: sp = qset(buf, ns);
89: if(sp==0 && errno!=0){
90: fprint(2, "error: %s\n", errstr);
91: exit(1);
92: }
93: for(; sp; sp = sp->next){
94: if(sp->this) for(tp=sp->this; tp; tp=tp->next){
95: if((tp->type && strcmp(tp->type, types)==0)
96: || (tp->type==0 && strcmp("name", types)==0))
97: fprint(1, "%s\n", tp->value);
98: }
99: }
100: return 0;
101: } else if(strcmp(av[optind], "set")==0 && ac-optind>=2){
102: /*
103: * return a set of tuples (one tuple per line)
104: */
105: for(++optind; optind<ac; optind++){
106: strcat(buf, av[optind]);
107: strcat(buf, " ");
108: }
109: sp = qset(buf, ns);
110: if(sp==0 && errno!=0){
111: fprint(2, "error: %s\n", errstr);
112: exit(1);
113: }
114: for(; sp; sp = sp->next){
115: if(sp->this) for(tp=sp->this; tp; tp=tp->next){
116: if(tp->type && *(tp->type))
117: fprint(1, "%s,%s ",tp->value,tp->type);
118: else
119: fprint(1, "%s ", tp->value);
120: }
121: fprint(1, "\n");
122: }
123: return 0;
124: }
125:
126: /*
127: * something other than set or value, do it the hard way
128: */
129: fd = ipcopen(ns, "");
130: if(fd<0) {
131: fprint(2, "can't reach name server\n");
132: exit(1);
133: }
134: Finit(fd, (char *)0);
135: buf[0] = 0;
136: for(; optind<ac; optind++){
137: strcat(buf, av[optind]);
138: strcat(buf, " ");
139: }
140: fprint(fd, "%s\n", buf);
141: return getreply(fd);
142: }
143:
144: /*
145: * just send user strings to the name server and vice versa
146: */
147: call(ns)
148: char *ns;
149: {
150: int fd;
151: char buf[256];
152: char *cp;
153:
154: fd = ipcopen(ns, "");
155: if(fd<0) {
156: fprint(2, "can't reach name server\n");
157: exit(1);
158: }
159: Finit(fd, (char *)0);
160: fprint(1, ">");
161: while((cp=Frdline(0))!=NULL){
162: if (*cp != NULL) {
163: fprint(fd, "%s\n", cp);
164: if(getreply(fd)<0)
165: return;
166: }
167: fprint(1, ">");
168: }
169: }
170:
171: getreply(fd)
172: int fd;
173: {
174: char *cp;
175:
176: while((cp=Frdline(fd))!=NULL){
177: if(strncmp("OK", cp, 2)==0) {
178: continue;
179: } else if(strncmp("ILL", cp, 3)==0 || strncmp("BUSY", cp, 4)==0) {
180: fprint(1, "%s\n", cp);
181: return 0;
182: } else if(strncmp("DONE", cp, 4)==0) {
183: return 0;
184: }
185: fprint(1, "%s\n", *cp=='\t'?cp+1:cp);
186: }
187: return -1;
188: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.