Plan 9 programs for controlling and checking the network: cs.c, csquery.c, netstat.c
[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\n");
56                 while ((n = read(fd, buf, sizeof(buf) - 1)) > 0) {
57 printf("CSQUERY:got %d bytes\n", n);
58                         buf[n] = 0;
59                         printf("CSQUERY:%s\n", buf);
60                 }
61 printf("CSQUERY:done reading ... %s\n", buf);
62         }
63 printf("CSQUERY:close and return\n");
64         close(fd);
65 }
66
67 void main(int argc, char **argv)
68 {
69         char p[512];
70         int i;
71
72         argc--, argv++;
73         while (argc) {
74                 if (argv[0][0] != '-')
75                         break;
76                 switch (argv[0][1]) {
77                         case 's':
78                                 statusonly = 1;
79                                 break;
80                         default:
81                                 usage();
82                 }
83                 argc--, argv++;
84         }
85
86         if (argc > 0)
87                 server = argv[0];
88         else
89                 server = "/net/cs";
90
91         if (argc > 1) {
92                 for (i = 1; i < argc; i++)
93                         query(argv[i]);
94                 exit(0);
95         }
96
97         for (;;) {
98                 printf("CSQUERY:> ");
99                 i = 0;
100                 while (read(0, &p[i], 1) > 0){
101                         /* Attempt to echo our input back to stdout */
102                         write(1, &p[i], 1);
103                         if (p[i] == '\n')
104                                 break;
105                         i++;
106                 }
107                 if (i < 0)
108                         break;
109                 p[i] = 0;
110                 printf("CSQUERY:Got %d bytes:%s:\n", i, p);
111                 if (i)
112                         query(p);
113         }
114 }