#include <9pm/u.h>
#include <9pm/libc.h>
#include <9pm/fcall.h>
#include <9pm/ns.h>

int
open(char *file, int mode)
{
	char *fullpath, *path;
	volatile int ret;
	volatile Chan *c;
	Mnt *mnt;

	if((path = nsassign(file, &mnt, &fullpath)) == nil)
		return -1;
	ret = -1;
	checkerrstack();
	c = nil;
	if(!waserror()){
		c = newchan(fullpath, mnt);
		(*mnt->dev->_open)(c, mnt, path, mode);
		ret = newfd(c);
		poperror();
	}
	if(ret >= 0){
		c->omode = mode;
		c = nil;	/* ref goes into fd table */
	}
	if(c)
		cclose(c);
	free(path);
	mntclose(mnt);
	checkerrstack();
	return ret;
}


syntax highlighted by Code2HTML, v. 0.9.1