12 const char usage_fmt[] = "Usage: %s <mountpoint>\n";
13 #define INAME_LEN (PATH_MAX + 1)
16 #define CHECK_IT(exp, pstr) \
18 fprintf(stderr, "%s: at %s:%d: ", progname, __FILE__, __LINE__); \
23 #define CHECK_SNPRINTF(rc, len) \
24 CHECK_IT((rc) > 0 && (rc) <= (len), "snprintf() failed")
26 static char *get_iname(char *fname, const char *mtpt)
32 iname = malloc(INAME_LEN);
33 CHECK_IT(iname, "malloc() failed");
35 fd = open(fname, O_CREAT, 0644);
36 CHECK_IT(fd >= 0 || errno == EISDIR, "open(fname) failed");
41 rc = stat(fname, &buf);
42 CHECK_IT(rc == 0, "stat(fname) failed");
44 rc = snprintf(iname, INAME_LEN,
45 "%s/__iopen__/%lu", mtpt, buf.st_ino);
46 CHECK_SNPRINTF(rc, INAME_LEN);
51 int main(int argc, char *argv[])
53 char *fname, *mtpt, *pname;
55 char *fname_iname, *dir;
56 char *dir_iname = NULL, *foo = NULL, *bar = NULL;
61 pname = strdup(argv[0]);
62 progname = basename(argv[0]);
65 fprintf(stderr, usage_fmt, progname);
72 fprintf(stderr, "error: %s: #%ld - %s\n", argv[0], i,
73 strerror(rc = errno));
79 printf("%s: thread #%ld (PID %d) started\n",
89 fname = malloc(INAME_LEN);
90 CHECK_IT(fname, "malloc() failed");
92 rc = snprintf(fname, INAME_LEN,
93 "%s/%d", mtpt, getpid());
94 CHECK_SNPRINTF(rc, INAME_LEN);
96 rc = mkdir(fname, 0644);
97 CHECK_IT(rc == 0, "mkdir(fname) failed");
99 fname_iname = get_iname(fname, mtpt);
101 dir = malloc(INAME_LEN);
102 CHECK_IT(dir, "malloc() failed");
104 rc = snprintf(dir, INAME_LEN,
105 "%s/dir", fname_iname);
106 CHECK_SNPRINTF(rc, INAME_LEN);
108 foo = malloc(INAME_LEN);
109 CHECK_IT(foo, "malloc() failed");
111 bar = malloc(INAME_LEN);
112 CHECK_IT(bar, "malloc() failed");
115 rc = mkdir(dir, 0644);
116 CHECK_IT(rc == 0, "mkdir() failed");
118 dir_iname = get_iname(dir, mtpt);
120 rc = snprintf(foo, INAME_LEN,
121 "%s/bar", dir_iname);
122 CHECK_SNPRINTF(rc, INAME_LEN);
124 rc = snprintf(bar, INAME_LEN,
125 "%s/bar", dir_iname);
126 CHECK_SNPRINTF(rc, INAME_LEN);
128 fd = open(foo, O_CREAT, 0644);
129 CHECK_IT(fd >= 0, "open(foo) failed");
132 rc = rename(foo, bar);
133 CHECK_IT(rc == 0, "rename(foo, bar) failed");
136 CHECK_IT(rc == 0, "unlink(bar) failed");
138 CHECK_IT(rc == 0, "rmdir(dir) failed");