/* Copyright (c) 2014 The Regents of the University of California
 * Barret Rhoden <brho@cs.berkeley.edu>
 * See LICENSE for details.
 *
 * Networking helpers for dealing with the plan 9 interface. */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <parlib/assert.h>
#include <parlib/net.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

/* my cheap dial, assumes either /net/ or a protocol first, with !s btw the
 * proto, host, and port.  it also will modify addr temporarily.  */
int cheap_dial(char *addr, char *local, char *dir, int *cfdp)
{
	int ret, ctlfd, datafd, conv_id;
	char *prefix;
	char *hostname;						/* including !port */
	size_t buf_len = strlen(addr) + 30;	/* 30 should be enough extra */
	char *buf = malloc(buf_len);
	if (!buf) {
		perror("Unable to malloc buf!");
		return -1;
	}
	if (local || dir) {
		perror("Cheap dial doesn't support local or dir");
		ret = -1;
		goto out_buf;
	}
	hostname = strchr(addr, '!');
	if (!hostname) {
		perror("No first bang");
		ret = -1;
		goto out_buf;
	}
	*hostname++ = '\0';
	prefix = (addr[0] == '/' ? "" : "/net/");
	ret = snprintf(buf, buf_len, "%s%s/clone", prefix, addr);
	if (snprintf_error(ret, buf_len)) {
		perror("Clone chan path too long");
		ret = -1;
		goto out_readdr;
	}
	ctlfd = open(buf, O_RDWR);
	if (ctlfd < 0) {
		perror("Can't clone a conversation");
		ret = -1;
		goto out_readdr;
	}
	ret = read(ctlfd, buf, buf_len - 1);
	if (ret <= 0) {
		if (!ret)
			printf("Got early EOF from ctl\n");
		else
			perror("Can't read ctl");
		ret = -1;
		goto out_ctlfd;
	}
	buf[ret] = 0;
	conv_id = atoi(buf);
	ret = snprintf(buf, buf_len, "connect %s", hostname);
	if (snprintf_error(ret, buf_len)) {
		perror("Connect string too long");
		ret = -1;
		goto out_ctlfd;
	}
	if ((write(ctlfd, buf, strlen(buf)) <= 0)) {
		perror("Failed to connect");
		ret = -1;
		goto out_ctlfd;
	}
	ret = snprintf(buf, buf_len, "%s%s/%d/data", prefix, addr, conv_id);
	if (snprintf_error(ret, buf_len)) {
		perror("Data chan path too long");
		ret = -1;
		goto out_ctlfd;
	}
	datafd = open(buf, O_RDWR);
	if (datafd < 0) {
		perror("Failed to open data chan");
		ret = -1;
		goto out_ctlfd;
	}
	if (cfdp)
		*cfdp = ctlfd;
	else
		close(ctlfd);
	ret = datafd;
	/* skip over the ctlfd close */
	goto out_readdr;

out_ctlfd:
	close(ctlfd);
out_readdr:
	/* restore the change we made to addr */
	*--hostname = '!';
out_buf:
	free(buf);
	return ret;
}
