|  | /* | 
|  | * This file is part of the UCB release of Plan 9. It is subject to the license | 
|  | * terms in the LICENSE file found in the top-level directory of this | 
|  | * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No | 
|  | * part of the UCB release of Plan 9, including this file, may be copied, | 
|  | * modified, propagated, or distributed except according to the terms contained | 
|  | * in the LICENSE file. | 
|  | */ | 
|  | #include <stdlib.h> | 
|  |  | 
|  | #include <stdio.h> | 
|  | #include <parlib/parlib.h> | 
|  | #include <unistd.h> | 
|  | #include <signal.h> | 
|  | #include <fcntl.h> | 
|  | #include <error.h> | 
|  | #include <iplib/iplib.h> | 
|  | #include <ndblib/ndb.h> | 
|  | #include <fcall.h> | 
|  |  | 
|  | char *server; | 
|  | char *status; | 
|  | int statusonly; | 
|  |  | 
|  | void usage(void) | 
|  | { | 
|  | fprintf(stderr, "CSQUERY:usage: ndb/csquery [/net/cs [addr...]]\n"); | 
|  | fprintf(stderr, "CSQUERY:usage"); | 
|  | exit(1); | 
|  | } | 
|  |  | 
|  | void query(char *addr) | 
|  | { | 
|  | char buf[128]; | 
|  | int fd, n; | 
|  | int amt; | 
|  |  | 
|  | fd = open(server, O_RDWR); | 
|  | if (fd < 0) | 
|  | error(1, 0, "cannot open %s: %r", server); | 
|  | amt = write(fd, addr, strlen(addr)); | 
|  | if (amt != strlen(addr)) { | 
|  | printf("CSQUERY:Tried to write %d to fd %d, only wrote %d\n", | 
|  | strlen(addr), fd, amt); | 
|  | if (!statusonly) | 
|  | fprintf(stderr, | 
|  | "CSQUERY:Writing request: translating %s: %r\n", | 
|  | addr); | 
|  | status = "errors"; | 
|  | close(fd); | 
|  | return; | 
|  | } | 
|  | if (!statusonly) { | 
|  | lseek(fd, 0, 0); | 
|  | while ((n = read(fd, buf, sizeof(buf) - 1)) > 0) { | 
|  | buf[n] = 0; | 
|  | } | 
|  | printf("%s\n", buf); | 
|  | } | 
|  | close(fd); | 
|  | } | 
|  |  | 
|  | void main(int argc, char **argv) | 
|  | { | 
|  | char p[512]; | 
|  | int i; | 
|  |  | 
|  | argc--, argv++; | 
|  | while (argc) { | 
|  | if (argv[0][0] != '-') | 
|  | break; | 
|  | switch (argv[0][1]) { | 
|  | case 's': | 
|  | statusonly = 1; | 
|  | break; | 
|  | default: | 
|  | usage(); | 
|  | } | 
|  | argc--, argv++; | 
|  | } | 
|  |  | 
|  | if (argc > 0) | 
|  | server = argv[0]; | 
|  | else | 
|  | server = "/net/cs"; | 
|  |  | 
|  | if (argc > 1) { | 
|  | for (i = 1; i < argc; i++) | 
|  | query(argv[i]); | 
|  | exit(0); | 
|  | } | 
|  |  | 
|  | for (;;) { | 
|  | printf("CSQUERY:> "); | 
|  | i = 0; | 
|  | while (read(0, &p[i], 1) > 0){ | 
|  | /* Attempt to echo our input back to stdout */ | 
|  | write(1, &p[i], 1); | 
|  | if (p[i] == '\n') | 
|  | break; | 
|  | i++; | 
|  | } | 
|  | if (i < 0) | 
|  | break; | 
|  | p[i] = 0; | 
|  | if (i) | 
|  | query(p); | 
|  | } | 
|  | } |