/* 
 * 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);
	}
}
