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 }
#define fuse_main(argc, argv, op, private_data)
Definition: fuse.h:913
double entry_timeout
Definition: fuse.h:122
double negative_timeout
Definition: fuse.h:132
int nullpath_ok
Definition: fuse.h:276
int use_ino
Definition: fuse.h:193
double attr_timeout
Definition: fuse.h:138
void *(* init)(struct fuse_conn_info *conn, struct fuse_config *cfg)
Definition: fuse.h:616