Nikolaus Rath [Mon, 3 Oct 2016 04:22:02 +0000 (21:22 -0700)]
Merged fuse_session.c into fuse_lowlevel.c
This distinction no longer makes sens. fuse_lowlevel.c already contains
several session related functions, and fuse_session.c contains various
stuff that is more related to the channel interface.
Nikolaus Rath [Mon, 3 Oct 2016 03:52:33 +0000 (20:52 -0700)]
Don't handle --help and --version in fuse_session_new().
Help and version messages can be generated using the new
fuse_lowlevel_help(), fuse_lowlevel_version(), fuse_mount_help(), and
fuse_mount_version() functions.
The fuse_parse_cmdline() function has been made more powerful
to do this automatically, and is now explicitly intended only
for low-level API users.
This is a code simplication patch. We don't have to parse for --help and
--version in quite as many places, and we no longer have a low-level
initialization function be responsible for the (super-high level) task
of printing a program usage message.
In the high-level API, we can now handle the command line parsing
earlier and avoid running other initialization code if we're just going
to abort later on.
Nikolaus Rath [Sun, 2 Oct 2016 18:30:43 +0000 (11:30 -0700)]
Turn struct fuse_chan into an implementation detail
The only struct fuse_chan that's accessible to the user application is
the "master" channel that is returned by fuse_mount and stored in struct
fuse_session.
When using the multi-threaded main loop with the "clone_fd" option, each
worker thread gets its own struct fuse_chan. However, none of these are
available to the user application, nor do they hold references to struct
fuse_session (the pointer is always null).
Therefore, any presence of struct fuse_chan can be removed
without loss of functionality by relying on struct fuse_session instead.
This reduces the number of API functions and removes a potential source
of confusion (since the new API no longer looks as if it might be
possible to add multiple channels to one session, or to share one
channel between multiple sessions).
fuse_lowlevel_notify_*: take struct fuse_session instead of struct fuse_chan
The only struct fuse_chan that's available to the user application is
the one that is returned by fuse_mount. However, this is also
permanently available from struct fuse_session.
A later patch will therefore remove struct fuse_chan from the
public API completely. This patch prepares for this by changing the
fuse_lowlevel_notify_* functions to take a struct fuse_session
parameter instead of a struct fuse_chan parameter.
bobrofon [Thu, 4 Aug 2016 19:46:38 +0000 (02:46 +0700)]
Don't hardcode /sbin, /lib & /etc
Default values for MOUNT_FUSE_PATH, UDEV_RULES_PATH and INIT_D_PATH should be based on directory variables from GNU Coding Standarts.
Directory variables left unexpanded because installation directory options may be changed via "make install prefix=/foo".
There's no point in having tests failing all the time,
we will re-enable thread sanitizer once we have figured
out if the errors are bugs or false positives (and, if they
are bugs, fixed them).
libfuse/fuse_daemonize: wait until daemon child process is ready (#55)
Mounting a FUSE file system remotely using SSH in combination with
pseudo-terminal allocation (-t), results in "Transport endpoint is
not connected" errors when trying to access the file system contents.
For example:
# ssh -t root@localhost "cmsfs-fuse /dev/disk/by-path/ccw-0.0.0190 /CMSFS"
Connection to localhost closed.
# ls /CMSFS
ls: cannot access '/CMSFS': Transport endpoint is not connected
The cmsfs-fuse main program (which can also be any other FUSE file
system) calls into the fuse_main() libfuse library function.
The fuse_main() function later calls fuse_daemonize() to fork the
daemon process to handle the FUSE file system I/O.
The fuse_daemonize() function calls fork() as usual. The child
proceeds with setsid() and then redirecting its file descriptors
to /dev/null etc. The parent process, simply exits.
The child's functions and the parent's exit creates a subtle race.
This is seen with an SSH connection. The SSH command above calls
cmsfs-fuse on an allocated pseudo-terminal device (-t option).
If the parent exits, SSH receives the command completion and closes
the connection, that means, it closes the master side of the
pseudo-terminal. This causes a HUP signal being sent to the process
group on the pseudo-terminal. At this point in time, the child might
not have completed the setsid() call and, hence, becomes terminated.
Note that fuse daemon sets up its signal handlers after fuse_daemonize()
has completed.
Even if the child has the chance to disassociate from its parent process
group to become it's own process group with setsid(), the child still
has the pseudo-terminal opened as stdin, stdout, and stderr. So the
pseudo-terminal still behave as controlling terminal and might cause a
SIGHUP at closing the the master side.
To solve the problem, the parent has to wait until the child (the fuse
daemon process) has completed its processing, that means, has become
its own process group with setsid() and closed any file descriptors
pointing to the pseudo-terminal.
Nikolaus Rath [Sun, 5 Jun 2016 14:45:35 +0000 (10:45 -0400)]
Don't use IFTODT macro.
IFTODT is provided by libc to convert from mode_t (as included in e.g.
struct fstat) to d_type (unsigned char element of struct dirent, as
returned by e.g. readdir). However, fuse actually uses a different
struct fuse_dirent with a "type" field of type uint32.
In other words, the semantics of (struct fuse_dirent).type are
not necessarily the same as those of (struct dirent).d_type.
Nikolaus Rath [Mon, 28 Mar 2016 21:14:10 +0000 (14:14 -0700)]
Whitespace cleanup.
Applied (whitespace-cleanup) to each file. Having whitespace changes
in the VCS is ugly, but it ensures that in the future committers
can run this function to *avoid* commiting any whitespace.
Nikolaus Rath [Thu, 14 Jan 2016 18:14:35 +0000 (10:14 -0800)]
Update makeconf.sh
Describe why manual copying of config.rpath is necessary, and fail
with a more helpful message if it can't be found.
Remove code for systems without autoreconf - it's apparently not used
by anyone since it has been broken for quite some time (there is no
`kernel` directory anymore).