rm.c - sbase - suckless unix tools
(HTM) git clone git://git.suckless.org/sbase
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
rm.c (917B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include <sys/stat.h>
3
4 #include <errno.h>
5 #include <fcntl.h>
6 #include <stdio.h>
7 #include <unistd.h>
8
9 #include "../fs.h"
10 #include "../util.h"
11
12 int rm_status = 0;
13
14 void
15 rm(int dirfd, const char *name, struct stat *st, void *data, struct recursor *r)
16 {
17 int quiet, ask, write, flags, ignore;
18
19 ignore = r->flags & IGNORE;
20 quiet = r->flags & SILENT;
21 ask = r->flags & CONFIRM;
22 write = faccessat(dirfd, name, W_OK, 0) == 0;
23 flags = 0;
24
25 if (S_ISDIR(st->st_mode) && r->maxdepth) {
26 errno = EISDIR;
27 goto err;
28 }
29
30 if (!quiet && (!write && isatty(0) || ask)) {
31 if (!confirm("remove file '%s'? ", r->path))
32 return;
33 }
34
35 if (S_ISDIR(st->st_mode)) {
36 flags = AT_REMOVEDIR;
37 recurse(dirfd, name, NULL, r);
38 }
39
40 if (unlinkat(dirfd, name, flags) < 0)
41 goto err;
42 return;
43
44 err:
45 if (!ignore) {
46 weprintf("cannot remove '%s':", r->path);
47 rm_status = 1;
48 }
49 }