]> pd.if.org Git - zpackage/blobdiff - zpm-syncfs.c
move progress bar
[zpackage] / zpm-syncfs.c
index 06e5d350458f7e032058e7dfb71d70925ea3b8a3..9a50be1856c1aca9aa4c66f90ca02e174e878b5d 100644 (file)
@@ -628,15 +628,6 @@ static int remove_files(void *f, int ncols, char **vals, char **cols) {
                return 0;
        }
 
-       if (lstat(dest, &st) == -1) {
-               return seterror(conf,"can't stat");
-       }
-
-       if (S_ISDIR(st.st_mode)) {
-               flags = AT_REMOVEDIR;
-       }
-       /* TODO check that expected filetype matches actual filetype */
-
        if (conf->verbose) {
                if (conf->progress == 2) {
                        fprintf(stderr, "%s(%s)\n", flags ? "rmdir" : "unlink", dest);
@@ -651,12 +642,35 @@ static int remove_files(void *f, int ncols, char **vals, char **cols) {
                }
        }
 
+       errno = 0;
+
+       if (lstat(dest, &st) == -1) {
+               switch (errno) {
+                       case ENOENT:
+                               /* TODO chatter if verbose */
+                               break;
+                       default:
+                               return seterror(conf, "can't stat %s: %s", dest, strerror(errno));
+               }
+               return 0;
+       }
+
+       if (S_ISDIR(st.st_mode)) {
+               flags = AT_REMOVEDIR;
+       }
+       /* TODO check that expected filetype matches actual filetype */
+
+
        errno = 0;
 
        if (unlinkat(AT_FDCWD, dest, flags) == -1) {
                switch (errno) {
                        case ENOENT:
                                break;
+                       case ENOTEMPTY: /* fall through */
+                       case EEXIST:
+                               /* TODO chatter, or possibly require */
+                               break;
                        default:
                                return seterror(conf, "can't unlink %s: %s", dest, strerror(errno));
                }