#include #include #include #include #include #include #include #include #include #include #define NODEFINE #include #include #include #include "fd.h" int pm_open(char *file, int mode) { char *path; int ufd, umode; File *f; struct stat s; if(strcmp(file, "stdin$") == 0) return pm_dup(0, -1); if(strcmp(file, "stdout$") == 0) return pm_dup(1, -1); if(strcmp(file, "stderr$") == 0) return pm_dup(2, -1); umode = mode&3; if(mode&PM_OTRUNC) umode |= O_TRUNC; // rlock(&dotlock); if((ufd = open(file, mode)) < 0){ pm_oserror(); // runlock(&dotlock); return -1; } if(fstat(ufd, &s) < 0){ close(ufd); pm_oserror(); // runlock(&dotlock); return -1; } if((path = pm_openpath(file)) == nil){ close(ufd); // runlock(&dotlock); return -1; } // runlock(&dotlock); if((f = pm_allocfile(ufd)) == nil){ pm_free(path); close(ufd); return -1; } f->type = S_ISDIR(s.st_mode) ? Tdir : Tfile; f->ufd = ufd; f->path = path; pm_qunlock(&f->lk); return f->pmfd; }