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