URI:
       tMake deletion process more robust regarding file checking - pm - barely a pack manager
  HTML git clone git://z3bra.org/pm
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit cce6b1cec50531e60e5e20a0eb14ae914446bf50
   DIR parent bb81e744a877d4cc21bc2ddee1e15a9da906d058
  HTML Author: z3bra <willyatmailoodotorg>
       Date:   Fri,  8 Jan 2016 08:45:44 +0100
       
       Make deletion process more robust regarding file checking
       
       Diffstat:
         M pm.c                                |      34 ++++++++++++++++----------------
       
       1 file changed, 17 insertions(+), 17 deletions(-)
       ---
   DIR diff --git a/pm.c b/pm.c
       t@@ -229,7 +229,7 @@ list_local(int fd, char *datadir)
                                if ((meta = open(tmp, O_RDONLY)) < 0) {
                                        perror("open");
                                        closedir(d);
       -                                return (1);
       +                                return 1;
                                }
                                len = read(meta, tmp, 32);
                                tmp[len - 1] = 0;
       t@@ -353,7 +353,6 @@ unpack(char *root, char *in)
                                return r;
                        }
        
       -                printf("+ %s\n", archive_entry_pathname(e));
                        r = archive_write_header(disk, e);
                        if (r != ARCHIVE_OK)
                                return r;
       t@@ -385,7 +384,7 @@ delete_content(FILE *f)
        
                /* remove trailing '\n' */
                if ((len = strnlen(file, PATH_MAX)) == 0)
       -                return -1;
       +                return 0;
        
                file[len - 1] = 0;
                len--;
       t@@ -396,14 +395,22 @@ delete_content(FILE *f)
                        len--;
                }
        
       -        /* if file doesn't exist anymore, it's all good :) */
       -        if (stat(file, &st) < 0 && errno == ENOENT)
       +        /*
       +         * if file doesn't exist anymore, it's all good :)
       +         * we use lstat here so that dangling links can be delt with too
       +         */
       +        if (lstat(file, &st) < 0 && errno == ENOENT)
                        return 0;
        
                if (S_ISDIR(st.st_mode) && is_empty(file))
                        return rmdir(file);
        
       -        return unlink(file);
       +        if (unlink(file) < 0) {
       +                perror("unlink");
       +                return -1;
       +        }
       +
       +        return 0;
        }
        
        
       t@@ -413,12 +420,12 @@ delete_content(FILE *f)
        int
        delete(const char *datadir, const char *rootfs, const char *name)
        {
       -        char *cwd;
                FILE *f;
                char meta[PATH_MAX];
        
                snprintf(meta, PATH_MAX, "%s/%s/version", datadir, name);
       -        unlink(meta);
       +        if (unlink(meta) < 0)
       +                return ERR_DELETE;
        
                snprintf(meta, PATH_MAX, "%s/%s/files", datadir, name);
                if ((f = fopen(meta, "r")) == NULL) {
       t@@ -426,22 +433,15 @@ delete(const char *datadir, const char *rootfs, const char *name)
                        return -1;
                }
        
       -        /* hack to allow relative path for metadata */
       -        cwd = getcwd(NULL, PATH_MAX);
                if (chdir(rootfs) < 0) {
                        perror("chdir");
                        return -1;
                }
        
       -        if (delete_content(f) < 0)
       -                return ERR_DELETE;
       -
       +        /* ignore errors so everything gets deleted */
       +        delete_content(f);
                fclose(f);
        
       -        /* hack again */
       -        chdir(cwd);
       -        free(cwd);
       -
                if (unlink(meta) < 0)
                        return ERR_DELETE;