aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Hajnoczi <stefanha@gmail.com>2019-09-04 15:59:18 +0100
committerNikolaus Rath <Nikolaus@rath.org>2019-09-04 15:59:18 +0100
commit317181e8ea1b3406919b946ca5524f8b9f34817d (patch)
tree0d0e0a2eb0d3d309dbabbdcdd6cb62131507b592
parentf39c71dcf99292c188bb6f0a117d7e118f92bfb1 (diff)
downloadlibfuse-317181e8ea1b3406919b946ca5524f8b9f34817d.tar.gz
Introduce callback for logging
Introduce an API for custom log handler functions. This allows libfuse applications to send messages to syslog(3) or other logging systems. See include/fuse_log.h for details. Convert libfuse from fprintf(stderr, ...) to log_fuse(level, ...). Most messages are error messages with FUSE_LOG_ERR log level. There are also some debug messages which now use the FUSE_LOG_DEBUG log level. Note that lib/mount_util.c is used by both libfuse and fusermount3. Since fusermount3 does not link against libfuse, we cannot call fuse_log() from lib/mount_util.c. This file will continue to use fprintf(stderr, ...) until someone figures out how to split it up. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
-rw-r--r--ChangeLog.rst7
-rw-r--r--include/fuse_common.h1
-rw-r--r--include/fuse_log.h74
-rw-r--r--include/meson.build2
-rw-r--r--lib/cuse_lowlevel.c30
-rwxr-xr-xlib/fuse.c149
-rw-r--r--lib/fuse_i.h2
-rw-r--r--lib/fuse_log.c41
-rw-r--r--lib/fuse_loop_mt.c14
-rw-r--r--lib/fuse_lowlevel.c94
-rw-r--r--lib/fuse_opt.c9
-rw-r--r--lib/fuse_signals.c4
-rw-r--r--lib/helper.c10
-rw-r--r--lib/meson.build3
-rw-r--r--lib/modules/iconv.c8
-rw-r--r--lib/modules/subdir.c8
-rw-r--r--lib/mount.c20
-rw-r--r--lib/mount_bsd.c2
18 files changed, 303 insertions, 175 deletions
diff --git a/ChangeLog.rst b/ChangeLog.rst
index aa7842a..d46fe29 100644
--- a/ChangeLog.rst
+++ b/ChangeLog.rst
@@ -1,3 +1,10 @@
+Unreleased Changes
+==================
+
+* Added custom log message handler function support so that libfuse
+ applications can direct messages to syslog(3) or other logging systems.
+ stderr remains the default. See `fuse_log.h` for the new API.
+
libfuse 3.6.2 (2019-07-09)
==========================
diff --git a/include/fuse_common.h b/include/fuse_common.h
index 0809441..2d686b2 100644
--- a/include/fuse_common.h
+++ b/include/fuse_common.h
@@ -15,6 +15,7 @@
#define FUSE_COMMON_H_
#include "fuse_opt.h"
+#include "fuse_log.h"
#include <stdint.h>
#include <sys/types.h>
diff --git a/include/fuse_log.h b/include/fuse_log.h
new file mode 100644
index 0000000..df43697
--- /dev/null
+++ b/include/fuse_log.h
@@ -0,0 +1,74 @@
+/*
+ FUSE: Filesystem in Userspace
+ Copyright (C) 2019 Red Hat, Inc.
+
+ This program can be distributed under the terms of the GNU LGPLv2.
+ See the file COPYING.LIB.
+*/
+
+#ifndef FUSE_LOG_H_
+#define FUSE_LOG_H_
+
+/** @file
+ *
+ * This file defines the logging interface of FUSE
+ */
+
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Log severity level
+ *
+ * These levels correspond to syslog(2) log levels since they are widely used.
+ */
+enum fuse_log_level {
+ FUSE_LOG_EMERG,
+ FUSE_LOG_ALERT,
+ FUSE_LOG_CRIT,
+ FUSE_LOG_ERR,
+ FUSE_LOG_WARNING,
+ FUSE_LOG_NOTICE,
+ FUSE_LOG_INFO,
+ FUSE_LOG_DEBUG
+};
+
+/**
+ * Log message handler function.
+ *
+ * This function must be thread-safe. It may be called from any libfuse
+ * function, including fuse_parse_cmdline() and other functions invoked before
+ * a FUSE filesystem is created.
+ *
+ * Install a custom log message handler function using fuse_set_log_func().
+ *
+ * @param level log severity level
+ * @param fmt sprintf-style format string including newline
+ * @param ap format string arguments
+ */
+typedef void (*fuse_log_func_t)(enum fuse_log_level level,
+ const char *fmt, va_list ap);
+
+/**
+ * Install a custom log handler function.
+ *
+ * Log messages are emitted by libfuse functions to report errors and debug
+ * information. Messages are printed to stderr by default but this can be
+ * overridden by installing a custom log message handler function.
+ *
+ * The log message handler function is global and affects all FUSE filesystems
+ * created within this process.
+ *
+ * @param func a custom log message handler function or NULL to revert to
+ * the default
+ */
+void fuse_set_log_func(fuse_log_func_t func);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* FUSE_LOG_H_ */
diff --git a/include/meson.build b/include/meson.build
index 55cb6f7..bf67197 100644
--- a/include/meson.build
+++ b/include/meson.build
@@ -1,4 +1,4 @@
libfuse_headers = [ 'fuse.h', 'fuse_common.h', 'fuse_lowlevel.h',
- 'fuse_opt.h', 'cuse_lowlevel.h' ]
+ 'fuse_opt.h', 'cuse_lowlevel.h', 'fuse_log.h' ]
install_headers(libfuse_headers, subdir: 'fuse3')
diff --git a/lib/cuse_lowlevel.c b/lib/cuse_lowlevel.c
index 019b20f..9917b64 100644
--- a/lib/cuse_lowlevel.c
+++ b/lib/cuse_lowlevel.c
@@ -122,14 +122,14 @@ static struct cuse_data *cuse_prep_data(const struct cuse_info *ci,
NULL);
if (dev_info_len > CUSE_INIT_INFO_MAX) {
- fprintf(stderr, "cuse: dev_info (%zu) too large, limit=%u\n",
+ fuse_log(FUSE_LOG_ERR, "cuse: dev_info (%zu) too large, limit=%u\n",
dev_info_len, CUSE_INIT_INFO_MAX);
return NULL;
}
cd = calloc(1, sizeof(*cd) + dev_info_len);
if (!cd) {
- fprintf(stderr, "cuse: failed to allocate cuse_data\n");
+ fuse_log(FUSE_LOG_ERR, "cuse: failed to allocate cuse_data\n");
return NULL;
}
@@ -203,8 +203,8 @@ void cuse_lowlevel_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
(void) nodeid;
if (se->debug) {
- fprintf(stderr, "CUSE_INIT: %u.%u\n", arg->major, arg->minor);
- fprintf(stderr, "flags=0x%08x\n", arg->flags);
+ fuse_log(FUSE_LOG_DEBUG, "CUSE_INIT: %u.%u\n", arg->major, arg->minor);
+ fuse_log(FUSE_LOG_DEBUG, "flags=0x%08x\n", arg->flags);
}
se->conn.proto_major = arg->major;
se->conn.proto_minor = arg->minor;
@@ -212,14 +212,14 @@ void cuse_lowlevel_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
se->conn.want = 0;
if (arg->major < 7) {
- fprintf(stderr, "cuse: unsupported protocol version: %u.%u\n",
+ fuse_log(FUSE_LOG_ERR, "cuse: unsupported protocol version: %u.%u\n",
arg->major, arg->minor);
fuse_reply_err(req, EPROTO);
return;
}
if (bufsize < FUSE_MIN_READ_BUFFER) {
- fprintf(stderr, "cuse: warning: buffer size too small: %zu\n",
+ fuse_log(FUSE_LOG_ERR, "cuse: warning: buffer size too small: %zu\n",
bufsize);
bufsize = FUSE_MIN_READ_BUFFER;
}
@@ -242,14 +242,14 @@ void cuse_lowlevel_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
outarg.dev_minor = cd->dev_minor;
if (se->debug) {
- fprintf(stderr, " CUSE_INIT: %u.%u\n",
+ fuse_log(FUSE_LOG_DEBUG, " CUSE_INIT: %u.%u\n",
outarg.major, outarg.minor);
- fprintf(stderr, " flags=0x%08x\n", outarg.flags);
- fprintf(stderr, " max_read=0x%08x\n", outarg.max_read);
- fprintf(stderr, " max_write=0x%08x\n", outarg.max_write);
- fprintf(stderr, " dev_major=%u\n", outarg.dev_major);
- fprintf(stderr, " dev_minor=%u\n", outarg.dev_minor);
- fprintf(stderr, " dev_info: %.*s\n", cd->dev_info_len,
+ fuse_log(FUSE_LOG_DEBUG, " flags=0x%08x\n", outarg.flags);
+ fuse_log(FUSE_LOG_DEBUG, " max_read=0x%08x\n", outarg.max_read);
+ fuse_log(FUSE_LOG_DEBUG, " max_write=0x%08x\n", outarg.max_write);
+ fuse_log(FUSE_LOG_DEBUG, " dev_major=%u\n", outarg.dev_major);
+ fuse_log(FUSE_LOG_DEBUG, " dev_minor=%u\n", outarg.dev_minor);
+ fuse_log(FUSE_LOG_DEBUG, " dev_info: %.*s\n", cd->dev_info_len,
cd->dev_info);
}
@@ -303,9 +303,9 @@ struct fuse_session *cuse_lowlevel_setup(int argc, char *argv[],
fd = open(devname, O_RDWR);
if (fd == -1) {
if (errno == ENODEV || errno == ENOENT)
- fprintf(stderr, "cuse: device not found, try 'modprobe cuse' first\n");
+ fuse_log(FUSE_LOG_ERR, "cuse: device not found, try 'modprobe cuse' first\n");
else
- fprintf(stderr, "cuse: failed to open %s: %s\n",
+ fuse_log(FUSE_LOG_ERR, "cuse: failed to open %s: %s\n",
devname, strerror(errno));
goto err_se;
}
diff --git a/lib/fuse.c b/lib/fuse.c
index 317abac..229e139 100755
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -214,12 +214,12 @@ static int fuse_register_module(const char *name,
mod = calloc(1, sizeof(struct fuse_module));
if (!mod) {
- fprintf(stderr, "fuse: failed to allocate module\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: failed to allocate module\n");
return -1;
}
mod->name = strdup(name);
if (!mod->name) {
- fprintf(stderr, "fuse: failed to allocate module name\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: failed to allocate module name\n");
free(mod);
return -1;
}
@@ -256,19 +256,19 @@ static int fuse_load_so_module(const char *module)
tmp = malloc(strlen(module) + 64);
if (!tmp) {
- fprintf(stderr, "fuse: memory allocation failed\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: memory allocation failed\n");
return -1;
}
sprintf(tmp, "libfusemod_%s.so", module);
so = calloc(1, sizeof(struct fusemod_so));
if (!so) {
- fprintf(stderr, "fuse: failed to allocate module so\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: failed to allocate module so\n");
goto out;
}
so->handle = dlopen(tmp, RTLD_NOW);
if (so->handle == NULL) {
- fprintf(stderr, "fuse: dlopen(%s) failed: %s\n",
+ fuse_log(FUSE_LOG_ERR, "fuse: dlopen(%s) failed: %s\n",
tmp, dlerror());
goto out_free_so;
}
@@ -276,7 +276,7 @@ static int fuse_load_so_module(const char *module)
sprintf(tmp, "fuse_module_%s_factory", module);
*(void**)(&factory) = dlsym(so->handle, tmp);
if (factory == NULL) {
- fprintf(stderr, "fuse: symbol <%s> not found in module: %s\n",
+ fuse_log(FUSE_LOG_ERR, "fuse: symbol <%s> not found in module: %s\n",
tmp, dlerror());
goto out_dlclose;
}
@@ -481,7 +481,8 @@ static void free_slab(struct fuse *f, struct node_slab *slab)
list_del(&slab->list);
res = munmap(slab, f->pagesize);
if (res == -1)
- fprintf(stderr, "fuse warning: munmap(%p) failed\n", slab);
+ fuse_log(FUSE_LOG_WARNING, "fuse warning: munmap(%p) failed\n",
+ slab);
}
static void free_node_mem(struct fuse *f, struct node *node)
@@ -540,7 +541,7 @@ static struct node *get_node(struct fuse *f, fuse_ino_t nodeid)
{
struct node *node = get_node_nocheck(f, nodeid);
if (!node) {
- fprintf(stderr, "fuse internal error: node %llu not found\n",
+ fuse_log(FUSE_LOG_ERR, "fuse internal error: node %llu not found\n",
(unsigned long long) nodeid);
abort();
}
@@ -754,7 +755,7 @@ static void unhash_name(struct fuse *f, struct node *node)
remerge_name(f);
return;
}
- fprintf(stderr,
+ fuse_log(FUSE_LOG_ERR,
"fuse internal error: unable to unhash node: %llu\n",
(unsigned long long) node->nodeid);
abort();
@@ -819,7 +820,7 @@ static int hash_name(struct fuse *f, struct node *node, fuse_ino_t parentid,
static void delete_node(struct fuse *f, struct node *node)
{
if (f->conf.debug)
- fprintf(stderr, "DELETE: %llu\n",
+ fuse_log(FUSE_LOG_DEBUG, "DELETE: %llu\n",
(unsigned long long) node->nodeid);
assert(node->treelock == 0);
@@ -1165,10 +1166,10 @@ static void debug_path(struct fuse *f, const char *msg, fuse_ino_t nodeid,
wnode = lookup_node(f, nodeid, name);
if (wnode) {
- fprintf(stderr, "%s %llu (w)\n",
+ fuse_log(FUSE_LOG_DEBUG, "%s %llu (w)\n",
msg, (unsigned long long) wnode->nodeid);
} else {
- fprintf(stderr, "%s %llu\n",
+ fuse_log(FUSE_LOG_DEBUG, "%s %llu\n",
msg, (unsigned long long) nodeid);
}
}
@@ -1479,7 +1480,7 @@ static int rename_node(struct fuse *f, fuse_ino_t olddir, const char *oldname,
if (newnode != NULL) {
if (hide) {
- fprintf(stderr, "fuse: hidden file got created during hiding\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: hidden file got created during hiding\n");
err = -EBUSY;
goto out;
}
@@ -1632,7 +1633,7 @@ int fuse_fs_getattr(struct fuse_fs *fs, const char *path, struct stat *buf,
if (fs->op.getattr) {
if (fs->debug) {
char buf[10];
- fprintf(stderr, "getattr[%s] %s\n",
+ fuse_log(FUSE_LOG_DEBUG, "getattr[%s] %s\n",
file_info_string(fi, buf, sizeof(buf)),
path);
}
@@ -1648,7 +1649,7 @@ int fuse_fs_rename(struct fuse_fs *fs, const char *oldpath,
fuse_get_context()->private_data = fs->user_data;
if (fs->op.rename) {
if (fs->debug)
- fprintf(stderr, "rename %s %s 0x%x\n", oldpath, newpath,
+ fuse_log(FUSE_LOG_DEBUG, "rename %s %s 0x%x\n", oldpath, newpath,
flags);
return fs->op.rename(oldpath, newpath, flags);
@@ -1662,7 +1663,7 @@ int fuse_fs_unlink(struct fuse_fs *fs, const char *path)
fuse_get_context()->private_data = fs->user_data;
if (fs->op.unlink) {
if (fs->debug)
- fprintf(stderr, "unlink %s\n", path);
+ fuse_log(FUSE_LOG_DEBUG, "unlink %s\n", path);
return fs->op.unlink(path);
} else {
@@ -1675,7 +1676,7 @@ int fuse_fs_rmdir(struct fuse_fs *fs, const char *path)
fuse_get_context()->private_data = fs->user_data;
if (fs->op.rmdir) {
if (fs->debug)
- fprintf(stderr, "rmdir %s\n", path);
+ fuse_log(FUSE_LOG_DEBUG, "rmdir %s\n", path);
return fs->op.rmdir(path);
} else {
@@ -1688,7 +1689,7 @@ int fuse_fs_symlink(struct fuse_fs *fs, const char *linkname, const char *path)
fuse_get_context()->private_data = fs->user_data;
if (fs->op.symlink) {
if (fs->debug)
- fprintf(stderr, "symlink %s %s\n", linkname, path);
+ fuse_log(FUSE_LOG_DEBUG, "symlink %s %s\n", linkname, path);
return fs->op.symlink(linkname, path);
} else {
@@ -1701,7 +1702,7 @@ int fuse_fs_link(struct fuse_fs *fs, const char *oldpath, const char *newpath)
fuse_get_context()->private_data = fs->user_data;
if (fs->op.link) {
if (fs->debug)
- fprintf(stderr, "link %s %s\n", oldpath, newpath);
+ fuse_log(FUSE_LOG_DEBUG, "link %s %s\n", oldpath, newpath);
return fs->op.link(oldpath, newpath);
} else {
@@ -1715,7 +1716,7 @@ int fuse_fs_release(struct fuse_fs *fs, const char *path,
fuse_get_context()->private_data = fs->user_data;
if (fs->op.release) {
if (fs->debug)
- fprintf(stderr, "release%s[%llu] flags: 0x%x\n",
+ fuse_log(FUSE_LOG_DEBUG, "release%s[%llu] flags: 0x%x\n",
fi->flush ? "+flush" : "",
(unsigned long long) fi->fh, fi->flags);
@@ -1733,13 +1734,13 @@ int fuse_fs_opendir(struct fuse_fs *fs, const char *path,
int err;
if (fs->debug)
- fprintf(stderr, "opendir flags: 0x%x %s\n", fi->flags,
+ fuse_log(FUSE_LOG_DEBUG, "opendir flags: 0x%x %s\n", fi->flags,
path);
err = fs->op.opendir(path, fi);
if (fs->debug && !err)
- fprintf(stderr, " opendir[%llu] flags: 0x%x %s\n",
+ fuse_log(FUSE_LOG_DEBUG, " opendir[%llu] flags: 0x%x %s\n",
(unsigned long long) fi->fh, fi->flags, path);
return err;
@@ -1756,13 +1757,13 @@ int fuse_fs_open(struct fuse_fs *fs, const char *path,
int err;
if (fs->debug)
- fprintf(stderr, "open flags: 0x%x %s\n", fi->flags,
+ fuse_log(FUSE_LOG_DEBUG, "open flags: 0x%x %s\n", fi->flags,
path);
err = fs->op.open(path, fi);
if (fs->debug && !err)
- fprintf(stderr, " open[%llu] flags: 0x%x %s\n",
+ fuse_log(FUSE_LOG_DEBUG, " open[%llu] flags: 0x%x %s\n",
(unsigned long long) fi->fh, fi->flags, path);
return err;
@@ -1792,7 +1793,7 @@ int fuse_fs_read_buf(struct fuse_fs *fs, const char *path,
int res;
if (fs->debug)
- fprintf(stderr,
+ fuse_log(FUSE_LOG_DEBUG,
"read[%llu] %zu bytes from %llu flags: 0x%x\n",
(unsigned long long) fi->fh,
size, (unsigned long long) off, fi->flags);
@@ -1822,12 +1823,12 @@ int fuse_fs_read_buf(struct fuse_fs *fs, const char *path,
}
if (fs->debug && res >= 0)
- fprintf(stderr, " read[%llu] %zu bytes from %llu\n",
+ fuse_log(FUSE_LOG_DEBUG, " read[%llu] %zu bytes from %llu\n",
(unsigned long long) fi->fh,
fuse_buf_size(*bufp),
(unsigned long long) off);
if (res >= 0 && fuse_buf_size(*bufp) > size)
- fprintf(stderr, "fuse: read too many bytes\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: read too many bytes\n");
if (res < 0)
return res;
@@ -1846,7 +1847,7 @@ int fuse_fs_read(struct fuse_fs *fs, const char *path, char *mem, size_t size,
int res;
if (fs->debug)
- fprintf(stderr,
+ fuse_log(FUSE_LOG_DEBUG,
"read[%llu] %zu bytes from %llu flags: 0x%x\n",
(unsigned long long) fi->fh,
size, (unsigned long long) off, fi->flags);
@@ -1867,12 +1868,12 @@ int fuse_fs_read(struct fuse_fs *fs, const char *path, char *mem, size_t size,
}
if (fs->debug && res >= 0)
- fprintf(stderr, " read[%llu] %u bytes from %llu\n",
+ fuse_log(FUSE_LOG_DEBUG, " read[%llu] %u bytes from %llu\n",
(unsigned long long) fi->fh,
res,
(unsigned long long) off);
if (res >= 0 && res > (int) size)
- fprintf(stderr, "fuse: read too many bytes\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: read too many bytes\n");
return res;
} else {
@@ -1891,7 +1892,7 @@ int fuse_fs_write_buf(struct fuse_fs *fs, const char *path,
assert(buf->idx == 0 && buf->off == 0);
if (fs->debug)
- fprintf(stderr,
+ fuse_log(FUSE_LOG_DEBUG,
"write%s[%llu] %zu bytes to %llu flags: 0x%x\n",
fi->writepage ? "page" : "",
(unsigned long long) fi->fh,
@@ -1931,12 +1932,12 @@ out_free:
}
out:
if (fs->debug && res >= 0)
- fprintf(stderr, " write%s[%llu] %u bytes to %llu\n",
+ fuse_log(FUSE_LOG_DEBUG, " write%s[%llu] %u bytes to %llu\n",
fi->writepage ? "page" : "",
(unsigned long long) fi->fh, res,
(unsigned long long) off);
if (res > (int) size)
- fprintf(stderr, "fuse: wrote too many bytes\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: wrote too many bytes\n");
return res;
} else {
@@ -1960,7 +1961,7 @@ int fuse_fs_fsync(struct fuse_fs *fs, const char *path, int datasync,
fuse_get_context()->private_data = fs->user_data;
if (fs->op.fsync) {
if (fs->debug)
- fprintf(stderr, "fsync[%llu] datasync: %i\n",
+ fuse_log(FUSE_LOG_DEBUG, "fsync[%llu] datasync: %i\n",
(unsigned long long) fi->fh, datasync);
return fs->op.fsync(path, datasync, fi);
@@ -1975,7 +1976,7 @@ int fuse_fs_fsyncdir(struct fuse_fs *fs, const char *path, int datasync,
fuse_get_context()->private_data = fs->user_data;
if (fs->op.fsyncdir) {
if (fs->debug)
- fprintf(stderr, "fsyncdir[%llu] datasync: %i\n",
+ fuse_log(FUSE_LOG_DEBUG, "fsyncdir[%llu] datasync: %i\n",
(unsigned long long) fi->fh, datasync);
return fs->op.fsyncdir(path, datasync, fi);
@@ -1990,7 +1991,7 @@ int fuse_fs_flush(struct fuse_fs *fs, const char *path,
fuse_get_context()->private_data = fs->user_data;
if (fs->op.flush) {
if (fs->debug)
- fprintf(stderr, "flush[%llu]\n",
+ fuse_log(FUSE_LOG_DEBUG, "flush[%llu]\n",
(unsigned long long) fi->fh);
return fs->op.flush(path, fi);
@@ -2004,7 +2005,7 @@ int fuse_fs_statfs(struct fuse_fs *fs, const char *path, struct statvfs *buf)
fuse_get_context()->private_data = fs->user_data;
if (fs->op.statfs) {
if (fs->debug)
- fprintf(stderr, "statfs %s\n", path);
+ fuse_log(FUSE_LOG_DEBUG, "statfs %s\n", path);
return fs->op.statfs(path, buf);
} else {
@@ -2020,7 +2021,7 @@ int fuse_fs_releasedir(struct fuse_fs *fs, const char *path,
fuse_get_context()->private_data = fs->user_data;
if (fs->op.releasedir) {
if (fs->debug)
- fprintf(stderr, "releasedir[%llu] flags: 0x%x\n",
+ fuse_log(FUSE_LOG_DEBUG, "releasedir[%llu] flags: 0x%x\n",
(unsigned long long) fi->fh, fi->flags);
return fs->op.releasedir(path, fi);
@@ -2037,7 +2038,7 @@ int fuse_fs_readdir(struct fuse_fs *fs, const char *path, void *buf,
fuse_get_context()->private_data = fs->user_data;
if (fs->op.readdir) {
if (fs->debug) {
- fprintf(stderr, "readdir%s[%llu] from %llu\n",
+ fuse_log(FUSE_LOG_DEBUG, "readdir%s[%llu] from %llu\n",
(flags & FUSE_READDIR_PLUS) ? "plus" : "",
(unsigned long long) fi->fh,
(unsigned long long) off);
@@ -2057,7 +2058,7 @@ int fuse_fs_create(struct fuse_fs *fs, const char *path, mode_t mode,
int err;
if (fs->debug)
- fprintf(stderr,
+ fuse_log(FUSE_LOG_DEBUG,
"create flags: 0x%x %s 0%o umask=0%03o\n",
fi->flags, path, mode,
fuse_get_context()->umask);
@@ -2065,7 +2066,7 @@ int fuse_fs_create(struct fuse_fs *fs, const char *path, mode_t mode,
err = fs->op.create(path, mode, fi);
if (fs->debug && !err)
- fprintf(stderr, " create[%llu] flags: 0x%x %s\n",
+ fuse_log(FUSE_LOG_DEBUG, " create[%llu] flags: 0x%x %s\n",
(unsigned long long) fi->fh, fi->flags, path);
return err;
@@ -2080,7 +2081,7 @@ int fuse_fs_lock(struct fuse_fs *fs, const char *path,
fuse_get_context()->private_data = fs->user_data;
if (fs->op.lock) {
if (fs->debug)
- fprintf(stderr, "lock[%llu] %s %s start: %llu len: %llu pid: %llu\n",
+ fuse_log(FUSE_LOG_DEBUG, "lock[%llu] %s %s start: %llu len: %llu pid: %llu\n",
(unsigned long long) fi->fh,
(cmd == F_GETLK ? "F_GETLK" :
(cmd == F_SETLK ? "F_SETLK" :
@@ -2107,7 +2108,7 @@ int fuse_fs_flock(struct fuse_fs *fs, const char *path,
if (fs->debug) {
int xop = op & ~LOCK_NB;
- fprintf(stderr, "lock[%llu] %s%s\n",
+ fuse_log(FUSE_LOG_DEBUG, "lock[%llu] %s%s\n",
(unsigned long long) fi->fh,
xop == LOCK_SH ? "LOCK_SH" :
(xop == LOCK_EX ? "LOCK_EX" :
@@ -2127,7 +2128,7 @@ int fuse_fs_chown(struct fuse_fs *fs, const char *path, uid_t uid,
if (fs->op.chown) {
if (fs->debug) {
char buf[10];
- fprintf(stderr, "chown[%s] %s %lu %lu\n",
+ fuse_log(FUSE_LOG_DEBUG, "chown[%s] %s %lu %lu\n",
file_info_string(fi, buf, sizeof(buf)),
path, (unsigned long) uid, (unsigned long) gid);
}
@@ -2144,7 +2145,7 @@ int fuse_fs_truncate(struct fuse_fs *fs, const char *path, off_t size,
if (fs->op.truncate) {
if (fs->debug) {
char buf[10];
- fprintf(stderr, "truncate[%s] %llu\n",
+ fuse_log(FUSE_LOG_DEBUG, "truncate[%s] %llu\n",
file_info_string(fi, buf, sizeof(buf)),
(unsigned long long) size);
}
@@ -2161,7 +2162,7 @@ int fuse_fs_utimens(struct fuse_fs *fs, const char *path,
if (fs->op.utimens) {
if (fs->debug) {
char buf[10];
- fprintf(stderr, "utimens[%s] %s %li.%09lu %li.%09lu\n",
+ fuse_log(FUSE_LOG_DEBUG, "utimens[%s] %s %li.%09lu %li.%09lu\n",
file_info_string(fi, buf, sizeof(buf)),
path, tv[0].tv_sec, tv[0].tv_nsec,
tv[1].tv_sec, tv[1].tv_nsec);
@@ -2177,7 +2178,7 @@ int fuse_fs_access(struct fuse_fs *fs, const char *path, int mask)
fuse_get_context()->private_data = fs->user_data;
if (fs->op.access) {
if (fs->debug)
- fprintf(stderr, "access %s 0%o\n", path, mask);
+ fuse_log(FUSE_LOG_DEBUG, "access %s 0%o\n", path, mask);
return fs->op.access(path, mask);
} else {
@@ -2191,7 +2192,7 @@ int fuse_fs_readlink(struct fuse_fs *fs, const char *path, char *buf,
fuse_get_context()->private_data = fs->user_data;
if (fs->op.readlink) {
if (fs->debug)
- fprintf(stderr, "readlink %s %lu\n", path,
+ fuse_log(FUSE_LOG_DEBUG, "readlink %s %lu\n", path,
(unsigned long) len);
return fs->op.readlink(path, buf, len);
@@ -2206,7 +2207,7 @@ int fuse_fs_mknod(struct fuse_fs *fs, const char *path, mode_t mode,
fuse_get_context()->private_data = fs->user_data;
if (fs->op.mknod) {
if (fs->debug)
- fprintf(stderr, "mknod %s 0%o 0x%llx umask=0%03o\n",
+ fuse_log(FUSE_LOG_DEBUG, "mknod %s 0%o 0x%llx umask=0%03o\n",
path, mode, (unsigned long long) rdev,
fuse_get_context()->umask);
@@ -2221,7 +2222,7 @@ int fuse_fs_mkdir(struct fuse_fs *fs, const char *path, mode_t mode)
fuse_get_context()->private_data = fs->user_data;
if (fs->op.mkdir) {
if (fs->debug)
- fprintf(stderr, "mkdir %s 0%o umask=0%03o\n",
+ fuse_log(FUSE_LOG_DEBUG, "mkdir %s 0%o umask=0%03o\n",
path, mode, fuse_get_context()->umask);
return fs->op.mkdir(path, mode);
@@ -2236,7 +2237,7 @@ int fuse_fs_setxattr(struct fuse_fs *fs, const char *path, const char *name,
fuse_get_context()->private_data = fs->user_data;
if (fs->op.setxattr) {
if (fs->debug)
- fprintf(stderr, "setxattr %s %s %lu 0x%x\n",
+ fuse_log(FUSE_LOG_DEBUG, "setxattr %s %s %lu 0x%x\n",
path, name, (unsigned long) size, flags);
return fs->op.setxattr(path, name, value, size, flags);
@@ -2251,7 +2252,7 @@ int fuse_fs_getxattr(struct fuse_fs *fs, const char *path, const char *name,
fuse_get_context()->private_data = fs->user_data;
if (fs->op.getxattr) {
if (fs->debug)
- fprintf(stderr, "getxattr %s %s %lu\n",
+ fuse_log(FUSE_LOG_DEBUG, "getxattr %s %s %lu\n",
path, name, (unsigned long) size);
return fs->op.getxattr(path, name, value, size);
@@ -2266,7 +2267,7 @@ int fuse_fs_listxattr(struct fuse_fs *fs, const char *path, char *list,
fuse_get_context()->private_data = fs->user_data;
if (fs->op.listxattr) {
if (fs->debug)
- fprintf(stderr, "listxattr %s %lu\n",
+ fuse_log(FUSE_LOG_DEBUG, "listxattr %s %lu\n",
path, (unsigned long) size);
return fs->op.listxattr(path, list, size);
@@ -2281,7 +2282,7 @@ int fuse_fs_bmap(struct fuse_fs *fs, const char *path, size_t blocksize,
fuse_get_context()->private_data = fs->user_data;
if (fs->op.bmap) {
if (fs->debug)
- fprintf(stderr, "bmap %s blocksize: %lu index: %llu\n",
+ fuse_log(FUSE_LOG_DEBUG, "bmap %s blocksize: %lu index: %llu\n",
path, (unsigned long) blocksize,
(unsigned long long) *idx);
@@ -2296,7 +2297,7 @@ int fuse_fs_removexattr(struct fuse_fs *fs, const char *path, const char *name)
fuse_get_context()->private_data = fs->user_data;
if (fs->op.removexattr) {
if (fs->debug)
- fprintf(stderr, "removexattr %s %s\n", path, name);
+ fuse_log(FUSE_LOG_DEBUG, "removexattr %s %s\n", path, name);
return fs->op.removexattr(path, name);
} else {
@@ -2311,7 +2312,7 @@ int fuse_fs_ioctl(struct fuse_fs *fs, const char *path, unsigned int cmd,
fuse_get_context()->private_data = fs->user_data;
if (fs->op.ioctl) {
if (fs->debug)
- fprintf(stderr, "ioctl[%llu] 0x%x flags: 0x%x\n",
+ fuse_log(FUSE_LOG_DEBUG, "ioctl[%llu] 0x%x flags: 0x%x\n",
(unsigned long long) fi->fh, cmd, flags);
return fs->op.ioctl(path, cmd, arg, fi, flags, data);
@@ -2328,14 +2329,14 @@ int fuse_fs_poll(struct fuse_fs *fs, const char *path,
int res;
if (fs->debug)
- fprintf(stderr, "poll[%llu] ph: %p, events 0x%x\n",
+ fuse_log(FUSE_LOG_DEBUG, "poll[%llu] ph: %p, events 0x%x\n",
(unsigned long long) fi->fh, ph,
fi->poll_events);
res = fs->op.poll(path, fi, ph, reventsp);
if (fs->debug && !res)
- fprintf(stderr, " poll[%llu] revents: 0x%x\n",
+ fuse_log(FUSE_LOG_DEBUG, " poll[%llu] revents: 0x%x\n",
(unsigned long long) fi->fh, *reventsp);
return res;
@@ -2349,7 +2350,7 @@ int fuse_fs_fallocate(struct fuse_fs *fs, const char *path, int mode,
fuse_get_context()->private_data = fs->user_data;
if (fs->op.fallocate) {
if (fs->debug)
- fprintf(stderr, "fallocate %s mode %x, offset: %llu, length: %llu\n",
+ fuse_log(FUSE_LOG_DEBUG, "fallocate %s mode %x, offset: %llu, length: %llu\n",
path,
mode,
(unsigned long long) offset,
@@ -2369,7 +2370,7 @@ ssize_t fuse_fs_copy_file_range(struct fuse_fs *fs, const char *path_in,
fuse_get_context()->private_data = fs->user_data;
if (fs->op.copy_file_range) {
if (fs->debug)
- fprintf(stderr, "copy_file_range from %s:%llu to "
+ fuse_log(FUSE_LOG_DEBUG, "copy_file_range from %s:%llu to "
"%s:%llu, length: %llu\n",
path_in,
(unsigned long long) off_in,
@@ -2520,7 +2521,7 @@ static int lookup_path(struct fuse *f, fuse_ino_t nodeid,
if (res == 0) {
res = do_lookup(f, nodeid, name, e);
if (res == 0 && f->conf.debug) {
- fprintf(stderr, " NODEID: %llu\n",
+ fuse_log(FUSE_LOG_DEBUG, " NODEID: %llu\n",
(unsigned long long) e->ino);
}
}
@@ -2543,7 +2544,7 @@ static struct fuse_context_i *fuse_create_context(struct fuse *f)
abort. If memory is so low that the
context cannot be allocated, there's not
much hope for the filesystem anyway */
- fprintf(stderr, "fuse: failed to allocate thread specific data\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: failed to allocate thread specific data\n");
abort();
}
pthread_setspecific(fuse_context_key, c);
@@ -2567,7 +2568,7 @@ static int fuse_create_context_key(void)
if (!fuse_context_ref) {
err = pthread_key_create(&fuse_context_key, fuse_freecontext);
if (err) {
- fprintf(stderr, "fuse: failed to create thread specific key: %s\n",
+ fuse_log(FUSE_LOG_ERR, "fuse: failed to create thread specific key: %s\n",
strerror(err));
pthread_mutex_unlock(&fuse_context_lock);
return -1;
@@ -2680,7 +2681,7 @@ static void fuse_lib_lookup(fuse_req_t req, fuse_ino_t parent,
pthread_mutex_lock(&f->lock);
if (len == 1) {
if (f->conf.debug)
- fprintf(stderr, "LOOKUP-DOT\n");
+ fuse_log(FUSE_LOG_DEBUG, "LOOKUP-DOT\n");
dot = get_node_nocheck(f, parent);
if (dot == NULL) {
pthread_mutex_unlock(&f->lock);
@@ -2690,7 +2691,7 @@ static void fuse_lib_lookup(fuse_req_t req, fuse_ino_t parent,
dot->refctr++;
} else {
if (f->conf.debug)
- fprintf(stderr, "LOOKUP-DOTDOT\n");
+ fuse_log(FUSE_LOG_DEBUG, "LOOKUP-DOTDOT\n");
parent = get_node(f, parent)->parent->nodeid;
}
pthread_mutex_unlock(&f->lock);
@@ -2702,7 +2703,7 @@ static void fuse_lib_lookup(fuse_req_t req, fuse_ino_t parent,
if (!err) {
struct fuse_intr_data d;
if (f->conf.debug)
- fprintf(stderr, "LOOKUP %s\n", path);
+ fuse_log(FUSE_LOG_DEBUG, "LOOKUP %s\n", path);
fuse_prepare_interrupt(f, req, &d);
err = lookup_path(f, parent, name, path, &e, NULL);
if (err == -ENOENT && f->conf.negative_timeout != 0.0) {
@@ -2724,7 +2725,7 @@ static void fuse_lib_lookup(fuse_req_t req, fuse_ino_t parent,
static void do_forget(struct fuse *f, fuse_ino_t ino, uint64_t nlookup)
{
if (f->conf.debug)
- fprintf(stderr, "FORGET %llu/%llu\n", (unsigned long long)ino,
+ fuse_log(FUSE_LOG_DEBUG, "FORGET %llu/%llu\n", (unsigned long long)ino,
(unsigned long long) nlookup);
forget_node(f, ino, nlookup);
}
@@ -2792,7 +2793,7 @@ int fuse_fs_chmod(struct fuse_fs *fs, const char *path, mode_t mode,
if (fs->op.chmod) {
if (fs->debug) {
char buf[10];
- fprintf(stderr, "chmod[%s] %s %llo\n",
+ fuse_log(FUSE_LOG_DEBUG, "chmod[%s] %s %llo\n",
file_info_string(fi, buf, sizeof(buf)),
path, (unsigned long long) mode);
}
@@ -4765,13 +4766,13 @@ struct fuse_fs *fuse_fs_new(const struct fuse_operations *op, size_t op_size,
struct fuse_fs *fs;
if (sizeof(struct fuse_operations) < op_size) {
- fprintf(stderr, "fuse: warning: library too old, some operations may not not work\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: warning: library too old, some operations may not not work\n");
op_size = sizeof(struct fuse_operations);
}
fs = (struct fuse_fs *) calloc(1, sizeof(struct fuse_fs));
if (!fs) {
- fprintf(stderr, "fuse: failed to allocate fuse_fs object\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: failed to allocate fuse_fs object\n");
return NULL;
}
@@ -4786,7 +4787,7 @@ static int node_table_init(struct node_table *t)
t->size = NODE_TABLE_MIN_SIZE;
t->array = (struct node **) calloc(1, sizeof(struct node *) * t->size);
if (t->array == NULL) {
- fprintf(stderr, "fuse: memory allocation failed\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: memory allocation failed\n");
return -1;
}
t->use = 0;
@@ -4838,7 +4839,7 @@ struct fuse *fuse_new_31(struct fuse_args *args,
f = (struct fuse *) calloc(1, sizeof(struct fuse));
if (f == NULL) {
- fprintf(stderr, "fuse: failed to allocate fuse object\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: failed to allocate fuse object\n");
goto out;
}
@@ -4916,7 +4917,7 @@ struct fuse *fuse_new_31(struct fuse_args *args,
goto out_free_fs;
if (f->conf.debug) {
- fprintf(stderr, "nullpath_ok: %i\n", f->conf.nullpath_ok);
+ fuse_log(FUSE_LOG_DEBUG, "nullpath_ok: %i\n", f->conf.nullpath_ok);
}
/* Trace topmost layer by default */
@@ -4933,7 +4934,7 @@ struct fuse *fuse_new_31(struct fuse_args *args,
root = alloc_node(f);
if (root == NULL) {
- fprintf(stderr, "fuse: memory allocation failed\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: memory allocation failed\n");
goto out_free_id_table;
}
if (lru_enabled(f)) {
diff --git a/lib/fuse_i.h b/lib/fuse_i.h
index d38b630..4883ef6 100644
--- a/lib/fuse_i.h
+++ b/lib/fuse_i.h
@@ -131,6 +131,8 @@ struct fuse *fuse_new_31(struct fuse_args *args, const struct fuse_operations *o
int fuse_loop_mt_32(struct fuse *f, struct fuse_loop_config *config);
int fuse_session_loop_mt_32(struct fuse_session *se, struct fuse_loop_config *config);
+void fuse_log(enum fuse_log_level level, const char *fmt, ...);
+
#define FUSE_MAX_MAX_PAGES 256
#define FUSE_DEFAULT_MAX_PAGES_PER_REQ 32
diff --git a/lib/fuse_log.c b/lib/fuse_log.c
new file mode 100644
index 0000000..09178e4
--- /dev/null
+++ b/lib/fuse_log.c
@@ -0,0 +1,41 @@
+/*
+ FUSE: Filesystem in Userspace
+ Copyright (C) 2019 Red Hat, Inc.
+
+ Logging API.
+
+ This program can be distributed under the terms of the GNU LGPLv2.
+ See the file COPYING.LIB
+*/
+
+#include "fuse_log.h"
+#include "fuse_i.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+
+static void default_log_func(
+ __attribute__(( unused )) enum fuse_log_level level,
+ const char *fmt, va_list ap)
+{
+ vfprintf(stderr, fmt, ap);
+}
+
+static fuse_log_func_t log_func = default_log_func;
+
+void fuse_set_log_func(fuse_log_func_t func)
+{
+ if (!func)
+ func = default_log_func;
+
+ log_func = func;
+}
+
+void fuse_log(enum fuse_log_level level, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ log_func(level, fmt, ap);
+ va_end(ap);
+}
diff --git a/lib/fuse_loop_mt.c b/lib/fuse_loop_mt.c
index 83f1641..445e9a0 100644
--- a/lib/fuse_loop_mt.c
+++ b/lib/fuse_loop_mt.c
@@ -58,7 +58,7 @@ static struct fuse_chan *fuse_chan_new(int fd)
{
struct fuse_chan *ch = (struct fuse_chan *) malloc(sizeof(*ch));
if (ch == NULL) {
- fprintf(stderr, "fuse: failed to allocate channel\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: failed to allocate channel\n");
return NULL;
}
@@ -201,7 +201,7 @@ int fuse_start_thread(pthread_t *thread_id, void *(*func)(void *), void *arg)
pthread_attr_init(&attr);
stack_size = getenv(ENVNAME_THREAD_STACK);
if (stack_size && pthread_attr_setstacksize(&attr, atoi(stack_size)))
- fprintf(stderr, "fuse: invalid stack size: %s\n", stack_size);
+ fuse_log(FUSE_LOG_ERR, "fuse: invalid stack size: %s\n", stack_size);
/* Disallow signal reception in worker threads */
sigemptyset(&newset);
@@ -214,7 +214,7 @@ int fuse_start_thread(pthread_t *thread_id, void *(*func)(void *), void *arg)
pthread_sigmask(SIG_SETMASK, &oldset, NULL);
pthread_attr_destroy(&attr);
if (res != 0) {
- fprintf(stderr, "fuse: error creating thread: %s\n",
+ fuse_log(FUSE_LOG_ERR, "fuse: error creating thread: %s\n",
strerror(res));
return -1;
}
@@ -235,7 +235,7 @@ static struct fuse_chan *fuse_clone_chan(struct fuse_mt *mt)
#endif
clonefd = open(devname, O_RDWR | O_CLOEXEC);
if (clonefd == -1) {
- fprintf(stderr, "fuse: failed to open %s: %s\n", devname,
+ fuse_log(FUSE_LOG_ERR, "fuse: failed to open %s: %s\n", devname,
strerror(errno));
return NULL;
}
@@ -244,7 +244,7 @@ static struct fuse_chan *fuse_clone_chan(struct fuse_mt *mt)
masterfd = mt->se->fd;
res = ioctl(clonefd, FUSE_DEV_IOC_CLONE, &masterfd);
if (res == -1) {
- fprintf(stderr, "fuse: failed to clone device fd: %s\n",
+ fuse_log(FUSE_LOG_ERR, "fuse: failed to clone device fd: %s\n",
strerror(errno));
close(clonefd);
return NULL;
@@ -262,7 +262,7 @@ static int fuse_loop_start_thread(struct fuse_mt *mt)
struct fuse_worker *w = malloc(sizeof(struct fuse_worker));
if (!w) {
- fprintf(stderr, "fuse: failed to allocate worker structure\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: failed to allocate worker structure\n");
return -1;
}
memset(w, 0, sizeof(struct fuse_worker));
@@ -274,7 +274,7 @@ static int fuse_loop_start_thread(struct fuse_mt *mt)
w->ch = fuse_clone_chan(mt);
if(!w->ch) {
/* Don't attempt this again */
- fprintf(stderr, "fuse: trying to continue "
+ fuse_log(FUSE_LOG_ERR, "fuse: trying to continue "
"without -o clone_fd.\n");
mt->clone_fd = 0;
}
diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
index 918893e..f7fbc8f 100644
--- a/lib/fuse_lowlevel.c
+++ b/lib/fuse_lowlevel.c
@@ -150,7 +150,7 @@ static struct fuse_req *fuse_ll_alloc_req(struct fuse_session *se)
req = (struct fuse_req *) calloc(1, sizeof(struct fuse_req));
if (req == NULL) {
- fprintf(stderr, "fuse: failed to allocate request\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: failed to allocate request\n");
} else {
req->se = se;
req->ctr = 1;
@@ -170,15 +170,15 @@ static int fuse_send_msg(struct fuse_session *se, struct fuse_chan *ch,
out->len = iov_length(iov, count);
if (se->debug) {
if (out->unique == 0) {
- fprintf(stderr, "NOTIFY: code=%d length=%u\n",
+ fuse_log(FUSE_LOG_DEBUG, "NOTIFY: code=%d length=%u\n",
out->error, out->len);
} else if (out->error) {
- fprintf(stderr,
+ fuse_log(FUSE_LOG_DEBUG,
" unique: %llu, error: %i (%s), outsize: %i\n",
(unsigned long long) out->unique, out->error,
strerror(-out->error), out->len);
} else {
- fprintf(stderr,
+ fuse_log(FUSE_LOG_DEBUG,
" unique: %llu, success, outsize: %i\n",
(unsigned long long) out->unique, out->len);
}
@@ -207,7 +207,7 @@ int fuse_send_reply_iov_nofree(fuse_req_t req, int error, struct iovec *iov,
struct fuse_out_header out;
if (error <= -1000 || error > 0) {
- fprintf(stderr, "fuse: bad error value: %i\n", error);
+ fuse_log(FUSE_LOG_ERR, "fuse: bad error value: %i\n", error);
error = -ERANGE;
}
@@ -601,11 +601,11 @@ static int read_back(int fd, char *buf, size_t len)
res = read(fd, buf, len);
if (res == -1) {
- fprintf(stderr, "fuse: internal error: failed to read back from pipe: %s\n", strerror(errno));
+ fuse_log(FUSE_LOG_ERR, "fuse: internal error: failed to read back from pipe: %s\n", strerror(errno));
return -EIO;
}
if (res != len) {
- fprintf(stderr, "fuse: internal error: short read back from pipe: %i from %zi\n", res, len);
+ fuse_log(FUSE_LOG_ERR, "fuse: internal error: short read back from pipe: %i from %zi\n", res, len);
return -EIO;
}
return 0;
@@ -714,7 +714,7 @@ static int fuse_send_data_iov(struct fuse_session *se, struct fuse_chan *ch,
if (res != headerlen) {
res = -EIO;
- fprintf(stderr, "fuse: short vmsplice to pipe: %u/%zu\n", res,
+ fuse_log(FUSE_LOG_ERR, "fuse: short vmsplice to pipe: %u/%zu\n", res,
headerlen);
goto clear_pipe;
}
@@ -807,7 +807,7 @@ static int fuse_send_data_iov(struct fuse_session *se, struct fuse_chan *ch,
out->len = headerlen + len;
if (se->debug) {
- fprintf(stderr,
+ fuse_log(FUSE_LOG_DEBUG,
" unique: %llu, success, outsize: %i (splice)\n",
(unsigned long long) out->unique, out->len);
}
@@ -826,7 +826,7 @@ static int fuse_send_data_iov(struct fuse_session *se, struct fuse_chan *ch,
}
if (res != out->len) {
res = -EIO;
- fprintf(stderr, "fuse: short splice from pipe: %u/%u\n",
+ fuse_log(FUSE_LOG_ERR, "fuse: short splice from pipe: %u/%u\n",
res, out->len);
goto clear_pipe;
}
@@ -1396,7 +1396,7 @@ static void do_write_buf(fuse_req_t req, fuse_ino_t nodeid, const void *inarg,
sizeof(struct fuse_write_in);
}
if (bufv.buf[0].size < arg->size) {
- fprintf(stderr, "fuse: do_write_buf: buffer size too small\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: do_write_buf: buffer size too small\n");
fuse_reply_err(req, EIO);
goto out;
}
@@ -1724,7 +1724,7 @@ static void do_interrupt(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
(void) nodeid;
if (se->debug)
- fprintf(stderr, "INTERRUPT: %llu\n",
+ fuse_log(FUSE_LOG_DEBUG, "INTERRUPT: %llu\n",
(unsigned long long) arg->unique);
req->u.i.unique = arg->unique;
@@ -1877,10 +1877,10 @@ static void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
(void) nodeid;
if (se->debug) {
- fprintf(stderr, "INIT: %u.%u\n", arg->major, arg->minor);
+ fuse_log(FUSE_LOG_DEBUG, "INIT: %u.%u\n", arg->major, arg->minor);
if (arg->major == 7 && arg->minor >= 6) {
- fprintf(stderr, "flags=0x%08x\n", arg->flags);
- fprintf(stderr, "max_readahead=0x%08x\n",
+ fuse_log(FUSE_LOG_DEBUG, "flags=0x%08x\n", arg->flags);
+ fuse_log(FUSE_LOG_DEBUG, "max_readahead=0x%08x\n",
arg->max_readahead);
}
}
@@ -1894,7 +1894,7 @@ static void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
outarg.minor = FUSE_KERNEL_MINOR_VERSION;
if (arg->major < 7) {
- fprintf(stderr, "fuse: unsupported protocol version: %u.%u\n",
+ fuse_log(FUSE_LOG_ERR, "fuse: unsupported protocol version: %u.%u\n",
arg->major, arg->minor);
fuse_reply_err(req, EPROTO);
return;
@@ -1991,7 +1991,7 @@ static void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
se->conn.time_gran = 1;
if (bufsize < FUSE_MIN_READ_BUFFER) {
- fprintf(stderr, "fuse: warning: buffer size too small: %zu\n",
+ fuse_log(FUSE_LOG_ERR, "fuse: warning: buffer size too small: %zu\n",
bufsize);
bufsize = FUSE_MIN_READ_BUFFER;
}
@@ -2005,7 +2005,7 @@ static void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
se->op.init(se->userdata, &se->conn);
if (se->conn.want & (~se->conn.capable)) {
- fprintf(stderr, "fuse: error: filesystem requested capabilities "
+ fuse_log(FUSE_LOG_ERR, "fuse: error: filesystem requested capabilities "
"0x%x that are not supported by kernel, aborting.\n",
se->conn.want & (~se->conn.capable));
fuse_reply_err(req, EPROTO);
@@ -2016,7 +2016,7 @@ static void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
unsigned max_read_mo = get_max_read(se->mo);
if (se->conn.max_read != max_read_mo) {
- fprintf(stderr, "fuse: error: init() and fuse_session_new() "
+ fuse_log(FUSE_LOG_ERR, "fuse: error: init() and fuse_session_new() "
"requested different maximum read size (%u vs %u)\n",
se->conn.max_read, max_read_mo);
fuse_reply_err(req, EPROTO);
@@ -2080,16 +2080,16 @@ static void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
outarg.time_gran = se->conn.time_gran;
if (se->debug) {
- fprintf(stderr, " INIT: %u.%u\n", outarg.major, outarg.minor);
- fprintf(stderr, " flags=0x%08x\n", outarg.flags);
- fprintf(stderr, " max_readahead=0x%08x\n",
+ fuse_log(FUSE_LOG_DEBUG, " INIT: %u.%u\n", outarg.major, outarg.minor);
+ fuse_log(FUSE_LOG_DEBUG, " flags=0x%08x\n", outarg.flags);
+ fuse_log(FUSE_LOG_DEBUG, " max_readahead=0x%08x\n",
outarg.max_readahead);
- fprintf(stderr, " max_write=0x%08x\n", outarg.max_write);
- fprintf(stderr, " max_background=%i\n",
+ fuse_log(FUSE_LOG_DEBUG, " max_write=0x%08x\n", outarg.max_write);
+ fuse_log(FUSE_LOG_DEBUG, " max_background=%i\n",
outarg.max_background);
- fprintf(stderr, " congestion_threshold=%i\n",
+ fuse_log(FUSE_LOG_DEBUG, " congestion_threshold=%i\n",
outarg.congestion_threshold);
- fprintf(stderr, " time_gran=%u\n",
+ fuse_log(FUSE_LOG_DEBUG, " time_gran=%u\n",
outarg.time_gran);
}
if (arg->minor < 5)
@@ -2326,7 +2326,7 @@ static void fuse_ll_retrieve_reply(struct fuse_notify_req *nreq,
sizeof(struct fuse_notify_retrieve_in);
if (bufv.buf[0].size < arg->size) {
- fprintf(stderr, "fuse: retrieve reply: buffer size too small\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: retrieve reply: buffer size too small\n");
fuse_reply_none(req);
goto out;
}
@@ -2489,11 +2489,11 @@ static int fuse_ll_copy_from_pipe(struct fuse_bufvec *dst,
{
ssize_t res = fuse_buf_copy(dst, src, 0);
if (res < 0) {
- fprintf(stderr, "fuse: copy from pipe: %s\n", strerror(-res));
+ fuse_log(FUSE_LOG_ERR, "fuse: copy from pipe: %s\n", strerror(-res));
return res;
}
if ((size_t)res < fuse_buf_size(dst)) {
- fprintf(stderr, "fuse: copy from pipe: short read\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: copy from pipe: short read\n");
return -1;
}
return 0;
@@ -2525,7 +2525,7 @@ void fuse_session_process_buf_int(struct fuse_session *se,
mbuf = malloc(tmpbuf.buf[0].size);
if (mbuf == NULL) {
- fprintf(stderr, "fuse: failed to allocate header\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: failed to allocate header\n");
goto clear_pipe;
}
tmpbuf.buf[0].mem = mbuf;
@@ -2540,7 +2540,7 @@ void fuse_session_process_buf_int(struct fuse_session *se,
}
if (se->debug) {
- fprintf(stderr,
+ fuse_log(FUSE_LOG_DEBUG,
"unique: %llu, opcode: %s (%i), nodeid: %llu, insize: %zu, pid: %u\n",
(unsigned long long) in->unique,
opname((enum fuse_opcode) in->opcode), in->opcode,
@@ -2757,7 +2757,7 @@ int fuse_session_receive_buf_int(struct fuse_session *se, struct fuse_buf *buf,
}
if (res < sizeof(struct fuse_in_header)) {
- fprintf(stderr, "short splice from fuse device\n");
+ fuse_log(FUSE_LOG_ERR, "short splice from fuse device\n");
return -EIO;
}
@@ -2780,7 +2780,7 @@ int fuse_session_receive_buf_int(struct fuse_session *se, struct fuse_buf *buf,
if (!buf->mem) {
buf->mem = malloc(se->bufsize);
if (!buf->mem) {
- fprintf(stderr,
+ fuse_log(FUSE_LOG_ERR,
"fuse: failed to allocate read buffer\n");
return -ENOMEM;
}
@@ -2791,13 +2791,13 @@ int fuse_session_receive_buf_int(struct fuse_session *se, struct fuse_buf *buf,
res = fuse_buf_copy(&dst, &src, 0);
if (res < 0) {
- fprintf(stderr, "fuse: copy from pipe: %s\n",
+ fuse_log(FUSE_LOG_ERR, "fuse: copy from pipe: %s\n",
strerror(-res));
fuse_ll_clear_pipe(se);
return res;
}
if (res < tmpbuf.size) {
- fprintf(stderr, "fuse: copy from pipe: short read\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: copy from pipe: short read\n");
fuse_ll_clear_pipe(se);
return -EIO;
}
@@ -2817,7 +2817,7 @@ fallback:
if (!buf->mem) {
buf->mem = malloc(se->bufsize);
if (!buf->mem) {
- fprintf(stderr,
+ fuse_log(FUSE_LOG_ERR,
"fuse: failed to allocate read buffer\n");
return -ENOMEM;
}
@@ -2849,7 +2849,7 @@ restart:
return -err;
}
if ((size_t) res < sizeof(struct fuse_in_header)) {
- fprintf(stderr, "short read on fuse device\n");
+ fuse_log(FUSE_LOG_ERR, "short read on fuse device\n");
return -EIO;
}
@@ -2867,18 +2867,18 @@ struct fuse_session *fuse_session_new(struct fuse_args *args,
struct mount_opts *mo;
if (sizeof(struct fuse_lowlevel_ops) < op_size) {
- fprintf(stderr, "fuse: warning: library too old, some operations may not work\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: warning: library too old, some operations may not work\n");
op_size = sizeof(struct fuse_lowlevel_ops);
}
if (args->argc == 0) {
- fprintf(stderr, "fuse: empty argv passed to fuse_session_new().\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: empty argv passed to fuse_session_new().\n");
return NULL;
}
se = (struct fuse_session *) calloc(1, sizeof(struct fuse_session));
if (se == NULL) {
- fprintf(stderr, "fuse: failed to allocate fuse object\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: failed to allocate fuse object\n");
goto out1;
}
se->fd = -1;
@@ -2904,19 +2904,19 @@ struct fuse_session *fuse_session_new(struct fuse_args *args,
if(args->argc == 1 &&
args->argv[0][0] == '-') {
- fprintf(stderr, "fuse: warning: argv[0] looks like an option, but "
+ fuse_log(FUSE_LOG_ERR, "fuse: warning: argv[0] looks like an option, but "
"will be ignored\n");
} else if (args->argc != 1) {
int i;
- fprintf(stderr, "fuse: unknown option(s): `");
+ fuse_log(FUSE_LOG_ERR, "fuse: unknown option(s): `");
for(i = 1; i < args->argc-1; i++)
- fprintf(stderr, "%s ", args->argv[i]);
- fprintf(stderr, "%s'\n", args->argv[i]);
+ fuse_log(FUSE_LOG_ERR, "%s ", args->argv[i]);
+ fuse_log(FUSE_LOG_ERR, "%s'\n", args->argv[i]);
goto out4;
}
if (se->debug)
- fprintf(stderr, "FUSE library version: %s\n", PACKAGE_VERSION);
+ fuse_log(FUSE_LOG_DEBUG, "FUSE library version: %s\n", PACKAGE_VERSION);
se->bufsize = FUSE_MAX_MAX_PAGES * getpagesize() +
FUSE_BUFFER_HEADER_SIZE;
@@ -2929,7 +2929,7 @@ struct fuse_session *fuse_session_new(struct fuse_args *args,
err = pthread_key_create(&se->pipe_key, fuse_ll_pipe_destructor);
if (err) {
- fprintf(stderr, "fuse: failed to create thread specific key: %s\n",
+ fuse_log(FUSE_LOG_ERR, "fuse: failed to create thread specific key: %s\n",
strerror(err));
goto out5;
}
@@ -2976,7 +2976,7 @@ int fuse_session_mount(struct fuse_session *se, const char *mountpoint)
fd = fuse_mnt_parse_fuse_fd(mountpoint);
if (fd != -1) {
if (fcntl(fd, F_GETFD) == -1) {
- fprintf(stderr,
+ fuse_log(FUSE_LOG_ERR,
"fuse: Invalid file descriptor /dev/fd/%u\n",
fd);
return -1;
diff --git a/lib/fuse_opt.c b/lib/fuse_opt.c
index f6cae4f..93066b9 100644
--- a/lib/fuse_opt.c
+++ b/lib/fuse_opt.c
@@ -10,6 +10,7 @@
*/
#include "config.h"
+#include "fuse_i.h"
#include "fuse_opt.h"
#include "fuse_misc.h"
@@ -47,7 +48,7 @@ void fuse_opt_free_args(struct fuse_args *args)
static int alloc_failed(void)
{
- fprintf(stderr, "fuse: memory allocation failed\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: memory allocation failed\n");
return -1;
}
@@ -99,7 +100,7 @@ int fuse_opt_insert_arg(struct fuse_args *args, int pos, const char *arg)
static int next_arg(struct fuse_opt_context *ctx, const char *opt)
{
if (ctx->argctr + 1 >= ctx->argc) {
- fprintf(stderr, "fuse: missing argument after `%s'\n", opt);
+ fuse_log(FUSE_LOG_ERR, "fuse: missing argument after `%s'\n", opt);
return -1;
}
ctx->argctr++;
@@ -217,7 +218,7 @@ static int process_opt_param(void *var, const char *format, const char *param,
*s = copy;
} else {
if (sscanf(param, format, var) != 1) {
- fprintf(stderr, "fuse: invalid parameter in option `%s'\n", arg);
+ fuse_log(FUSE_LOG_ERR, "fuse: invalid parameter in option `%s'\n", arg);
return -1;
}
}
@@ -336,7 +337,7 @@ static int process_option_group(struct fuse_opt_context *ctx, const char *opts)
char *copy = strdup(opts);
if (!copy) {
- fprintf(stderr, "fuse: memory allocation failed\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: memory allocation failed\n");
return -1;
}
res = process_real_option_group(ctx, copy);
diff --git a/lib/fuse_signals.c b/lib/fuse_signals.c
index e6f7112..4271947 100644
--- a/lib/fuse_signals.c
+++ b/lib/fuse_signals.c
@@ -24,7 +24,7 @@ static void exit_handler(int sig)
if (fuse_instance) {
fuse_session_exit(fuse_instance);
if(sig <= 0) {
- fprintf(stderr, "assertion error: signal value <= 0\n");
+ fuse_log(FUSE_LOG_ERR, "assertion error: signal value <= 0\n");
abort();
}
fuse_instance->error = sig;
@@ -79,7 +79,7 @@ int fuse_set_signal_handlers(struct fuse_session *se)
void fuse_remove_signal_handlers(struct fuse_session *se)
{
if (fuse_instance != se)
- fprintf(stderr,
+ fuse_log(FUSE_LOG_ERR,
"fuse: fuse_remove_signal_handlers: unknown session\n");
else
fuse_instance = NULL;
diff --git a/lib/helper.c b/lib/helper.c
index 5b80c6e..64ff7ad 100644
--- a/lib/helper.c
+++ b/lib/helper.c
@@ -154,14 +154,14 @@ static int fuse_helper_opt_proc(void *data, const char *arg, int key,
char mountpoint[PATH_MAX] = "";
if (realpath(arg, mountpoint) == NULL) {
- fprintf(stderr,
+ fuse_log(FUSE_LOG_ERR,
"fuse: bad mount point `%s': %s\n",
arg, strerror(errno));
return -1;
}
return fuse_opt_add_opt(&opts->mountpoint, mountpoint);
} else {
- fprintf(stderr, "fuse: invalid argument `%s'\n", arg);
+ fuse_log(FUSE_LOG_ERR, "fuse: invalid argument `%s'\n", arg);
return -1;
}
@@ -186,7 +186,7 @@ static int add_default_subtype(const char *progname, struct fuse_args *args)
subtype_opt = (char *) malloc(strlen(basename) + 64);
if (subtype_opt == NULL) {
- fprintf(stderr, "fuse: memory allocation failed\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: memory allocation failed\n");
return -1;
}
#ifdef __FreeBSD__
@@ -307,7 +307,7 @@ int fuse_main_real(int argc, char *argv[], const struct fuse_operations *op,
if (!opts.show_help &&
!opts.mountpoint) {
- fprintf(stderr, "error: no mountpoint specified\n");
+ fuse_log(FUSE_LOG_ERR, "error: no mountpoint specified\n");
res = 2;
goto out1;
}
@@ -411,7 +411,7 @@ struct fuse_conn_info_opts* fuse_parse_conn_info_opts(struct fuse_args *args)
opts = calloc(1, sizeof(struct fuse_conn_info_opts));
if(opts == NULL) {
- fprintf(stderr, "calloc failed\n");
+ fuse_log(FUSE_LOG_ERR, "calloc failed\n");
return NULL;
}
if(fuse_opt_parse(args, opts, conn_info_opt_spec, NULL) == -1) {
diff --git a/lib/meson.build b/lib/meson.build
index e27feab..28f0aee 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -1,7 +1,8 @@
libfuse_sources = ['fuse.c', 'fuse_i.h', 'fuse_loop.c', 'fuse_loop_mt.c',
'fuse_lowlevel.c', 'fuse_misc.h', 'fuse_opt.c',
'fuse_signals.c', 'buffer.c', 'cuse_lowlevel.c',
- 'helper.c', 'modules/subdir.c', 'mount_util.c' ]
+ 'helper.c', 'modules/subdir.c', 'mount_util.c',
+ 'fuse_log.c' ]
if host_machine.system().startswith('linux')
libfuse_sources += [ 'mount.c' ]
diff --git a/lib/modules/iconv.c b/lib/modules/iconv.c
index 84f4236..431d02c 100644
--- a/lib/modules/iconv.c
+++ b/lib/modules/iconv.c
@@ -659,7 +659,7 @@ static struct fuse_fs *iconv_new(struct fuse_args *args,
ic = calloc(1, sizeof(struct iconv));
if (ic == NULL) {
- fprintf(stderr, "fuse-iconv: memory allocation failed\n");
+ fuse_log(FUSE_LOG_ERR, "fuse-iconv: memory allocation failed\n");
return NULL;
}
@@ -667,7 +667,7 @@ static struct fuse_fs *iconv_new(struct fuse_args *args,
goto out_free;
if (!next[0] || next[1]) {
- fprintf(stderr, "fuse-iconv: exactly one next filesystem required\n");
+ fuse_log(FUSE_LOG_ERR, "fuse-iconv: exactly one next filesystem required\n");
goto out_free;
}
@@ -678,13 +678,13 @@ static struct fuse_fs *iconv_new(struct fuse_args *args,
old = strdup(setlocale(LC_CTYPE, ""));
ic->tofs = iconv_open(from, to);
if (ic->tofs == (iconv_t) -1) {
- fprintf(stderr, "fuse-iconv: cannot convert from %s to %s\n",
+ fuse_log(FUSE_LOG_ERR, "fuse-iconv: cannot convert from %s to %s\n",
to, from);
goto out_free;
}
ic->fromfs = iconv_open(to, from);
if (ic->tofs == (iconv_t) -1) {
- fprintf(stderr, "fuse-iconv: cannot convert from %s to %s\n",
+ fuse_log(FUSE_LOG_ERR, "fuse-iconv: cannot convert from %s to %s\n",
from, to);
goto out_iconv_close_to;
}
diff --git a/lib/modules/subdir.c b/lib/modules/subdir.c
index f84d8c1..23f58f8 100644
--- a/lib/modules/subdir.c
+++ b/lib/modules/subdir.c
@@ -633,7 +633,7 @@ static struct fuse_fs *subdir_new(struct fuse_args *args,
d = calloc(1, sizeof(struct subdir));
if (d == NULL) {
- fprintf(stderr, "fuse-subdir: memory allocation failed\n");
+ fuse_log(FUSE_LOG_ERR, "fuse-subdir: memory allocation failed\n");
return NULL;
}
@@ -641,19 +641,19 @@ static struct fuse_fs *subdir_new(struct fuse_args *args,
goto out_free;
if (!next[0] || next[1]) {
- fprintf(stderr, "fuse-subdir: exactly one next filesystem required\n");
+ fuse_log(FUSE_LOG_ERR, "fuse-subdir: exactly one next filesystem required\n");
goto out_free;
}
if (!d->base) {
- fprintf(stderr, "fuse-subdir: missing 'subdir' option\n");
+ fuse_log(FUSE_LOG_ERR, "fuse-subdir: missing 'subdir' option\n");
goto out_free;
}
if (d->base[0] && d->base[strlen(d->base)-1] != '/') {
char *tmp = realloc(d->base, strlen(d->base) + 2);
if (!tmp) {
- fprintf(stderr, "fuse-subdir: memory allocation failed\n");
+ fuse_log(FUSE_LOG_ERR, "fuse-subdir: memory allocation failed\n");
goto out_free;
}
d->base = tmp;
diff --git a/lib/mount.c b/lib/mount.c
index 7a18c11..979f8d9 100644
--- a/lib/mount.c
+++ b/lib/mount.c
@@ -175,7 +175,7 @@ static void set_mount_flag(const char *s, int *flags)
return;
}
}
- fprintf(stderr, "fuse: internal error, can't find mount flag\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: internal error, can't find mount flag\n");
abort();
}
@@ -248,7 +248,7 @@ static int receive_fd(int fd)
cmsg = CMSG_FIRSTHDR(&msg);
if (cmsg->cmsg_type != SCM_RIGHTS) {
- fprintf(stderr, "got control message of unknown type %d\n",
+ fuse_log(FUSE_LOG_ERR, "got control message of unknown type %d\n",
cmsg->cmsg_type);
return -1;
}
@@ -312,7 +312,7 @@ static int fuse_mount_fusermount(const char *mountpoint, struct mount_opts *mo,
int rv;
if (!mountpoint) {
- fprintf(stderr, "fuse: missing mountpoint parameter\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: missing mountpoint parameter\n");
return -1;
}
@@ -393,13 +393,13 @@ static int fuse_mount_sys(const char *mnt, struct mount_opts *mo,
int res;
if (!mnt) {
- fprintf(stderr, "fuse: missing mountpoint parameter\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: missing mountpoint parameter\n");
return -1;
}
res = stat(mnt, &stbuf);
if (res == -1) {
- fprintf(stderr ,"fuse: failed to access mountpoint %s: %s\n",
+ fuse_log(FUSE_LOG_ERR, "fuse: failed to access mountpoint %s: %s\n",
mnt, strerror(errno));
return -1;
}
@@ -413,9 +413,9 @@ static int fuse_mount_sys(const char *mnt, struct mount_opts *mo,
fd = open(devname, O_RDWR | O_CLOEXEC);
if (fd == -1) {
if (errno == ENODEV || errno == ENOENT)
- fprintf(stderr, "fuse: device not found, try 'modprobe fuse' first\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: device not found, try 'modprobe fuse' first\n");
else
- fprintf(stderr, "fuse: failed to open %s: %s\n",
+ fuse_log(FUSE_LOG_ERR, "fuse: failed to open %s: %s\n",
devname, strerror(errno));
return -1;
}
@@ -435,7 +435,7 @@ static int fuse_mount_sys(const char *mnt, struct mount_opts *mo,
type = malloc((mo->subtype ? strlen(mo->subtype) : 0) + 32);
if (!type || !source) {
- fprintf(stderr, "fuse: failed to allocate memory\n");
+ fuse_log(FUSE_LOG_ERR, "fuse: failed to allocate memory\n");
goto out_close;
}
@@ -471,10 +471,10 @@ static int fuse_mount_sys(const char *mnt, struct mount_opts *mo,
int errno_save = errno;
if (mo->blkdev && errno == ENODEV &&
!fuse_mnt_check_fuseblk())
- fprintf(stderr,
+ fuse_log(FUSE_LOG_ERR,
"fuse: 'fuseblk' support missing\n");
else
- fprintf(stderr, "fuse: mount failed: %s\n",
+ fuse_log(FUSE_LOG_ERR, "fuse: mount failed: %s\n",
strerror(errno_save));
}
diff --git a/lib/mount_bsd.c b/lib/mount_bsd.c
index cbd3ced..f731cb6 100644
--- a/lib/mount_bsd.c
+++ b/lib/mount_bsd.c
@@ -161,7 +161,7 @@ static int fuse_mount_core(const char *mountpoint, const char *opts)
fd = strtol(fdnam, &ep, 10);
if (*ep != '\0') {
- fprintf(stderr, "invalid value given in FUSE_DEV_FD\n");
+ fuse_log(FUSE_LOG_ERR, "invalid value given in FUSE_DEV_FD\n");
return -1;
}