Module Name: src Committed By: pho Date: Sat Jan 22 07:39:22 UTC 2022
Added Files: src/lib/librefuse: fuse_log.h refuse_log.c Log Message: lib/librefuse: Implement logging API appeared on FUSE 3.7 To generate a diff of this commit: cvs rdiff -u -r0 -r1.1 src/lib/librefuse/fuse_log.h \ src/lib/librefuse/refuse_log.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Added files: Index: src/lib/librefuse/fuse_log.h diff -u /dev/null src/lib/librefuse/fuse_log.h:1.1 --- /dev/null Sat Jan 22 07:39:22 2022 +++ src/lib/librefuse/fuse_log.h Sat Jan 22 07:39:22 2022 @@ -0,0 +1,63 @@ +/* $NetBSD: fuse_log.h,v 1.1 2022/01/22 07:39:22 pho Exp $ */ + +/* + * Copyright (c) 2021 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#if !defined(_FUSE_LOG_H_) +#define _FUSE_LOG_H_ + +/* FUSE logging API, appeared on FUSE 3.7. */ + +#include <stdarg.h> +#include <sys/cdefs.h> + +#ifdef __cplusplus +extern "C" { +#endif + +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 +}; + +typedef void (*fuse_log_func_t)(enum fuse_log_level level, const char *fmt, va_list ap); + +void fuse_set_log_func(fuse_log_func_t func); +void fuse_log(enum fuse_log_level level, const char *fmt, ...) __printflike(2, 3); + +#ifdef __cplusplus +} +#endif + +#endif Index: src/lib/librefuse/refuse_log.c diff -u /dev/null src/lib/librefuse/refuse_log.c:1.1 --- /dev/null Sat Jan 22 07:39:22 2022 +++ src/lib/librefuse/refuse_log.c Sat Jan 22 07:39:22 2022 @@ -0,0 +1,100 @@ +/* $NetBSD: refuse_log.c,v 1.1 2022/01/22 07:39:22 pho Exp $ */ + +/* + * Copyright (c) 2021 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +#if !defined(lint) +__RCSID("$NetBSD: refuse_log.c,v 1.1 2022/01/22 07:39:22 pho Exp $"); +#endif /* !lint */ + +#include <assert.h> +#include <fuse_log.h> +#if defined(MULTITHREADED_REFUSE) +# include <pthread.h> +#endif +#include <stdio.h> + +static void +default_log_func(enum fuse_log_level level __attribute__((__unused__)), + const char *fmt, va_list ap) { + /* This function needs to be thread-safe. Calling vfprintf(3) + * should be okay because POSIX mandates locking FILE* objects + * internally. */ + vfprintf(stderr, fmt, ap); +} + +#if defined(MULTITHREADED_REFUSE) +static pthread_mutex_t log_func_mutex = PTHREAD_MUTEX_INITIALIZER; +#endif +static fuse_log_func_t log_func = default_log_func; + +void +fuse_set_log_func(fuse_log_func_t func) { +#if defined(MULTITHREADED_REFUSE) + /* What we really need here is merely a memory barrier, but + * locking a mutex is the easiest way to achieve that. */ + int rv; + + rv = pthread_mutex_lock(&log_func_mutex); + assert(rv == 0); +#endif + + if (func) + log_func = func; + else + log_func = default_log_func; + +#if defined(MULTITHREADED_REFUSE) + rv = pthread_mutex_unlock(&log_func_mutex); + assert(rv == 0); +#endif +} + +void +fuse_log(enum fuse_log_level level, const char *fmt, ...) { + va_list ap; +#if defined(MULTITHREADED_REFUSE) + /* What we really need here is merely a memory barrier, but + * locking a mutex is the easiest way to achieve that. */ + int rv; + + rv = pthread_mutex_lock(&log_func_mutex); + assert(rv == 0); +#endif + + va_start(ap, fmt); + log_func(level, fmt, ap); + va_end(ap); + +#if defined(MULTITHREADED_REFUSE) + rv = pthread_mutex_unlock(&log_func_mutex); + assert(rv == 0); +#endif +}