mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-27 11:52:03 +00:00
FreeBSD fixes (Lou Kamenov)
This commit is contained in:
parent
8f8ef0c6a9
commit
143cdf5758
2 changed files with 97 additions and 51 deletions
|
@ -6,6 +6,9 @@ int fusebufsize;
|
||||||
int fusemaxwrite;
|
int fusemaxwrite;
|
||||||
FuseMsg *fusemsglist;
|
FuseMsg *fusemsglist;
|
||||||
|
|
||||||
|
int mountfuse(char *mtpt);
|
||||||
|
void unmountfuse(char *mtpt);
|
||||||
|
|
||||||
FuseMsg*
|
FuseMsg*
|
||||||
allocfusemsg(void)
|
allocfusemsg(void)
|
||||||
{
|
{
|
||||||
|
@ -58,10 +61,20 @@ readfusemsg(void)
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
m->nbuf = n;
|
m->nbuf = n;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FreeBSD FUSE sends a short length in the header
|
||||||
|
* for FUSE_INIT even though the actual read length
|
||||||
|
* is correct.
|
||||||
|
*/
|
||||||
|
if(n == sizeof(*m->hdr)+sizeof(struct fuse_init_in)
|
||||||
|
&& m->hdr->opcode == FUSE_INIT && m->hdr->len < n)
|
||||||
|
m->hdr->len = n;
|
||||||
|
|
||||||
if(m->hdr->len != n)
|
if(m->hdr->len != n)
|
||||||
sysfatal("readfusemsg: got %d wanted %d",
|
sysfatal("readfusemsg: got %d wanted %d",
|
||||||
n, m->hdr->len);
|
n, m->hdr->len);
|
||||||
m->hdr->len -= sizeof(m->hdr);
|
m->hdr->len -= sizeof(*m->hdr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Paranoia.
|
* Paranoia.
|
||||||
|
@ -246,54 +259,6 @@ replyfuseerrstr(FuseMsg *m)
|
||||||
replyfuseerrno(m, errstr2errno());
|
replyfuseerrno(m, errstr2errno());
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Mounts a fuse file system on mtpt and returns
|
|
||||||
* a file descriptor for the corresponding fuse
|
|
||||||
* message conversation.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
mountfuse(char *mtpt)
|
|
||||||
{
|
|
||||||
int p[2], pid, fd;
|
|
||||||
char buf[20];
|
|
||||||
|
|
||||||
if(socketpair(AF_UNIX, SOCK_STREAM, 0, p) < 0)
|
|
||||||
return -1;
|
|
||||||
pid = fork();
|
|
||||||
if(pid < 0)
|
|
||||||
return -1;
|
|
||||||
if(pid == 0){
|
|
||||||
close(p[1]);
|
|
||||||
snprint(buf, sizeof buf, "%d", p[0]);
|
|
||||||
putenv("_FUSE_COMMFD", buf);
|
|
||||||
execlp("fusermount", "fusermount", "--", mtpt, nil);
|
|
||||||
fprint(2, "exec fusermount: %r\n");
|
|
||||||
_exit(1);
|
|
||||||
}
|
|
||||||
close(p[0]);
|
|
||||||
fd = recvfd(p[1]);
|
|
||||||
close(p[1]);
|
|
||||||
waitpid();
|
|
||||||
return fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
unmountfuse(char *mtpt)
|
|
||||||
{
|
|
||||||
int pid;
|
|
||||||
|
|
||||||
pid = fork();
|
|
||||||
if(pid < 0)
|
|
||||||
return;
|
|
||||||
if(pid == 0){
|
|
||||||
atexitdont(unmountatexit);
|
|
||||||
execlp("fusermount", "fusermount", "-u", "-z", "--", mtpt, nil);
|
|
||||||
fprint(2, "exec fusermount -u: %r\n");
|
|
||||||
_exit(1);
|
|
||||||
}
|
|
||||||
waitpid();
|
|
||||||
}
|
|
||||||
|
|
||||||
char *fusemtpt;
|
char *fusemtpt;
|
||||||
void
|
void
|
||||||
unmountatexit(void)
|
unmountatexit(void)
|
||||||
|
@ -770,3 +735,77 @@ fusefmt(Fmt *fmt)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mounts a fuse file system on mtpt and returns
|
||||||
|
* a file descriptor for the corresponding fuse
|
||||||
|
* message conversation.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
mountfuse(char *mtpt)
|
||||||
|
{
|
||||||
|
#if defined(__linux__)
|
||||||
|
int p[2], pid, fd;
|
||||||
|
char buf[20];
|
||||||
|
|
||||||
|
if(socketpair(AF_UNIX, SOCK_STREAM, 0, p) < 0)
|
||||||
|
return -1;
|
||||||
|
pid = fork();
|
||||||
|
if(pid < 0)
|
||||||
|
return -1;
|
||||||
|
if(pid == 0){
|
||||||
|
close(p[1]);
|
||||||
|
snprint(buf, sizeof buf, "%d", p[0]);
|
||||||
|
putenv("_FUSE_COMMFD", buf);
|
||||||
|
execlp("fusermount", "fusermount", "--", mtpt, nil);
|
||||||
|
fprint(2, "exec fusermount: %r\n");
|
||||||
|
_exit(1);
|
||||||
|
}
|
||||||
|
close(p[0]);
|
||||||
|
fd = recvfd(p[1]);
|
||||||
|
close(p[1]);
|
||||||
|
waitpid();
|
||||||
|
return fd;
|
||||||
|
#elif defined(__FreeBSD__)
|
||||||
|
int pid, fd;
|
||||||
|
char buf[20];
|
||||||
|
|
||||||
|
if((fd = open("/dev/fuse", ORDWR)) < 0)
|
||||||
|
return -1;
|
||||||
|
snprint(buf, sizeof buf, "%d", fd);
|
||||||
|
|
||||||
|
pid = fork();
|
||||||
|
if(pid < 0)
|
||||||
|
return -1;
|
||||||
|
if(pid == 0){
|
||||||
|
execlp("mount_fusefs", "mount_fusefs", buf, mtpt, nil);
|
||||||
|
fprint(2, "exec mount_fusefs: %r\n");
|
||||||
|
_exit(1);
|
||||||
|
}
|
||||||
|
waitpid();
|
||||||
|
return fd;
|
||||||
|
#else
|
||||||
|
werrstr("cannot mount fuse on this system");
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
unmountfuse(char *mtpt)
|
||||||
|
{
|
||||||
|
int pid;
|
||||||
|
|
||||||
|
pid = fork();
|
||||||
|
if(pid < 0)
|
||||||
|
return;
|
||||||
|
if(pid == 0){
|
||||||
|
#if defined(__linux__)
|
||||||
|
execlp("fusermount", "fusermount", "-u", "-z", "--", mtpt, nil);
|
||||||
|
fprint(2, "exec fusermount -u: %r\n");
|
||||||
|
#else
|
||||||
|
execlp("umount", "umount", mtpt, nil);
|
||||||
|
fprint(2, "exec umount: %r\n");
|
||||||
|
#endif
|
||||||
|
_exit(1);
|
||||||
|
}
|
||||||
|
waitpid();
|
||||||
|
}
|
||||||
|
|
|
@ -689,7 +689,7 @@ fuseaccess(FuseMsg *m)
|
||||||
{
|
{
|
||||||
struct fuse_access_in *in;
|
struct fuse_access_in *in;
|
||||||
CFid *fid;
|
CFid *fid;
|
||||||
int err;
|
int err, omode;
|
||||||
static int a2o[] = {
|
static int a2o[] = {
|
||||||
0,
|
0,
|
||||||
OEXEC,
|
OEXEC,
|
||||||
|
@ -706,7 +706,14 @@ fuseaccess(FuseMsg *m)
|
||||||
replyfuseerrno(m, EINVAL);
|
replyfuseerrno(m, EINVAL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if((fid = _fuseopenfid(m->hdr->nodeid, 0, a2o[in->mask], &err)) == nil){
|
omode = a2o[in->mask];
|
||||||
|
if((fid = nodeid2fid(m->hdr->nodeid)) == nil){
|
||||||
|
replyfuseerrno(m, ESTALE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(fsqid(fid).type&QTDIR)
|
||||||
|
omode = OREAD;
|
||||||
|
if((fid = _fuseopenfid(m->hdr->nodeid, 0, omode, &err)) == nil){
|
||||||
replyfuseerrno(m, err);
|
replyfuseerrno(m, err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue