summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--HISTORY9
-rw-r--r--UPDATE-1.6.013
-rw-r--r--recording.c46
-rw-r--r--tools.c17
-rw-r--r--tools.h3
-rw-r--r--videodir.c11
-rw-r--r--videodir.h3
7 files changed, 74 insertions, 28 deletions
diff --git a/HISTORY b/HISTORY
index 6c146150..e4494700 100644
--- a/HISTORY
+++ b/HISTORY
@@ -5579,7 +5579,7 @@ Video Disk Recorder Revision History
is not available, in order to allow staying on an encrypted channel that takes
a while for the CAM to start decrypting.
-2008-02-10: Version 1.5.15
+2008-02-16: Version 1.5.15
- Updated the Italian OSD texts (thanks to Diego Pierotto).
- Added option -i to the pictures plugin's pic2mpg to ignore unknown file types.
@@ -5624,3 +5624,10 @@ Video Disk Recorder Revision History
stopped immediately (thanks to Mikko Matilainen for reporting a possible crash
if the Info key is pressed after deleting the currently replayed recording).
- Updated the Russian OSD texts (thanks to Oleg Roitburd).
+- When determining the amount of free disk space, any deleted (but not yet removed)
+ recordings on different file systems (that are mounted under the video directory)
+ are no longer taken into account.
+- When running out of disk space during a recording, only such deleted or old
+ recordings are removed, that actually are on the video directory file system(s).
+ This prevents VDR from accidentally deleting recordings on other file systems,
+ which would not add any free space to the video directory.
diff --git a/UPDATE-1.6.0 b/UPDATE-1.6.0
index 39f8073c..1a79e517 100644
--- a/UPDATE-1.6.0
+++ b/UPDATE-1.6.0
@@ -63,9 +63,18 @@ Channels:
parameter to 0 turns off the automatic channel switching, and the user will
have to confirm the entry by pressing the "Ok" key.
-Recording:
+Recordings:
- The info.vdr file now also stores the name of the channel.
+- When deleting the recording that is currently replayed, the replay is now
+ stopped immediately.
+- When determining the amount of free disk space, any deleted (but not yet removed)
+ recordings on different file systems (that are mounted under the video directory)
+ are no longer taken into account.
+- When running out of disk space during a recording, only such deleted or old
+ recordings are removed, that actually are on the video directory file system(s).
+ This prevents VDR from accidentally deleting recordings on other file systems,
+ which would not add any free space to the video directory.
SVDRP:
@@ -128,3 +137,5 @@ Misc:
menu.
- Changed the message "Upcoming VPS recording!" to "Upcoming recording!" because
it applies to non-VPS recordings as well.
+- Limiting the length of the recording name in timers in case VDR is run with
+ --vfat, in order to avoid names that are too long for Windows.
diff --git a/recording.c b/recording.c
index 894757c7..4ecf4a96 100644
--- a/recording.c
+++ b/recording.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: recording.c 1.160 2008/02/15 15:50:06 kls Exp $
+ * $Id: recording.c 1.161 2008/02/16 13:31:39 kls Exp $
*/
#include "recording.h"
@@ -144,10 +144,12 @@ void AssertFreeDiskSpace(int Priority, bool Force)
cThreadLock DeletedRecordingsLock(&DeletedRecordings);
if (DeletedRecordings.Count()) {
cRecording *r = DeletedRecordings.First();
- cRecording *r0 = r;
+ cRecording *r0 = NULL;
while (r) {
- if (r->start < r0->start)
- r0 = r;
+ if (IsOnVideoDirectoryFileSystem(r->FileName())) { // only remove recordings that will actually increase the free video disk space
+ if (!r0 || r->start < r0->start)
+ r0 = r;
+ }
r = DeletedRecordings.Next(r);
}
if (r0 && r0->Remove()) {
@@ -156,11 +158,13 @@ void AssertFreeDiskSpace(int Priority, bool Force)
return;
}
}
- // DeletedRecordings was empty, so to be absolutely sure there are no
- // deleted recordings we need to double check:
- DeletedRecordings.Update(true);
- if (DeletedRecordings.Count())
- return; // the next call will actually remove it
+ else {
+ // DeletedRecordings was empty, so to be absolutely sure there are no
+ // deleted recordings we need to double check:
+ DeletedRecordings.Update(true);
+ if (DeletedRecordings.Count())
+ return; // the next call will actually remove it
+ }
// No "deleted" files to remove, so let's see if we can delete a recording:
isyslog("...no deleted recording found, trying to delete an old recording...");
cThreadLock RecordingsLock(&Recordings);
@@ -168,15 +172,17 @@ void AssertFreeDiskSpace(int Priority, bool Force)
cRecording *r = Recordings.First();
cRecording *r0 = NULL;
while (r) {
- if (!r->IsEdited() && r->lifetime < MAXLIFETIME) { // edited recordings and recordings with MAXLIFETIME live forever
- if ((r->lifetime == 0 && Priority > r->priority) || // the recording has no guaranteed lifetime and the new recording has higher priority
- (r->lifetime > 0 && (time(NULL) - r->start) / SECSINDAY >= r->lifetime)) { // the recording's guaranteed lifetime has expired
- if (r0) {
- if (r->priority < r0->priority || (r->priority == r0->priority && r->start < r0->start))
- r0 = r; // in any case we delete the one with the lowest priority (or the older one in case of equal priorities)
+ if (IsOnVideoDirectoryFileSystem(r->FileName())) { // only delete recordings that will actually increase the free video disk space
+ if (!r->IsEdited() && r->lifetime < MAXLIFETIME) { // edited recordings and recordings with MAXLIFETIME live forever
+ if ((r->lifetime == 0 && Priority > r->priority) || // the recording has no guaranteed lifetime and the new recording has higher priority
+ (r->lifetime > 0 && (time(NULL) - r->start) / SECSINDAY >= r->lifetime)) { // the recording's guaranteed lifetime has expired
+ if (r0) {
+ if (r->priority < r0->priority || (r->priority == r0->priority && r->start < r0->start))
+ r0 = r; // in any case we delete the one with the lowest priority (or the older one in case of equal priorities)
+ }
+ else
+ r0 = r;
}
- else
- r0 = r;
}
}
r = Recordings.Next(r);
@@ -1035,7 +1041,7 @@ int cRecordings::TotalFileSizeMB(void)
int size = 0;
LOCK_THREAD;
for (cRecording *recording = First(); recording; recording = Next(recording)) {
- if (recording->fileSizeMB > 0)
+ if (recording->fileSizeMB > 0 && IsOnVideoDirectoryFileSystem(recording->FileName()))
size += recording->fileSizeMB;
}
return size;
@@ -1401,10 +1407,6 @@ bool cIndexFile::IsStillRecording()
// --- cFileName -------------------------------------------------------------
-#include <errno.h>
-#include <unistd.h>
-#include "videodir.h"
-
#define MAXFILESPERRECORDING 255
#define RECORDFILESUFFIX "/%03d.vdr"
#define RECORDFILESUFFIXLEN 20 // some additional bytes for safety...
diff --git a/tools.c b/tools.c
index 43f5bfad..64f4464d 100644
--- a/tools.c
+++ b/tools.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: tools.c 1.142 2008/02/15 14:45:05 kls Exp $
+ * $Id: tools.c 1.143 2008/02/16 13:38:22 kls Exp $
*/
#include "tools.h"
@@ -277,6 +277,21 @@ cString itoa(int n)
return buf;
}
+bool EntriesOnSameFileSystem(const char *File1, const char *File2)
+{
+ struct statfs statFs;
+ if (statfs(File1, &statFs) == 0) {
+ fsid_t fsid1 = statFs.f_fsid;
+ if (statfs(File2, &statFs) == 0)
+ return memcmp(&statFs.f_fsid, &fsid1, sizeof(fsid1)) == 0;
+ else
+ LOG_ERROR_STR(File2);
+ }
+ else
+ LOG_ERROR_STR(File1);
+ return false;
+}
+
int FreeDiskSpaceMB(const char *Directory, int *UsedMB)
{
if (UsedMB)
diff --git a/tools.h b/tools.h
index dd93ef02..4013b2ab 100644
--- a/tools.h
+++ b/tools.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: tools.h 1.111 2008/02/15 14:10:11 kls Exp $
+ * $Id: tools.h 1.112 2008/02/16 13:00:16 kls Exp $
*/
#ifndef __TOOLS_H
@@ -193,6 +193,7 @@ int numdigits(int n);
bool isnumber(const char *s);
cString itoa(int n);
cString AddDirectory(const char *DirName, const char *FileName);
+bool EntriesOnSameFileSystem(const char *File1, const char *File2);
int FreeDiskSpaceMB(const char *Directory, int *UsedMB = NULL);
bool DirectoryOk(const char *DirName, bool LogErrors = false);
bool MakeDirs(const char *FileName, bool IsDirectory = false);
diff --git a/videodir.c b/videodir.c
index a07ed28e..e61e3cbc 100644
--- a/videodir.c
+++ b/videodir.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: videodir.c 1.14 2005/12/18 10:33:20 kls Exp $
+ * $Id: videodir.c 1.15 2008/02/16 13:00:03 kls Exp $
*/
#include "videodir.h"
@@ -232,3 +232,12 @@ void RemoveEmptyVideoDirectories(void)
} while (Dir.Next());
}
+bool IsOnVideoDirectoryFileSystem(const char *FileName)
+{
+ cVideoDirectory Dir;
+ do {
+ if (EntriesOnSameFileSystem(Dir.Name(), FileName))
+ return true;
+ } while (Dir.Next());
+ return false;
+}
diff --git a/videodir.h b/videodir.h
index 6dd2d8c1..253e07b0 100644
--- a/videodir.h
+++ b/videodir.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: videodir.h 1.6 2005/10/31 11:50:23 kls Exp $
+ * $Id: videodir.h 1.7 2008/02/16 12:53:11 kls Exp $
*/
#ifndef __VIDEODIR_H
@@ -23,5 +23,6 @@ bool VideoFileSpaceAvailable(int SizeMB);
int VideoDiskSpace(int *FreeMB = NULL, int *UsedMB = NULL); // returns the used disk space in percent
cString PrefixVideoFileName(const char *FileName, char Prefix);
void RemoveEmptyVideoDirectories(void);
+bool IsOnVideoDirectoryFileSystem(const char *FileName);
#endif //__VIDEODIR_H