libfuse

release_unlink_race.c
1 /*
2 This program can be distributed under the terms of the GNU GPLv2.
3 See the file COPYING.
4 */
5
6 #define FUSE_USE_VERSION 31
7
8 #define _GNU_SOURCE
9
10 #include <fuse.h>
11
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <unistd.h>
15 #include <errno.h>
16
17 static void *xmp_init(struct fuse_conn_info *conn,
18 struct fuse_config *cfg)
19 {
20 (void) conn;
21
22 cfg->use_ino = 1;
23 cfg->nullpath_ok = 1;
24 cfg->entry_timeout = 0;
25 cfg->attr_timeout = 0;
26 cfg->negative_timeout = 0;
27
28 return NULL;
29 }
30
31 static int xmp_getattr(const char *path, struct stat *stbuf,
32 struct fuse_file_info *fi)
33 {
34 int res;
35
36 (void) path;
37
38 if(fi)
39 res = fstat(fi->fh, stbuf);
40 else
41 res = lstat(path, stbuf);
42 if (res == -1)
43 return -errno;
44
45 return 0;
46 }
47
48 static int xmp_unlink(const char *path)
49 {
50 int res;
51
52 res = unlink(path);
53 if (res == -1)
54 return -errno;
55
56 return 0;
57 }
58
59 static int xmp_rename(const char *from, const char *to, unsigned int flags)
60 {
61 int res;
62
63 if (flags)
64 return -EINVAL;
65
66 if(!getenv("RELEASEUNLINKRACE_DELAY_DISABLE")) usleep(100000);
67
68 res = rename(from, to);
69 if (res == -1)
70 return -errno;
71
72 return 0;
73 }
74
75 static int xmp_create(const char *path, mode_t mode, struct fuse_file_info *fi)
76 {
77 int fd;
78
79 fd = open(path, fi->flags, mode);
80 if (fd == -1)
81 return -errno;
82
83 fi->fh = fd;
84 return 0;
85 }
86
87 static int xmp_release(const char *path, struct fuse_file_info *fi)
88 {
89 (void) path;
90
91 if(!getenv("RELEASEUNLINKRACE_DELAY_DISABLE")) usleep(100000);
92
93 close(fi->fh);
94
95 return 0;
96 }
97
98 static const struct fuse_operations xmp_oper = {
99 .init = xmp_init,
100 .getattr = xmp_getattr,
101 .unlink = xmp_unlink,
102 .rename = xmp_rename,
103 .create = xmp_create,
104 .release = xmp_release,
105 };
106
107 int main(int argc, char *argv[])
108 {
109 umask(0);
110 return fuse_main(argc, argv, &xmp_oper, NULL);
111 }
fuse_main
#define fuse_main(argc, argv, op, private_data)
Definition: fuse.h:913
fuse_config
Definition: fuse.h:96
fuse_config::entry_timeout
double entry_timeout
Definition: fuse.h:122
fuse_config::negative_timeout
double negative_timeout
Definition: fuse.h:132
fuse_config::nullpath_ok
int nullpath_ok
Definition: fuse.h:276
fuse_config::use_ino
int use_ino
Definition: fuse.h:193
fuse_config::attr_timeout
double attr_timeout
Definition: fuse.h:138
fuse_conn_info
Definition: fuse_common.h:460
fuse_file_info
Definition: fuse_common.h:50
fuse_file_info::fh
uint64_t fh
Definition: fuse_common.h:106
fuse_file_info::flags
int flags
Definition: fuse_common.h:52
fuse_operations
Definition: fuse.h:324
fuse_operations::init
void *(* init)(struct fuse_conn_info *conn, struct fuse_config *cfg)
Definition: fuse.h:616