Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
J
jacobsa-fuse
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
jacobsa-fuse
Commits
6a1e2f55
Commit
6a1e2f55
authored
Jul 24, 2015
by
Aaron Jacobs
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Copied mount_linux.go.
parent
9b4cfc81
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
116 additions
and
0 deletions
+116
-0
mount_linux.go
mount_linux.go
+116
-0
No files found.
mount_linux.go
0 → 100644
View file @
6a1e2f55
package
fuseshim
import
(
"bufio"
"fmt"
"io"
"log"
"net"
"os"
"os/exec"
"sync"
"syscall"
)
// Maximum file write size we are prepared to receive from the kernel. Linux
// appears to limit writes to 128 KiB.
const
maxWrite
=
128
*
1024
func
lineLogger
(
wg
*
sync
.
WaitGroup
,
prefix
string
,
r
io
.
ReadCloser
)
{
defer
wg
.
Done
()
scanner
:=
bufio
.
NewScanner
(
r
)
for
scanner
.
Scan
()
{
switch
line
:=
scanner
.
Text
();
line
{
case
`fusermount: failed to open /etc/fuse.conf: Permission denied`
:
// Silence this particular message, it occurs way too
// commonly and isn't very relevant to whether the mount
// succeeds or not.
continue
default
:
log
.
Printf
(
"%s: %s"
,
prefix
,
line
)
}
}
if
err
:=
scanner
.
Err
();
err
!=
nil
{
log
.
Printf
(
"%s, error reading: %v"
,
prefix
,
err
)
}
}
func
mount
(
dir
string
,
conf
*
mountConfig
,
ready
chan
<-
struct
{},
errp
*
error
)
(
fusefd
*
os
.
File
,
err
error
)
{
// linux mount is never delayed
close
(
ready
)
fds
,
err
:=
syscall
.
Socketpair
(
syscall
.
AF_FILE
,
syscall
.
SOCK_STREAM
,
0
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"socketpair error: %v"
,
err
)
}
writeFile
:=
os
.
NewFile
(
uintptr
(
fds
[
0
]),
"fusermount-child-writes"
)
defer
writeFile
.
Close
()
readFile
:=
os
.
NewFile
(
uintptr
(
fds
[
1
]),
"fusermount-parent-reads"
)
defer
readFile
.
Close
()
cmd
:=
exec
.
Command
(
"fusermount"
,
"-o"
,
conf
.
getOptions
(),
"--"
,
dir
,
)
cmd
.
Env
=
append
(
os
.
Environ
(),
"_FUSE_COMMFD=3"
)
cmd
.
ExtraFiles
=
[]
*
os
.
File
{
writeFile
}
var
wg
sync
.
WaitGroup
stdout
,
err
:=
cmd
.
StdoutPipe
()
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"setting up fusermount stderr: %v"
,
err
)
}
stderr
,
err
:=
cmd
.
StderrPipe
()
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"setting up fusermount stderr: %v"
,
err
)
}
if
err
:=
cmd
.
Start
();
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"fusermount: %v"
,
err
)
}
wg
.
Add
(
2
)
go
lineLogger
(
&
wg
,
"mount helper output"
,
stdout
)
go
lineLogger
(
&
wg
,
"mount helper error"
,
stderr
)
wg
.
Wait
()
if
err
:=
cmd
.
Wait
();
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"fusermount: %v"
,
err
)
}
c
,
err
:=
net
.
FileConn
(
readFile
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"FileConn from fusermount socket: %v"
,
err
)
}
defer
c
.
Close
()
uc
,
ok
:=
c
.
(
*
net
.
UnixConn
)
if
!
ok
{
return
nil
,
fmt
.
Errorf
(
"unexpected FileConn type; expected UnixConn, got %T"
,
c
)
}
buf
:=
make
([]
byte
,
32
)
// expect 1 byte
oob
:=
make
([]
byte
,
32
)
// expect 24 bytes
_
,
oobn
,
_
,
_
,
err
:=
uc
.
ReadMsgUnix
(
buf
,
oob
)
scms
,
err
:=
syscall
.
ParseSocketControlMessage
(
oob
[
:
oobn
])
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"ParseSocketControlMessage: %v"
,
err
)
}
if
len
(
scms
)
!=
1
{
return
nil
,
fmt
.
Errorf
(
"expected 1 SocketControlMessage; got scms = %#v"
,
scms
)
}
scm
:=
scms
[
0
]
gotFds
,
err
:=
syscall
.
ParseUnixRights
(
&
scm
)
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"syscall.ParseUnixRights: %v"
,
err
)
}
if
len
(
gotFds
)
!=
1
{
return
nil
,
fmt
.
Errorf
(
"wanted 1 fd; got %#v"
,
gotFds
)
}
f
:=
os
.
NewFile
(
uintptr
(
gotFds
[
0
]),
"/dev/fuse"
)
return
f
,
nil
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment