xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/open.c (revision 781103c4074deb8af160e8a0da2742ba6b29dc2b)
13e12c5d1SDavid du Colombier #include <errno.h>
23e12c5d1SDavid du Colombier #include <stdarg.h>
33e12c5d1SDavid du Colombier #include <stdlib.h>
43e12c5d1SDavid du Colombier #include <unistd.h>
53e12c5d1SDavid du Colombier #include <string.h>
63e12c5d1SDavid du Colombier #include "lib.h"
7219b2ee8SDavid du Colombier #include <sys/stat.h>
83e12c5d1SDavid du Colombier #include "sys9.h"
93e12c5d1SDavid du Colombier 
103e12c5d1SDavid du Colombier /*
113e12c5d1SDavid du Colombier  * O_NOCTTY has no effect
123e12c5d1SDavid du Colombier  */
133e12c5d1SDavid du Colombier int
open(const char * path,int flags,...)143e12c5d1SDavid du Colombier open(const char *path, int flags, ...)
153e12c5d1SDavid du Colombier {
163e12c5d1SDavid du Colombier 	int n;
173e12c5d1SDavid du Colombier 	long f;
183e12c5d1SDavid du Colombier 	int mode;
193e12c5d1SDavid du Colombier 	Fdinfo *fi;
203e12c5d1SDavid du Colombier 	va_list va;
213e12c5d1SDavid du Colombier 
223e12c5d1SDavid du Colombier 	f = flags&O_ACCMODE;
233e12c5d1SDavid du Colombier 	if(flags&O_CREAT){
243e12c5d1SDavid du Colombier 		if(access(path, 0) >= 0){
253e12c5d1SDavid du Colombier 			if(flags&O_EXCL){
263e12c5d1SDavid du Colombier 				errno = EEXIST;
273e12c5d1SDavid du Colombier 				return -1;
283e12c5d1SDavid du Colombier 			}else{
293e12c5d1SDavid du Colombier 				if((flags&O_TRUNC)&&(flags&(O_RDWR|O_WRONLY)))
303e12c5d1SDavid du Colombier 					f |= 16;
313e12c5d1SDavid du Colombier 				n = _OPEN(path, f);
323e12c5d1SDavid du Colombier 			}
333e12c5d1SDavid du Colombier 		}else{
343e12c5d1SDavid du Colombier 			va_start(va, flags);
353e12c5d1SDavid du Colombier 			mode = va_arg(va, int);
363e12c5d1SDavid du Colombier 			va_end(va);
373e12c5d1SDavid du Colombier 			n = _CREATE(path, f, mode&0777);
383e12c5d1SDavid du Colombier 		}
393e12c5d1SDavid du Colombier 		if(n < 0)
403e12c5d1SDavid du Colombier 			_syserrno();
413e12c5d1SDavid du Colombier 	}else{
423e12c5d1SDavid du Colombier 		if((flags&O_TRUNC)&&(flags&(O_RDWR|O_WRONLY)))
433e12c5d1SDavid du Colombier 			f |= 16;
443e12c5d1SDavid du Colombier 		n = _OPEN(path, f);
453e12c5d1SDavid du Colombier 		if(n < 0)
463e12c5d1SDavid du Colombier 			_syserrno();
473e12c5d1SDavid du Colombier 	}
483e12c5d1SDavid du Colombier 	if(n >= 0){
493e12c5d1SDavid du Colombier 		fi = &_fdinfo[n];
503e12c5d1SDavid du Colombier 		fi->flags = FD_ISOPEN;
513e12c5d1SDavid du Colombier 		fi->oflags = flags&(O_ACCMODE|O_NONBLOCK|O_APPEND);
52*fb7f0c93SDavid du Colombier 		fi->uid = -2;
53*fb7f0c93SDavid du Colombier 		fi->gid = -2;
543e12c5d1SDavid du Colombier 		fi->name = malloc(strlen(path)+1);
553e12c5d1SDavid du Colombier 		if(fi->name)
563e12c5d1SDavid du Colombier 			strcpy(fi->name, path);
573e12c5d1SDavid du Colombier 		if(fi->oflags&O_APPEND)
58d9306527SDavid du Colombier 			_SEEK(n, 0, 2);
593e12c5d1SDavid du Colombier 	}
603e12c5d1SDavid du Colombier 	return n;
613e12c5d1SDavid du Colombier }
62