11#define FUSE_USE_VERSION FUSE_MAKE_VERSION(3, 17)
13#include "fuse_config.h"
14#include "fuse_lowlevel.h"
49 .getattr = test_ll_getattr,
52static void *signal_sender_thread(
void *arg)
56 usleep(2 * 1000 * 1000);
59 kill(getpid(), SIGTERM);
63static void fork_child(
void)
66 struct fuse_session *se;
69 char *mountpoint = NULL;
74 fprintf(stderr,
"Failed to add argument\n");
75 goto out_free_mountpoint;
82 mountpoint = strdup(
"/tmp/fuse_test_XXXXXX");
83 if (!mountpoint || !mkdtemp(mountpoint)) {
84 fprintf(stderr,
"Failed to create temp dir\n");
89 se = fuse_session_new(&args, &test_ll_ops,
sizeof(test_ll_ops), NULL);
91 fprintf(stderr,
"Failed to create FUSE session\n");
92 goto out_free_mountpoint;
97 fprintf(stderr,
"Failed to mount FUSE filesystem\n");
98 goto out_destroy_session;
102 loop_config = fuse_loop_cfg_create();
104 fprintf(stderr,
"Failed to create loop config\n");
107 fuse_loop_cfg_set_clone_fd(loop_config, 0);
108 fuse_loop_cfg_set_max_threads(loop_config, 2);
112 fprintf(stderr,
"Failed to set up signal handlers\n");
113 goto out_destroy_config;
117 if (pthread_create(&sig_thread, NULL, signal_sender_thread, NULL)) {
118 fprintf(stderr,
"Failed to create signal sender thread\n");
119 goto out_remove_handlers;
123 ret = fuse_session_loop_mt_312(se, loop_config);
125 printf(
"Debug: fuse_session_loop_mt_312 returned %d\n", ret);
127 printf(
"Debug: session status: %d\n", se->error);
133 pthread_join(sig_thread, NULL);
137 fuse_loop_cfg_destroy(loop_config);
144 printf(
"Debug: Clean shutdown via SIGTERM\n");
147 printf(
"Debug: Exiting with status %d\n", ret != 0);
153 fuse_loop_cfg_destroy(loop_config);
166static void run_test_in_child(
void)
181 if (waitpid(child, &status, 0) == -1) {
187 if (WIFSIGNALED(status) && WTERMSIG(status) == SIGTERM) {
188 printf(
"Child process terminated by SIGTERM as expected\n");
193 exit(WIFEXITED(status) ? WEXITSTATUS(status) : 1);
198 printf(
"Testing SIGTERM handling in libfuse\n");
200 printf(
"SIGTERM handling test passed\n");
int fuse_set_signal_handlers(struct fuse_session *se)
void fuse_remove_signal_handlers(struct fuse_session *se)
void fuse_session_destroy(struct fuse_session *se)
int fuse_reply_err(fuse_req_t req, int err)
struct fuse_req * fuse_req_t
int fuse_session_exited(struct fuse_session *se)
void fuse_session_unmount(struct fuse_session *se)
int fuse_session_mount(struct fuse_session *se, const char *mountpoint)
int fuse_opt_add_arg(struct fuse_args *args, const char *arg)
void fuse_opt_free_args(struct fuse_args *args)
#define FUSE_ARGS_INIT(argc, argv)
void(* lookup)(fuse_req_t req, fuse_ino_t parent, const char *name)