#include <sys/types.h>
#include <dirent.h>
#include <sys/time.h> 
#include <unistd.h>
#include <sys/stat.h>
#include <errno.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <sys/socket.h>

#define NODEFINE
#include <u.h>
#include <libc.h>
#include <fcall.h>
#include "fd.h"

int
pm_create(char *file, int mode, ulong perm)
{
	int m, type, ufd;
	char *path;
	File *f;

//	rlock(&dotlock);
	if((path = pm_openpath(file)) == nil){
//		runlock(&dotlock);
		return -1;
	}
	if(perm&PM_DMDIR){
		if(mode != PM_OREAD){
//			runlock(&dotlock);
			pm_werrstr("invalid mode");
			return -1;
		}
		if(mkdir(file, perm) < 0){
//			runlock(&dotlock);
			pm_oserror();
			return -1;
		}
		if((ufd = open(file, O_RDONLY, perm)) < 0){
//			runlock(&dotlock);
			pm_oserror();
			return -1;
		}
		type = Tdir;
	}else{
		m = (mode&3)|O_CREAT;
		if(mode&PM_OEXCL)
			m |= O_EXCL;
		else
			m |= O_TRUNC;
		if((ufd = open(file, m, perm)) < 0){
			pm_oserror();
			return -1;
		}
		type = Tfile;
	}
	if((f = pm_allocfile(ufd)) == nil){
		close(ufd);
		return -1;
	}
	f->type = type;
	f->mode = mode;
	f->ufd = ufd;
	f->path = path;
	pm_qunlock(&f->lk);
	return ufd;
}


syntax highlighted by Code2HTML, v. 0.9.1