}
int pakfire_file_remove(struct pakfire_file* file) {
+ int r;
+
if (!*file->abspath) {
errno = EINVAL;
return 1;
DEBUG(file->pakfire, "Removing %s...\n", file->path);
- int r = remove(file->abspath);
- if (r) {
- switch (errno) {
- // Ignore when we could not remove directories
- case ENOTEMPTY:
- return 0;
-
- // Ignore if the file didn't exist
- case ENOENT:
- return 0;
-
- default:
- break;
- }
+ switch (file->st.st_mode & S_IFMT) {
+ // Call rmdir() for directories
+ case S_IFDIR:
+ r = rmdir(file->abspath);
+ if (r) {
+ switch (errno) {
+ // Ignore when the directory is not empty
+ case ENOTEMPTY:
+ r = 0;
+ break;
+
+ // Ignore if the directory didn't exist
+ case ENOENT:
+ r = 0;
+ break;
+
+ // Ignore if the directory changed type
+ case ENOTDIR:
+ r = 0;
+ break;
+
+ // Log anything else
+ default:
+ ERROR(file->pakfire, "Could not remove directory %s: %m\n", file->path);
+ break;
+ }
+ }
+ break;
- ERROR(file->pakfire, "Could not remove %s (%s): %m\n", file->path, file->abspath);
+ // Call unlink() for everything else
+ default:
+ r = unlink(file->abspath);
+ if (r) {
+ switch (errno) {
+ // Ignore if the file didn't exist
+ case ENOENT:
+ r = 0;
+ break;
+
+ default:
+ ERROR(file->pakfire, "Could not remove %s: %m\n", file->path);
+ break;
+ }
+ }
+ break;
}
return r;