aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/directory.c45
1 files changed, 41 insertions, 4 deletions
diff --git a/src/directory.c b/src/directory.c
index 2954e054e..d15894633 100644
--- a/src/directory.c
+++ b/src/directory.c
@@ -126,6 +126,8 @@ void sortDirectory(Directory * directory);
int inodeFoundInParent(Directory * parent, ino_t inode, dev_t device);
+int statDirectory(Directory * dir);
+
void clearUpdatePid() {
directory_updatePid = 0;
}
@@ -345,7 +347,9 @@ int updateInDirectory(Directory * directory, char * shortname, char * name) {
}
else if(S_ISDIR(st.st_mode)) {
if(findInList(directory->subDirectories,shortname,(void **)&subDir)) {
- if(updateDirectory((Directory *)subDir)>0) return 1;
+ freeDirectoryStatFromDirectory(subDir);
+ ((Directory *)subDir)->stat = newDirectoryStat(&st);
+ return updateDirectory((Directory *)subDir);
}
else {
return addSubDirectoryToDirectory(directory,shortname,
@@ -523,8 +527,18 @@ int updatePath(char * utf8path) {
}
}
else if((song = getSongDetails(path,&shortname,&parentDirectory))) {
+ if(!parentDirectory->stat && statDirectory(parentDirectory) < 0)
+ {
+ free(path);
+ return 0;
+ }
/* if this song update is successfull, we are done */
- if(song && isMusic(song->utf8url,&mtime)) {
+ else if(0 == inodeFoundInParent(
+ parentDirectory->parent,
+ parentDirectory->stat->inode,
+ parentDirectory->stat->device) &&
+ song && isMusic(song->utf8url,&mtime))
+ {
free(path);
if(song->mtime==mtime) return 0;
else if(updateSongInfo(song)==0) return 1;
@@ -548,7 +562,17 @@ int updatePath(char * utf8path) {
*/
if(isDir(path) || isMusic(path,NULL)) {
parentDirectory = addParentPathToDB(path,&shortname);
- if(addToDirectory(parentDirectory,shortname,path)>0) ret = 1;
+ if(!parentDirectory->stat && statDirectory(parentDirectory) < 0)
+ {
+ }
+ else if(inodeFoundInParent(parentDirectory->parent,
+ parentDirectory->stat->inode,
+ parentDirectory->stat->device))
+ {
+ }
+ else if(addToDirectory(parentDirectory,shortname,path)>0) {
+ ret = 1;
+ }
}
free(path);
@@ -570,6 +594,18 @@ int updateDirectory(Directory * directory) {
char * dirname = directory->utf8name;
int ret = 0;
+ {
+ if(!directory->stat && statDirectory(directory) < 0) {
+ return -1;
+ }
+ else if(inodeFoundInParent(directory->parent,
+ directory->stat->inode,
+ directory->stat->device))
+ {
+ return -1;
+ }
+ }
+
cwd[0] = '.';
cwd[1] = '\0';
if(dirname==NULL) dirname=cwd;
@@ -672,6 +708,7 @@ int inodeFoundInParent(Directory * parent, ino_t inode, dev_t device) {
if(parent->stat->inode == inode &&
parent->stat->device == device)
{
+ DEBUG("recursive directory found\n");
return 1;
}
parent = parent->parent;
@@ -1265,7 +1302,7 @@ void freeAllDirectoryStats(Directory * directory) {
ListNode * node = directory->subDirectories->firstNode;
while(node != NULL) {
- freeAllDirectoryStats(directory);
+ freeAllDirectoryStats((Directory *)node->data);
node = node->nextNode;
}