Debugging hacks.
[akaros.git] / tests / csquery.c
1 /* 
2  * This file is part of the UCB release of Plan 9. It is subject to the license
3  * terms in the LICENSE file found in the top-level directory of this
4  * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
5  * part of the UCB release of Plan 9, including this file, may be copied,
6  * modified, propagated, or distributed except according to the terms contained
7  * in the LICENSE file.
8  */
9 #include <stdlib.h>
10
11 #include <stdio.h>
12 #include <parlib.h>
13 #include <unistd.h>
14 #include <signal.h>
15 #include <fcntl.h>
16 #include <error.h>
17 #include <iplib.h>
18 #include <ndb.h>
19 #include <fcall.h>
20
21 char *server;
22 char *status;
23 int statusonly;
24
25 void usage(void)
26 {
27         fprintf(stderr, "CSQUERY:usage: ndb/csquery [/net/cs [addr...]]\n");
28         fprintf(stderr, "CSQUERY:usage");
29         exit(1);
30 }
31
32 void query(char *addr)
33 {
34         char buf[128];
35         int fd, n;
36         int amt;
37
38         printf("CSQUERY:Open %s\n", server);
39         fd = open(server, O_RDWR);
40         if (fd < 0)
41                 error(1, 0, "cannot open %s: %r", server);
42 printf("CSQUERY:ask %d about :%s:\n", fd, addr);
43         amt = write(fd, addr, strlen(addr));
44         if (amt != strlen(addr)) {
45                 printf("CSQUERY:Tried to write %d to fd %d, only wrote %d\n", strlen(addr),fd,amt);
46                 if (!statusonly)
47                         fprintf(stderr, "CSQUERY:Writing request: translating %s: %r\n", addr);
48                 status = "errors";
49                 close(fd);
50                 return;
51         }
52         if (!statusonly) {
53 printf("CSQUERY:lseek\n");
54                 lseek(fd, 0, 0);
55 printf("CSQUERY:now read:");
56                 while ((n = read(fd, buf, sizeof(buf) - 1)) > 0) {
57                         buf[n] = 0;
58                         printf("%s\n", buf);
59                 }
60 printf("CSQUERY:done reading ... %s\n", buf);
61         }
62 printf("CSQUERY:close and return\n");
63         close(fd);
64 }
65
66 void main(int argc, char **argv)
67 {
68         char p[512];
69         int i;
70
71         argc--, argv++;
72         while (argc) {
73                 if (argv[0][0] != '-')
74                         break;
75                 switch (argv[0][1]) {
76                         case 's':
77                                 statusonly = 1;
78                                 break;
79                         default:
80                                 usage();
81                 }
82                 argc--, argv++;
83         }
84
85         if (argc > 0)
86                 server = argv[0];
87         else
88                 server = "/net/cs";
89
90         if (argc > 1) {
91                 for (i = 1; i < argc; i++)
92                         query(argv[i]);
93                 exit(0);
94         }
95
96         for (;;) {
97                 printf("CSQUERY:> ");
98                 i = 0;
99                 while (read(0, &p[i], 1) > 0){
100                         /* Attempt to echo our input back to stdout */
101                         write(1, &p[i], 1);
102                         if (p[i] == '\n')
103                                 break;
104                         i++;
105                 }
106                 if (i < 0)
107                         break;
108                 p[i] = 0;
109                 printf("CSQUERY:Got %d bytes:%s:\n", i, p);
110                 if (i)
111                         query(p);
112         }
113 }