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