#include <u.h>
#include <libc.h>
#include <fcall.h>
#include <thread.h>
#include <9p.h>
#include <auth.h>
#include "post.h"

Postcrud*
_post1(Srv *s, char *name, char *mtpt, int flag)
{
	Postcrud *p;

	p = emalloc9p(sizeof *p);
	if(!s->nopipe){
		if(pipe(p->fd) < 0)
			sysfatal("pipe: %r");
		s->infd = s->outfd = p->fd[1];
		s->srvfd = p->fd[0];
	}
	if(name)
		if(postfd(name, s->srvfd) < 0)
			sysfatal("postfd %s: %r", name);
	p->s = s;
	p->mtpt = mtpt;
	p->flag = flag;
	return p;
}

void
_post2(void *v)
{
	Srv *s;

	s = v;
	rfork(RFNOTEG);
	if(!s->leavefdsopen){
		rendezvous((ulong)s, 0);
		close(s->srvfd);
	}
	srv(s);
}

void
_post3(Postcrud *p)
{
	/*
	 * Normally the server is posting as the last thing it does
	 * before exiting, so the correct thing to do is drop into
	 * a different fd space and close the 9P server half of the
	 * pipe before trying to mount the kernel half.  This way,
	 * if the file server dies, we don't have a ref to the 9P server
	 * half of the pipe.  Then killing the other procs will drop
	 * all the refs on the 9P server half, and the mount will fail.
	 * Otherwise the mount hangs forever.
	 *
	 * Libthread in general and acme win in particular make
	 * it hard to make this fd bookkeeping work out properly,
	 * so leaveinfdopen is a flag that win sets to opt out of this
	 * safety net.
	 */
	if(!p->s->leavefdsopen){
		rfork(RFFDG);
		rendezvous((ulong)p->s, 0);
		close(p->s->infd);
		if(p->s->infd != p->s->outfd)
			close(p->s->outfd);
	}

	if(p->mtpt){
		if(amount(p->s->srvfd, p->mtpt, p->flag, "") == -1)
			sysfatal("mount %s: %r", p->mtpt);
	}else
		close(p->s->srvfd);
	free(p);
}

