mirror of
https://github.com/akuker/RASCSI.git
synced 2024-11-26 13:49:21 +00:00
Prevent image files in use from being deleted
This commit is contained in:
parent
f6f572ee9e
commit
da110c4e8e
@ -25,7 +25,7 @@ void FileSupport::UnreserveFile()
|
|||||||
reserved_files.erase(diskpath.GetPath());
|
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()) {
|
if (reserved_files.find(path.GetPath()) != reserved_files.end()) {
|
||||||
const id_set ids = reserved_files[path.GetPath()];
|
const id_set ids = reserved_files[path.GetPath()];
|
||||||
|
@ -38,8 +38,8 @@ public:
|
|||||||
static void SetReservedFiles(const map<string, id_set>& files_in_use) { FileSupport::reserved_files = files_in_use; }
|
static void SetReservedFiles(const map<string, id_set>& files_in_use) { FileSupport::reserved_files = files_in_use; }
|
||||||
void ReserveFile(const Filepath&, int, int);
|
void ReserveFile(const Filepath&, int, int);
|
||||||
void UnreserveFile();
|
void UnreserveFile();
|
||||||
bool GetIdsForReservedFile(const Filepath&, int&, int&) const;
|
|
||||||
|
|
||||||
|
static bool GetIdsForReservedFile(const Filepath&, int&, int&);
|
||||||
static void UnreserveAll();
|
static void UnreserveAll();
|
||||||
|
|
||||||
virtual void Open(const Filepath&) = 0;
|
virtual void Open(const Filepath&) = 0;
|
||||||
|
@ -785,6 +785,16 @@ bool DeleteImage(int fd, const PbCommand& command)
|
|||||||
|
|
||||||
filename = default_image_folder + "/" + filename;
|
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())) {
|
if (unlink(filename.c_str())) {
|
||||||
return ReturnStatus(fd, false, "Can't delete image file '" + filename + "': " + string(strerror(errno)));
|
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 id;
|
||||||
int unit;
|
int unit;
|
||||||
if (file_support->GetIdsForReservedFile(filepath, id, unit)) {
|
if (FileSupport::GetIdsForReservedFile(filepath, id, unit)) {
|
||||||
delete device;
|
delete device;
|
||||||
|
|
||||||
error << "Image file '" << filename << "' is already used by ID " << id << ", unit " << unit;
|
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 filepath;
|
||||||
filepath.SetPath(filename.c_str());
|
filepath.SetPath(filename.c_str());
|
||||||
string initial_filename = filepath.GetPath();
|
string initial_filename = filepath.GetPath();
|
||||||
FileSupport *file_support = dynamic_cast<FileSupport *>(device);
|
if (FileSupport::GetIdsForReservedFile(filepath, id, unit)) {
|
||||||
if (file_support->GetIdsForReservedFile(filepath, id, unit)) {
|
|
||||||
ostringstream error;
|
ostringstream error;
|
||||||
error << "Image file '" << filename << "' is already used by ID " << id << ", unit " << unit;
|
error << "Image file '" << filename << "' is already used by ID " << id << ", unit " << unit;
|
||||||
return ReturnStatus(fd, false, error);
|
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<FileSupport *>(device);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
try {
|
try {
|
||||||
file_support->Open(filepath);
|
file_support->Open(filepath);
|
||||||
|
Loading…
Reference in New Issue
Block a user