Blame


1 b3994ec5 2003-12-11 devnull #include <u.h>
2 b3994ec5 2003-12-11 devnull #include <libc.h>
3 b3994ec5 2003-12-11 devnull #include <fcall.h>
4 b3994ec5 2003-12-11 devnull #include <fs.h>
5 b3994ec5 2003-12-11 devnull #include "fsimpl.h"
6 b3994ec5 2003-12-11 devnull
7 b3994ec5 2003-12-11 devnull int
8 b3994ec5 2003-12-11 devnull fsopenfd(Fsys *fs, char *name, int mode)
9 b3994ec5 2003-12-11 devnull {
10 b3994ec5 2003-12-11 devnull Fid *fid;
11 b3994ec5 2003-12-11 devnull Fcall tx, rx;
12 b3994ec5 2003-12-11 devnull
13 b3994ec5 2003-12-11 devnull if((fid = fswalk(fs->root, name)) == nil)
14 b3994ec5 2003-12-11 devnull return -1;
15 b3994ec5 2003-12-11 devnull tx.type = Topenfd;
16 b3994ec5 2003-12-11 devnull tx.fid = fid->fid;
17 b3994ec5 2003-12-11 devnull tx.mode = mode&~OCEXEC;
18 b3994ec5 2003-12-11 devnull if(fsrpc(fs, &tx, &rx, 0) < 0){
19 b3994ec5 2003-12-11 devnull fsclose(fid);
20 b3994ec5 2003-12-11 devnull return -1;
21 b3994ec5 2003-12-11 devnull }
22 b3994ec5 2003-12-11 devnull _fsputfid(fid);
23 b3994ec5 2003-12-11 devnull if(mode&OCEXEC && rx.unixfd>=0)
24 b3994ec5 2003-12-11 devnull fcntl(rx.unixfd, F_SETFL, FD_CLOEXEC);
25 b3994ec5 2003-12-11 devnull return rx.unixfd;
26 b3994ec5 2003-12-11 devnull }