Removing empty directories

This commit is contained in:
Klaus Schmidinger 2001-02-11 14:53:44 +01:00
parent c0ed9649a3
commit 80a42f1300
7 changed files with 73 additions and 9 deletions

View File

@ -389,3 +389,5 @@ Video Disk Recorder Revision History
- The "Green" button in the "Recordings" menu can now be used to rewind a
recording and play it from the very beginning.
- Fixed handling ':' in timer filenames and '\n' in timer summaries (see FORMATS).
- When removing recordings empty directories are now removed from the video
directory.

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: recording.c 1.26 2001/02/11 10:47:31 kls Exp $
* $Id: recording.c 1.27 2001/02/11 14:53:44 kls Exp $
*/
#define _GNU_SOURCE
@ -53,6 +53,7 @@ void RemoveDeletedRecordings(void)
}
if (r0 && time(NULL) - r0->start > DELETEDLIFETIME * 60) {
r0->Remove();
RemoveEmptyVideoDirectories();
LastRemoveCheck += REMOVELATENCY;
return;
}

44
tools.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: tools.c 1.29 2001/02/11 11:18:45 kls Exp $
* $Id: tools.c 1.30 2001/02/11 14:44:22 kls Exp $
*/
#define _GNU_SOURCE
@ -249,6 +249,48 @@ bool RemoveFileOrDir(const char *FileName, bool FollowSymlinks)
return true;
}
bool RemoveEmptyDirectories(const char *DirName, bool RemoveThis)
{
DIR *d = opendir(DirName);
if (d) {
bool empty = true;
struct dirent *e;
while ((e = readdir(d)) != NULL) {
if (strcmp(e->d_name, ".") && strcmp(e->d_name, "..") && strcmp(e->d_name, "lost+found")) {
char *buffer;
asprintf(&buffer, "%s/%s", DirName, e->d_name);
struct stat st;
if (stat(buffer, &st) == 0) {
if (S_ISDIR(st.st_mode)) {
if (!RemoveEmptyDirectories(buffer, true))
empty = false;
}
else
empty = false;
}
else {
LOG_ERROR_STR(buffer);
delete buffer;
return false;
}
delete buffer;
}
}
closedir(d);
if (RemoveThis && empty) {
dsyslog(LOG_INFO, "removing %s", DirName);
if (remove(DirName) < 0) {
LOG_ERROR_STR(DirName);
return false;
}
}
return empty;
}
else
LOG_ERROR_STR(DirName);
return false;
}
char *ReadLink(const char *FileName)
{
char RealName[_POSIX_PATH_MAX];

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: tools.h 1.23 2001/01/13 15:36:00 kls Exp $
* $Id: tools.h 1.24 2001/02/11 13:39:40 kls Exp $
*/
#ifndef __TOOLS_H
@ -48,6 +48,7 @@ uint FreeDiskSpaceMB(const char *Directory);
bool DirectoryOk(const char *DirName, bool LogErrors = false);
bool MakeDirs(const char *FileName, bool IsDirectory = false);
bool RemoveFileOrDir(const char *FileName, bool FollowSymlinks = false);
bool RemoveEmptyDirectories(const char *DirName, bool RemoveThis = false);
char *ReadLink(const char *FileName);
class cFile {

15
vdr.c
View File

@ -22,7 +22,7 @@
*
* The project's page is at http://www.cadsoft.de/people/kls/vdr
*
* $Id: vdr.c 1.52 2001/02/04 19:41:24 kls Exp $
* $Id: vdr.c 1.53 2001/02/11 14:51:44 kls Exp $
*/
#include <getopt.h>
@ -44,6 +44,8 @@
#define KEYS_CONF "keys.conf"
#endif
#define ACTIVITYTIMEOUT 60 // seconds before starting housekeeping
static int Interrupted = 0;
static void SignalHandler(int signum)
@ -218,6 +220,7 @@ int main(int argc, char *argv[])
cReplayControl *ReplayControl = NULL;
int LastChannel = -1;
int PreviousChannel = cDvbApi::CurrentChannel();
time_t LastActivity = time(NULL);
while (!Interrupted) {
// Channel display:
@ -324,8 +327,14 @@ int main(int argc, char *argv[])
EITScanner.Process();
cVideoCutter::Active();
}
if (!*Interact && !cRecordControls::Active())
RemoveDeletedRecordings();
if (!*Interact && !cRecordControls::Active()) {
if (time(NULL) - LastActivity > ACTIVITYTIMEOUT) {
RemoveDeletedRecordings();
LastActivity = time(NULL);
}
}
else
LastActivity = time(NULL);
}
isyslog(LOG_INFO, "caught signal %d", Interrupted);
Setup.CurrentChannel = cDvbApi::CurrentChannel();

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: videodir.c 1.3 2000/12/24 12:51:41 kls Exp $
* $Id: videodir.c 1.4 2001/02/11 13:48:30 kls Exp $
*/
#include "videodir.h"
@ -28,7 +28,7 @@ public:
cVideoDirectory(void);
~cVideoDirectory();
uint FreeMB(void);
const char *Name(void) { return name; }
const char *Name(void) { return name ? name : VideoDirectory; }
const char *Stored(void) { return stored; }
int Length(void) { return length; }
bool IsDistributed(void) { return name != NULL; }
@ -197,3 +197,11 @@ const char *PrefixVideoFileName(const char *FileName, char Prefix)
return PrefixedName;
}
void RemoveEmptyVideoDirectories(void)
{
cVideoDirectory Dir;
do {
RemoveEmptyDirectories(Dir.Name());
} while (Dir.Next());
}

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: videodir.h 1.2 2000/12/24 12:41:10 kls Exp $
* $Id: videodir.h 1.3 2001/02/11 13:12:50 kls Exp $
*/
#ifndef __VIDEODIR_H
@ -18,5 +18,6 @@ bool RenameVideoFile(const char *OldName, const char *NewName);
bool RemoveVideoFile(const char *FileName);
bool VideoFileSpaceAvailable(unsigned int SizeMB);
const char *PrefixVideoFileName(const char *FileName, char Prefix);
void RemoveEmptyVideoDirectories(void);
#endif //__VIDEODIR_H