#include <u.h>
#include <libc.h>
#include <fcall.h>
#include <9pclient.h>
#include "plumb.h"

static CFsys *fsplumb;
static int pfd = -1;
static CFid *pfid;

int
plumbopen(char *name, int omode)
{
	if(fsplumb == nil)
		fsplumb = nsmount("plumb", "");
	if(fsplumb == nil)
		return -1;
	/*
	* It's important that when we send something,
	* we find out whether it was a valid plumb write.
	* (If it isn't, the client might fall back to some
	* other mechanism or indicate to the user what happened.)
	* We can't use a pipe for this, so we have to use the
	* fid interface.  But we need to return a fd.
	* Return a fd for /dev/null so that we return a unique
	* file descriptor.  In plumbsend we'll look for pfd
	* and use the recorded fid instead.
	*/
	if((omode&3) == OWRITE){
		if(pfd != -1){
			werrstr("already have plumb send open");
			return -1;
		}
		pfd = open("/dev/null", OWRITE);
		if(pfd < 0)
			return -1;
		pfid = fsopen(fsplumb, name, omode);
		if(pfid == nil){
			close(pfd);
			pfd = -1;
			return -1;
		}
		return pfd;
	}

	return fsopenfd(fsplumb, name, omode);
}

CFid*
plumbopenfid(char *name, int mode)
{
	if(fsplumb == nil)
		fsplumb = nsmount("plumb", "");
	if(fsplumb == nil)
		return nil;
	return fsopen(fsplumb, name, mode);
}

int
plumbsendtofid(CFid *fid, Plumbmsg *m)
{
	char *buf;
	int n;

	if(fid == nil){
		werrstr("invalid fid");
		return -1;
	}
	buf = plumbpack(m, &n);
	if(buf == nil)
		return -1;
	n = fswrite(fid, buf, n);
	free(buf);
	return n;
}

int
plumbsend(int fd, Plumbmsg *m)
{
	if(fd == -1){
		werrstr("invalid fd");
		return -1;
	}
	if(fd != pfd){
		werrstr("fd is not the plumber");
		return -1;
	}
	return plumbsendtofid(pfid, m);
}

Plumbmsg*
plumbrecv(int fd)
{
	char *buf;
	Plumbmsg *m;
	int n, more;

	buf = malloc(8192);
	if(buf == nil)
		return nil;
	n = read(fd, buf, 8192);
	m = nil;
	if(n > 0){
		m = plumbunpackpartial(buf, n, &more);
		if(m==nil && more>0){
			/* we now know how many more bytes to read for complete message */
			buf = realloc(buf, n+more);
			if(buf == nil)
				return nil;
			if(readn(fd, buf+n, more) == more)
				m = plumbunpackpartial(buf, n+more, nil);
		}
	}
	free(buf);
	return m;
}

Plumbmsg*
plumbrecvfid(CFid *fid)
{
	char *buf;
	Plumbmsg *m;
	int n, more;

	buf = malloc(8192);
	if(buf == nil)
		return nil;
	n = fsread(fid, buf, 8192);
	m = nil;
	if(n > 0){
		m = plumbunpackpartial(buf, n, &more);
		if(m==nil && more>0){
			/* we now know how many more bytes to read for complete message */
			buf = realloc(buf, n+more);
			if(buf == nil)
				return nil;
			if(fsreadn(fid, buf+n, more) == more)
				m = plumbunpackpartial(buf, n+more, nil);
		}
	}
	free(buf);
	return m;
}

