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 }