From 46fc22f72aabe0e51d2519a540707369eb91d8fc Mon Sep 17 00:00:00 2001 From: Uwe Seimet Date: Mon, 20 Dec 2021 18:58:27 +0100 Subject: [PATCH] Delete empty folders --- src/raspberrypi/rascsi_image.cpp | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/raspberrypi/rascsi_image.cpp b/src/raspberrypi/rascsi_image.cpp index 4b664dec..0f582db9 100644 --- a/src/raspberrypi/rascsi_image.cpp +++ b/src/raspberrypi/rascsi_image.cpp @@ -186,23 +186,40 @@ bool RascsiImage::DeleteImage(int fd, const PbCommand& command) return ReturnStatus(fd, false, "Missing image filename"); } - filename = default_image_folder + "/" + filename; + string full_filename = default_image_folder + "/" + filename; int id; int unit; Filepath filepath; - filepath.SetPath(filename.c_str()); + filepath.SetPath(full_filename.c_str()); if (FileSupport::GetIdsForReservedFile(filepath, id, unit)) { ostringstream msg; - msg << "Can't delete image file '" << filename << "', it is used by device ID " << id << ", unit " << unit; + msg << "Can't delete image file '" << full_filename << "', it is used by device ID " << id << ", unit " << unit; return ReturnStatus(fd, false, msg.str()); } - if (unlink(filename.c_str())) { - return ReturnStatus(fd, false, "Can't delete image file '" + filename + "': " + string(strerror(errno))); + if (remove(full_filename.c_str())) { + return ReturnStatus(fd, false, "Can't delete image file '" + full_filename + "': " + string(strerror(errno))); } - LOGINFO("Deleted image file '%s'", filename.c_str()); + // Delete empty subfolders + size_t last_slash = filename.rfind('/'); + while (last_slash != string::npos) { + string folder = filename.substr(0, last_slash); + + std::error_code error; + if (!filesystem::is_empty(default_image_folder + "/" + folder, error) || error) { + break; + } + + if (remove((default_image_folder + "/" + folder).c_str())) { + return ReturnStatus(fd, false, "Can't delete empty image folder '" + default_image_folder + "/" + folder +"'"); + } + + last_slash = folder.rfind('/'); + } + + LOGINFO("Deleted image file '%s'", full_filename.c_str()); return ReturnStatus(fd); }