diff --git a/src/raspberrypi/devices/file_support.cpp b/src/raspberrypi/devices/file_support.cpp index e5fbea61..09b9061a 100644 --- a/src/raspberrypi/devices/file_support.cpp +++ b/src/raspberrypi/devices/file_support.cpp @@ -25,7 +25,7 @@ void FileSupport::UnreserveFile() reserved_files.erase(diskpath.GetPath()); } -bool FileSupport::GetIdsForReservedFile(const Filepath& path, int& id, int& unit) const +bool FileSupport::GetIdsForReservedFile(const Filepath& path, int& id, int& unit) { if (reserved_files.find(path.GetPath()) != reserved_files.end()) { const id_set ids = reserved_files[path.GetPath()]; diff --git a/src/raspberrypi/devices/file_support.h b/src/raspberrypi/devices/file_support.h index 4cdc8025..0d7df448 100644 --- a/src/raspberrypi/devices/file_support.h +++ b/src/raspberrypi/devices/file_support.h @@ -38,8 +38,8 @@ public: static void SetReservedFiles(const map& files_in_use) { FileSupport::reserved_files = files_in_use; } void ReserveFile(const Filepath&, int, int); void UnreserveFile(); - bool GetIdsForReservedFile(const Filepath&, int&, int&) const; + static bool GetIdsForReservedFile(const Filepath&, int&, int&); static void UnreserveAll(); virtual void Open(const Filepath&) = 0; diff --git a/src/raspberrypi/rascsi.cpp b/src/raspberrypi/rascsi.cpp index c7eb34bc..ec990cca 100644 --- a/src/raspberrypi/rascsi.cpp +++ b/src/raspberrypi/rascsi.cpp @@ -785,6 +785,16 @@ bool DeleteImage(int fd, const PbCommand& command) filename = default_image_folder + "/" + filename; + int id; + int unit; + Filepath filepath; + filepath.SetPath(filename.c_str()); + if (FileSupport::GetIdsForReservedFile(filepath, id, unit)) { + ostringstream msg; + msg << "Can't delete image file '" << filename << "', it is in use 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))); } @@ -945,7 +955,7 @@ bool Attach(int fd, const PbDeviceDefinition& pb_device, Device *map[], bool dry int id; int unit; - if (file_support->GetIdsForReservedFile(filepath, id, unit)) { + if (FileSupport::GetIdsForReservedFile(filepath, id, unit)) { delete device; error << "Image file '" << filename << "' is already used by ID " << id << ", unit " << unit; @@ -1049,8 +1059,7 @@ bool Insert(int fd, const PbDeviceDefinition& pb_device, Device *device, bool dr Filepath filepath; filepath.SetPath(filename.c_str()); string initial_filename = filepath.GetPath(); - FileSupport *file_support = dynamic_cast(device); - if (file_support->GetIdsForReservedFile(filepath, id, unit)) { + if (FileSupport::GetIdsForReservedFile(filepath, id, unit)) { ostringstream error; error << "Image file '" << filename << "' is already used by ID " << id << ", unit " << unit; return ReturnStatus(fd, false, error); @@ -1070,6 +1079,8 @@ bool Insert(int fd, const PbDeviceDefinition& pb_device, Device *device, bool dr } } + FileSupport *file_support = dynamic_cast(device); + try { try { file_support->Open(filepath);