blob: 1c536d3ec71113365cb027b70db726ccf40c1852 [file] [log] [blame]
/*
* 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);
}
}