diff options
Diffstat (limited to 'src/directory.c')
-rw-r--r-- | src/directory.c | 1239 |
1 files changed, 648 insertions, 591 deletions
diff --git a/src/directory.c b/src/directory.c index 1db1c862a..c30fd23e2 100644 --- a/src/directory.c +++ b/src/directory.c @@ -58,7 +58,7 @@ #define DIRECTORY_RETURN_UPDATE 1 #define DIRECTORY_RETURN_ERROR -1 -Directory * mp3rootDirectory = NULL; +Directory *mp3rootDirectory = NULL; time_t directory_dbModTime = 0; @@ -68,9 +68,9 @@ volatile int directory_reReadDB = 0; volatile mpd_uint16 directory_updateJobId = 0; -static DirectoryList * newDirectoryList(); +static DirectoryList *newDirectoryList(); -static int addToDirectory(Directory * directory, char * shortname, char * name); +static int addToDirectory(Directory * directory, char *shortname, char *name); static void freeDirectoryList(DirectoryList * list); @@ -82,19 +82,19 @@ static int updateDirectory(Directory * directory); static void deleteEmptyDirectoriesInDirectory(Directory * directory); -static void removeSongFromDirectory(Directory * directory, char * shortname); +static void removeSongFromDirectory(Directory * directory, char *shortname); -static int addSubDirectoryToDirectory(Directory * directory, char * shortname, - char * name, struct stat * st); +static int addSubDirectoryToDirectory(Directory * directory, char *shortname, + char *name, struct stat *st); -static Directory * getDirectoryDetails(char * name, char ** shortname); +static Directory *getDirectoryDetails(char *name, char **shortname); -static Directory * getDirectory(char * name); +static Directory *getDirectory(char *name); -static Song * getSongDetails(char * file, char ** shortnameRet, - Directory ** directoryRet); +static Song *getSongDetails(char *file, char **shortnameRet, + Directory ** directoryRet); -static int updatePath(char * utf8path); +static int updatePath(char *utf8path); static void sortDirectory(Directory * directory); @@ -102,8 +102,9 @@ static int inodeFoundInParent(Directory * parent, ino_t inode, dev_t device); static int statDirectory(Directory * dir); -static char * getDbFile() { - ConfigParam * param = parseConfigFilePath(CONF_DB_FILE, 1); +static char *getDbFile() +{ + ConfigParam *param = parseConfigFilePath(CONF_DB_FILE, 1); assert(param); assert(param->value); @@ -111,45 +112,46 @@ static char * getDbFile() { return param->value; } -static void clearUpdatePid() { +static void clearUpdatePid() +{ directory_updatePid = 0; } -int isUpdatingDB() { - if(directory_updatePid>0 || directory_reReadDB) { +int isUpdatingDB() +{ + if (directory_updatePid > 0 || directory_reReadDB) { return directory_updateJobId; } return 0; } -void directory_sigChldHandler(int pid, int status) { - if(directory_updatePid==pid) { - if(WIFSIGNALED(status) && WTERMSIG(status)!=SIGTERM) { - ERROR("update process died from a " - "non-TERM signal: %i\n", - WTERMSIG(status)); - } - else if(!WIFSIGNALED(status)) { - switch(WEXITSTATUS(status)) - { - case DIRECTORY_UPDATE_EXIT_UPDATE: - directory_reReadDB = 1; - DEBUG("directory_sigChldHandler: " - "updated db\n"); - case DIRECTORY_UPDATE_EXIT_NOUPDATE: - DEBUG("directory_sigChldHandler: " - "update exited succesffully\n"); - break; - default: - ERROR("error updating db\n"); - } +void directory_sigChldHandler(int pid, int status) +{ + if (directory_updatePid == pid) { + if (WIFSIGNALED(status) && WTERMSIG(status) != SIGTERM) { + ERROR("update process died from a " + "non-TERM signal: %i\n", WTERMSIG(status)); + } else if (!WIFSIGNALED(status)) { + switch (WEXITSTATUS(status)) { + case DIRECTORY_UPDATE_EXIT_UPDATE: + directory_reReadDB = 1; + DEBUG("directory_sigChldHandler: " + "updated db\n"); + case DIRECTORY_UPDATE_EXIT_NOUPDATE: + DEBUG("directory_sigChldHandler: " + "update exited succesffully\n"); + break; + default: + ERROR("error updating db\n"); + } } clearUpdatePid(); } } -void readDirectoryDBIfUpdateIsFinished() { - if(directory_reReadDB && 0==directory_updatePid) { +void readDirectoryDBIfUpdateIsFinished() +{ + if (directory_reReadDB && 0 == directory_updatePid) { DEBUG("readDirectoryDB since update finished successfully\n"); readDirectoryDB(); playlistVersionChange(); @@ -157,18 +159,19 @@ void readDirectoryDBIfUpdateIsFinished() { } } -int updateInit(FILE * fp, List * pathList) { - if(directory_updatePid > 0) { +int updateInit(FILE * fp, List * pathList) +{ + if (directory_updatePid > 0) { commandError(fp, ACK_ERROR_UPDATE_ALREADY, "already updating", - NULL); + NULL); return -1; } /* need to block CHLD signal, cause it can exit before we - even get a chance to assign directory_updatePID */ - blockSignals(); + even get a chance to assign directory_updatePID */ + blockSignals(); directory_updatePid = fork(); - if(directory_updatePid==0) { + if (directory_updatePid == 0) { /* child */ int dbUpdated = 0; @@ -180,75 +183,81 @@ int updateInit(FILE * fp, List * pathList) { finishPlaylist(); finishVolume(); - if(pathList) { - ListNode * node = pathList->firstNode; + if (pathList) { + ListNode *node = pathList->firstNode; - while(node) { - switch(updatePath(node->key)) { + while (node) { + switch (updatePath(node->key)) { case 1: - dbUpdated = 1; - break; - case 0: - break; - default: - exit(DIRECTORY_UPDATE_EXIT_ERROR); - } + dbUpdated = 1; + break; + case 0: + break; + default: + exit(DIRECTORY_UPDATE_EXIT_ERROR); + } node = node->nextNode; } + } else { + if ((dbUpdated = updateDirectory(mp3rootDirectory)) < 0) { + exit(DIRECTORY_UPDATE_EXIT_ERROR); + } } - else { - if((dbUpdated = updateDirectory(mp3rootDirectory))<0) { - exit(DIRECTORY_UPDATE_EXIT_ERROR); - } - } - if(!dbUpdated) exit(DIRECTORY_UPDATE_EXIT_NOUPDATE); + if (!dbUpdated) + exit(DIRECTORY_UPDATE_EXIT_NOUPDATE); - /* ignore signals since we don't want them to corrupt the db*/ + /* ignore signals since we don't want them to corrupt the db */ ignoreSignals(); - if(writeDirectoryDB()<0) { + if (writeDirectoryDB() < 0) { exit(DIRECTORY_UPDATE_EXIT_ERROR); } exit(DIRECTORY_UPDATE_EXIT_UPDATE); - } - else if(directory_updatePid < 0) { + } else if (directory_updatePid < 0) { unblockSignals(); ERROR("updateInit: Problems forking()'ing\n"); commandError(fp, ACK_ERROR_SYSTEM, - "problems trying to update", NULL); + "problems trying to update", NULL); directory_updatePid = 0; return -1; } unblockSignals(); directory_updateJobId++; - if(directory_updateJobId > 1<<15) directory_updateJobId = 1; + if (directory_updateJobId > 1 << 15) + directory_updateJobId = 1; DEBUG("updateInit: fork()'d update child for update job id %i\n", - (int)directory_updateJobId); - myfprintf(fp,"updating_db: %i\n",(int)directory_updateJobId); + (int)directory_updateJobId); + myfprintf(fp, "updating_db: %i\n", (int)directory_updateJobId); return 0; } -static DirectoryStat * newDirectoryStat(struct stat * st) { - DirectoryStat * ret = malloc(sizeof(DirectoryStat)); +static DirectoryStat *newDirectoryStat(struct stat *st) +{ + DirectoryStat *ret = malloc(sizeof(DirectoryStat)); ret->inode = st->st_ino; ret->device = st->st_dev; return ret; } -static void freeDirectoryStatFromDirectory(Directory * dir) { - if(dir->stat) free(dir->stat); +static void freeDirectoryStatFromDirectory(Directory * dir) +{ + if (dir->stat) + free(dir->stat); dir->stat = NULL; } -static Directory * newDirectory(char * dirname, Directory * parent) { - Directory * directory; +static Directory *newDirectory(char *dirname, Directory * parent) +{ + Directory *directory; directory = malloc(sizeof(Directory)); - if(dirname && strlen(dirname)) directory->path = strdup(dirname); - else directory->path = NULL; + if (dirname && strlen(dirname)) + directory->path = strdup(dirname); + else + directory->path = NULL; directory->subDirectories = newDirectoryList(); directory->songs = newSongList(); directory->stat = NULL; @@ -257,46 +266,51 @@ static Directory * newDirectory(char * dirname, Directory * parent) { return directory; } -static void freeDirectory(Directory * directory) { +static void freeDirectory(Directory * directory) +{ freeDirectoryList(directory->subDirectories); freeSongList(directory->songs); - if(directory->path) free(directory->path); + if (directory->path) + free(directory->path); freeDirectoryStatFromDirectory(directory); free(directory); /* this resets last dir returned */ - /*getDirectoryPath(NULL);*/ + /*getDirectoryPath(NULL); */ } -static DirectoryList * newDirectoryList() { - return makeList((ListFreeDataFunc *)freeDirectory, 1); +static DirectoryList *newDirectoryList() +{ + return makeList((ListFreeDataFunc *) freeDirectory, 1); } -static void freeDirectoryList(DirectoryList * directoryList) { +static void freeDirectoryList(DirectoryList * directoryList) +{ freeList(directoryList); } -static void removeSongFromDirectory(Directory * directory, char * shortname) { - void * song; - - if(findInList(directory->songs,shortname,&song)) { - LOG("removing: %s\n", getSongUrl((Song *)song)); +static void removeSongFromDirectory(Directory * directory, char *shortname) +{ + void *song; + + if (findInList(directory->songs, shortname, &song)) { + LOG("removing: %s\n", getSongUrl((Song *) song)); deleteFromList(directory->songs, shortname); } } -static void deleteEmptyDirectoriesInDirectory(Directory * directory) { - ListNode * node = directory->subDirectories->firstNode; - ListNode * nextNode; - Directory * subDir; +static void deleteEmptyDirectoriesInDirectory(Directory * directory) +{ + ListNode *node = directory->subDirectories->firstNode; + ListNode *nextNode; + Directory *subDir; - while(node) { - subDir = (Directory *)node->data; + while (node) { + subDir = (Directory *) node->data; deleteEmptyDirectoriesInDirectory(subDir); nextNode = node->nextNode; - if(subDir->subDirectories->numberOfNodes==0 && - subDir->songs->numberOfNodes==0) - { - deleteNodeFromList(directory->subDirectories,node); + if (subDir->subDirectories->numberOfNodes == 0 && + subDir->songs->numberOfNodes == 0) { + deleteNodeFromList(directory->subDirectories, node); } node = nextNode; } @@ -307,36 +321,36 @@ static void deleteEmptyDirectoriesInDirectory(Directory * directory) { 0 -> no error, but nothing updated 1 -> no error, and stuff updated */ -static int updateInDirectory(Directory * directory, char * shortname, char * name) { - void * song; - void * subDir; +static int updateInDirectory(Directory * directory, char *shortname, char *name) +{ + void *song; + void *subDir; struct stat st; - if(myStat(name, &st)) return -1; + if (myStat(name, &st)) + return -1; - if(S_ISREG(st.st_mode) && hasMusicSuffix(name, 0)) { - if(0==findInList(directory->songs,shortname,&song)) { + if (S_ISREG(st.st_mode) && hasMusicSuffix(name, 0)) { + if (0 == findInList(directory->songs, shortname, &song)) { addToDirectory(directory, shortname, name); - return DIRECTORY_RETURN_UPDATE; - } - else if(st.st_mtime!=((Song *)song)->mtime) { - LOG("updating %s\n",name); - if(updateSongInfo((Song *)song)<0) { - removeSongFromDirectory(directory,shortname); + return DIRECTORY_RETURN_UPDATE; + } else if (st.st_mtime != ((Song *) song)->mtime) { + LOG("updating %s\n", name); + if (updateSongInfo((Song *) song) < 0) { + removeSongFromDirectory(directory, shortname); } - return 1; + return 1; } - } - else if(S_ISDIR(st.st_mode)) { - if(findInList(directory->subDirectories,shortname,(void **)&subDir)) { + } else if (S_ISDIR(st.st_mode)) { + if (findInList + (directory->subDirectories, shortname, (void **)&subDir)) { freeDirectoryStatFromDirectory(subDir); - ((Directory *)subDir)->stat = newDirectoryStat(&st); - return updateDirectory((Directory *)subDir); + ((Directory *) subDir)->stat = newDirectoryStat(&st); + return updateDirectory((Directory *) subDir); + } else { + return addSubDirectoryToDirectory(directory, shortname, + name, &st); } - else { - return addSubDirectoryToDirectory(directory,shortname, - name, &st); - } } return 0; @@ -347,71 +361,74 @@ static int updateInDirectory(Directory * directory, char * shortname, char * nam 0 -> no error, but nothing removed 1 -> no error, and stuff removed */ -static int removeDeletedFromDirectory(Directory * directory, DIR * dir) { +static int removeDeletedFromDirectory(Directory * directory, DIR * dir) +{ char cwd[2]; - struct dirent * ent; - char * dirname = getDirectoryPath(directory); - List * entList = makeList(free, 1); - void * name; - char * s; - char * utf8; - ListNode * node; - ListNode * tmpNode; - int ret = 0; + struct dirent *ent; + char *dirname = getDirectoryPath(directory); + List *entList = makeList(free, 1); + void *name; + char *s; + char *utf8; + ListNode *node; + ListNode *tmpNode; + int ret = 0; cwd[0] = '.'; cwd[1] = '\0'; - if(dirname==NULL) dirname=cwd; + if (dirname == NULL) + dirname = cwd; - while((ent = readdir(dir))) { - if(ent->d_name[0]=='.') continue; /* hide hidden stuff */ - if(strchr(ent->d_name, '\n')) continue; + while ((ent = readdir(dir))) { + if (ent->d_name[0] == '.') + continue; /* hide hidden stuff */ + if (strchr(ent->d_name, '\n')) + continue; utf8 = fsCharsetToUtf8(ent->d_name); - if(!utf8) continue; + if (!utf8) + continue; - if(directory->path) { + if (directory->path) { s = malloc(strlen(getDirectoryPath(directory)) - +strlen(utf8)+2); - sprintf(s,"%s/%s", getDirectoryPath(directory), utf8); - } - else s= strdup(utf8); + + strlen(utf8) + 2); + sprintf(s, "%s/%s", getDirectoryPath(directory), utf8); + } else + s = strdup(utf8); insertInList(entList, utf8, s); } node = directory->subDirectories->firstNode; - while(node) { + while (node) { tmpNode = node->nextNode; - if(findInList(entList,node->key,&name)) { - if(!isDir((char *)name)) { - LOG("removing directory: %s\n",(char*)name); + if (findInList(entList, node->key, &name)) { + if (!isDir((char *)name)) { + LOG("removing directory: %s\n", (char *)name); deleteFromList(directory->subDirectories, - node->key); - ret = 1; + node->key); + ret = 1; } - } - else { + } else { LOG("removing directory: %s/%s\n", - getDirectoryPath(directory), node->key); + getDirectoryPath(directory), node->key); deleteFromList(directory->subDirectories, node->key); - ret = 1; + ret = 1; } node = tmpNode; } node = directory->songs->firstNode; - while(node) { + while (node) { tmpNode = node->nextNode; - if(findInList(entList,node->key,(void **)&name)) { - if(!isMusic(name,NULL,0)) { - removeSongFromDirectory(directory,node->key); - ret = 1; + if (findInList(entList, node->key, (void **)&name)) { + if (!isMusic(name, NULL, 0)) { + removeSongFromDirectory(directory, node->key); + ret = 1; } - } - else { - removeSongFromDirectory(directory,node->key); - ret = 1; + } else { + removeSongFromDirectory(directory, node->key); + ret = 1; } node = tmpNode; } @@ -421,71 +438,75 @@ static int removeDeletedFromDirectory(Directory * directory, DIR * dir) { return ret; } -static Directory * addDirectoryPathToDB(char * utf8path, char ** shortname) { - char * parent; - Directory * parentDirectory; - void * directory; +static Directory *addDirectoryPathToDB(char *utf8path, char **shortname) +{ + char *parent; + Directory *parentDirectory; + void *directory; parent = strdup(parentPath(utf8path)); - if(strlen(parent)==0) parentDirectory = (void *)mp3rootDirectory; - else parentDirectory = addDirectoryPathToDB(parent,shortname); + if (strlen(parent) == 0) + parentDirectory = (void *)mp3rootDirectory; + else + parentDirectory = addDirectoryPathToDB(parent, shortname); - if(!parentDirectory) { + if (!parentDirectory) { free(parent); return NULL; } - *shortname = utf8path+strlen(parent); - while(*(*shortname) && *(*shortname)=='/') (*shortname)++; + *shortname = utf8path + strlen(parent); + while (*(*shortname) && *(*shortname) == '/') + (*shortname)++; - if(!findInList(parentDirectory->subDirectories,*shortname, &directory)) - { + if (!findInList + (parentDirectory->subDirectories, *shortname, &directory)) { struct stat st; - if(myStat(utf8path, &st) < 0 || - inodeFoundInParent(parentDirectory, - st.st_ino, st.st_dev)) - { + if (myStat(utf8path, &st) < 0 || + inodeFoundInParent(parentDirectory, st.st_ino, st.st_dev)) { free(parent); return NULL; - } - else { - directory = newDirectory(utf8path, parentDirectory); - insertInList(parentDirectory->subDirectories, - *shortname, - directory); + } else { + directory = newDirectory(utf8path, parentDirectory); + insertInList(parentDirectory->subDirectories, + *shortname, directory); } } /* if we're adding directory paths, make sure to delete filenames - with potentially the same name*/ - removeSongFromDirectory(parentDirectory,*shortname); + with potentially the same name */ + removeSongFromDirectory(parentDirectory, *shortname); free(parent); - return (Directory *)directory; + return (Directory *) directory; } -static Directory * addParentPathToDB(char * utf8path, char ** shortname) { - char * parent; - Directory * parentDirectory; +static Directory *addParentPathToDB(char *utf8path, char **shortname) +{ + char *parent; + Directory *parentDirectory; parent = strdup(parentPath(utf8path)); - if(strlen(parent)==0) parentDirectory = (void *)mp3rootDirectory; - else parentDirectory = addDirectoryPathToDB(parent,shortname); + if (strlen(parent) == 0) + parentDirectory = (void *)mp3rootDirectory; + else + parentDirectory = addDirectoryPathToDB(parent, shortname); - if(!parentDirectory) { + if (!parentDirectory) { free(parent); return NULL; } - *shortname = utf8path+strlen(parent); - while(*(*shortname) && *(*shortname)=='/') (*shortname)++; + *shortname = utf8path + strlen(parent); + while (*(*shortname) && *(*shortname) == '/') + (*shortname)++; free(parent); - return (Directory *)parentDirectory; + return (Directory *) parentDirectory; } /* return values: @@ -493,96 +514,93 @@ static Directory * addParentPathToDB(char * utf8path, char ** shortname) { 0 -> no error, but nothing updated 1 -> no error, and stuff updated */ -static int updatePath(char * utf8path) { - Directory * directory; - Directory * parentDirectory; - Song * song; - char * shortname; - char * path = sanitizePathDup(utf8path); - time_t mtime; - int ret = 0; - - if(NULL==path) return -1; +static int updatePath(char *utf8path) +{ + Directory *directory; + Directory *parentDirectory; + Song *song; + char *shortname; + char *path = sanitizePathDup(utf8path); + time_t mtime; + int ret = 0; + + if (NULL == path) + return -1; /* if path is in the DB try to update it, or else delete it */ - if((directory = getDirectoryDetails(path,&shortname))) { + if ((directory = getDirectoryDetails(path, &shortname))) { parentDirectory = directory->parent; /* if this update directory is successfull, we are done */ - if((ret = updateDirectory(directory))>=0) - { + if ((ret = updateDirectory(directory)) >= 0) { free(path); sortDirectory(directory); return ret; } /* we don't want to delete the root directory */ - else if(directory == mp3rootDirectory) { + else if (directory == mp3rootDirectory) { free(path); return 0; } /* if updateDirectory fials, means we should delete it */ else { - LOG("removing directory: %s\n",path); + LOG("removing directory: %s\n", path); deleteFromList(parentDirectory->subDirectories, - shortname); - ret = 1; - /* don't return, path maybe a song now*/ + shortname); + ret = 1; + /* don't return, path maybe a song now */ } - } - else if((song = getSongDetails(path,&shortname,&parentDirectory))) { - if(!parentDirectory->stat && statDirectory(parentDirectory) < 0) - { + } 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 */ - else if(0 == inodeFoundInParent( - parentDirectory->parent, - parentDirectory->stat->inode, - parentDirectory->stat->device) && - song && isMusic(getSongUrl(song), &mtime, 0)) - { + else if (0 == inodeFoundInParent(parentDirectory->parent, + parentDirectory->stat->inode, + parentDirectory->stat->device) + && song && isMusic(getSongUrl(song), &mtime, 0)) { free(path); - if(song->mtime==mtime) return 0; - else if(updateSongInfo(song)==0) return 1; - else { - removeSongFromDirectory(parentDirectory, - shortname); - return 1; - } + if (song->mtime == mtime) + return 0; + else if (updateSongInfo(song) == 0) + return 1; + else { + removeSongFromDirectory(parentDirectory, + shortname); + return 1; + } } /* if updateDirectory fials, means we should delete it */ else { - removeSongFromDirectory(parentDirectory, shortname); - ret = 1; - /* don't return, path maybe a directory now*/ - } + removeSongFromDirectory(parentDirectory, shortname); + ret = 1; + /* don't return, path maybe a directory now */ + } } /* path not found in the db, see if it actually exists on the fs. * Also, if by chance a directory was replaced by a file of the same - * name or vice versa, we need to add it to the db - */ - if(isDir(path) || isMusic(path,NULL,0)) { - parentDirectory = addParentPathToDB(path,&shortname); - if(!parentDirectory || ( - !parentDirectory->stat && - statDirectory(parentDirectory) < 0)) - { - } - else if(0 == inodeFoundInParent(parentDirectory->parent, - parentDirectory->stat->inode, - parentDirectory->stat->device) && - addToDirectory(parentDirectory, shortname, path) - >0) - { + * name or vice versa, we need to add it to the db + */ + if (isDir(path) || isMusic(path, NULL, 0)) { + parentDirectory = addParentPathToDB(path, &shortname); + if (!parentDirectory || (!parentDirectory->stat && + statDirectory(parentDirectory) < 0)) { + } else if (0 == inodeFoundInParent(parentDirectory->parent, + parentDirectory->stat->inode, + parentDirectory->stat-> + device) + && addToDirectory(parentDirectory, shortname, path) + > 0) { ret = 1; } } free(path); - return ret; + return ret; } /* return values: @@ -590,58 +608,64 @@ static int updatePath(char * utf8path) { 0 -> no error, but nothing updated 1 -> no error, and stuff updated */ -static int updateDirectory(Directory * directory) { - DIR * dir; +static int updateDirectory(Directory * directory) +{ + DIR *dir; char cwd[2]; - struct dirent * ent; - char * s; - char * utf8; - char * dirname = getDirectoryPath(directory); - int ret = 0; + struct dirent *ent; + char *s; + char *utf8; + char *dirname = getDirectoryPath(directory); + int ret = 0; { - if(!directory->stat && statDirectory(directory) < 0) { + if (!directory->stat && statDirectory(directory) < 0) { return -1; - } - else if(inodeFoundInParent(directory->parent, - directory->stat->inode, - directory->stat->device)) - { + } else if (inodeFoundInParent(directory->parent, + directory->stat->inode, + directory->stat->device)) { return -1; } } cwd[0] = '.'; cwd[1] = '\0'; - if(dirname==NULL) dirname=cwd; + if (dirname == NULL) + dirname = cwd; - if((dir = opendir(rmp2amp(utf8ToFsCharset(dirname))))==NULL) return -1; + if ((dir = opendir(rmp2amp(utf8ToFsCharset(dirname)))) == NULL) + return -1; - if(removeDeletedFromDirectory(directory, dir)>0) ret = 1; + if (removeDeletedFromDirectory(directory, dir) > 0) + ret = 1; rewinddir(dir); - while((ent = readdir(dir))) { - if(ent->d_name[0]=='.') continue; /* hide hidden stuff */ - if(strchr(ent->d_name, '\n')) continue; + while ((ent = readdir(dir))) { + if (ent->d_name[0] == '.') + continue; /* hide hidden stuff */ + if (strchr(ent->d_name, '\n')) + continue; utf8 = fsCharsetToUtf8(ent->d_name); - if(!utf8) continue; + if (!utf8) + continue; utf8 = strdup(utf8); - if(directory->path) { - s = malloc(strlen(getDirectoryPath(directory))+ - strlen(utf8)+2); - sprintf(s,"%s/%s", getDirectoryPath(directory), utf8); - } - else s = strdup(utf8); - if(updateInDirectory(directory,utf8,s)>0) ret = 1; + if (directory->path) { + s = malloc(strlen(getDirectoryPath(directory)) + + strlen(utf8) + 2); + sprintf(s, "%s/%s", getDirectoryPath(directory), utf8); + } else + s = strdup(utf8); + if (updateInDirectory(directory, utf8, s) > 0) + ret = 1; free(utf8); free(s); } - + closedir(dir); return ret; @@ -652,55 +676,63 @@ static int updateDirectory(Directory * directory) { 0 -> no error, but nothing found 1 -> no error, and stuff found */ -static int exploreDirectory(Directory * directory) { - DIR * dir; +static int exploreDirectory(Directory * directory) +{ + DIR *dir; char cwd[2]; - struct dirent * ent; - char * s; - char * utf8; - char * dirname = getDirectoryPath(directory); - int ret = 0; + struct dirent *ent; + char *s; + char *utf8; + char *dirname = getDirectoryPath(directory); + int ret = 0; cwd[0] = '.'; cwd[1] = '\0'; - if(dirname==NULL) dirname=cwd; + if (dirname == NULL) + dirname = cwd; - DEBUG("explore: attempting to opendir: %s\n",dirname); - if((dir = opendir(rmp2amp(utf8ToFsCharset(dirname))))==NULL) return -1; + DEBUG("explore: attempting to opendir: %s\n", dirname); + if ((dir = opendir(rmp2amp(utf8ToFsCharset(dirname)))) == NULL) + return -1; - DEBUG("explore: %s\n",dirname); - while((ent = readdir(dir))) { - if(ent->d_name[0]=='.') continue; /* hide hidden stuff */ - if(strchr(ent->d_name, '\n')) continue; + DEBUG("explore: %s\n", dirname); + while ((ent = readdir(dir))) { + if (ent->d_name[0] == '.') + continue; /* hide hidden stuff */ + if (strchr(ent->d_name, '\n')) + continue; utf8 = fsCharsetToUtf8(ent->d_name); - if(!utf8) continue; + if (!utf8) + continue; utf8 = strdup(utf8); - DEBUG("explore: found: %s (%s)\n",ent->d_name,utf8); + DEBUG("explore: found: %s (%s)\n", ent->d_name, utf8); - if(directory->path) { - s = malloc(strlen(getDirectoryPath(directory))+ - strlen(utf8)+2); - sprintf(s,"%s/%s", getDirectoryPath(directory) ,utf8); - } - else s = strdup(utf8); - if(addToDirectory(directory,utf8,s)>0) ret = 1; + if (directory->path) { + s = malloc(strlen(getDirectoryPath(directory)) + + strlen(utf8) + 2); + sprintf(s, "%s/%s", getDirectoryPath(directory), utf8); + } else + s = strdup(utf8); + if (addToDirectory(directory, utf8, s) > 0) + ret = 1; free(utf8); free(s); } - + closedir(dir); return ret; } -static int statDirectory(Directory * dir) { +static int statDirectory(Directory * dir) +{ struct stat st; - if(myStat(getDirectoryPath(dir) ? getDirectoryPath(dir) : "", &st) < 0) { + if (myStat(getDirectoryPath(dir) ? getDirectoryPath(dir) : "", &st) < 0) { return -1; } @@ -709,14 +741,15 @@ static int statDirectory(Directory * dir) { return 0; } -static int inodeFoundInParent(Directory * parent, ino_t inode, dev_t device) { - while(parent) { - if(!parent->stat) { - if(statDirectory(parent) < 0) return -1; +static int inodeFoundInParent(Directory * parent, ino_t inode, dev_t device) +{ + while (parent) { + if (!parent->stat) { + if (statDirectory(parent) < 0) + return -1; } - if(parent->stat->inode == inode && - parent->stat->device == device) - { + if (parent->stat->inode == inode && + parent->stat->device == device) { DEBUG("recursive directory found\n"); return 1; } @@ -726,263 +759,273 @@ static int inodeFoundInParent(Directory * parent, ino_t inode, dev_t device) { return 0; } -static int addSubDirectoryToDirectory(Directory * directory, char * shortname, - char * name, struct stat * st) +static int addSubDirectoryToDirectory(Directory * directory, char *shortname, + char *name, struct stat *st) { - Directory * subDirectory; + Directory *subDirectory; - if(inodeFoundInParent(directory, st->st_ino, st->st_dev)) return 0; + if (inodeFoundInParent(directory, st->st_ino, st->st_dev)) + return 0; subDirectory = newDirectory(name, directory); subDirectory->stat = newDirectoryStat(st); - - if(exploreDirectory(subDirectory)<1) { - freeDirectory(subDirectory); - return 0; - } - insertInList(directory->subDirectories, shortname, - subDirectory); + if (exploreDirectory(subDirectory) < 1) { + freeDirectory(subDirectory); + return 0; + } + + insertInList(directory->subDirectories, shortname, subDirectory); return 1; } -static int addToDirectory(Directory * directory, char * shortname, char * name) { +static int addToDirectory(Directory * directory, char *shortname, char *name) +{ struct stat st; - if(myStat(name, &st)) { + if (myStat(name, &st)) { DEBUG("failed to stat %s: %s\n", name, strerror(errno)); return -1; } - if(S_ISREG(st.st_mode) && hasMusicSuffix(name, 0)) { - Song * song; + if (S_ISREG(st.st_mode) && hasMusicSuffix(name, 0)) { + Song *song; song = addSongToList(directory->songs, shortname, name, - SONG_TYPE_FILE, directory); - if(!song) return -1; + SONG_TYPE_FILE, directory); + if (!song) + return -1; LOG("added %s\n", name); return 1; - } - else if(S_ISDIR(st.st_mode)) { + } else if (S_ISDIR(st.st_mode)) { return addSubDirectoryToDirectory(directory, shortname, name, - &st); + &st); } - DEBUG("addToDirectory: %s is not a directory or music\n",name); + DEBUG("addToDirectory: %s is not a directory or music\n", name); return -1; } -void closeMp3Directory() { +void closeMp3Directory() +{ freeDirectory(mp3rootDirectory); } -static Directory * findSubDirectory(Directory * directory,char * name) { - void * subDirectory; - char * dup = strdup(name); - char * key; +static Directory *findSubDirectory(Directory * directory, char *name) +{ + void *subDirectory; + char *dup = strdup(name); + char *key; - key = strtok(dup,"/"); - if(!key) { + key = strtok(dup, "/"); + if (!key) { free(dup); return NULL; } - - if(findInList(directory->subDirectories,key,&subDirectory)) { + + if (findInList(directory->subDirectories, key, &subDirectory)) { free(dup); - return (Directory *)subDirectory; + return (Directory *) subDirectory; } free(dup); return NULL; } -static Directory * getSubDirectory(Directory * directory, char * name, - char ** shortname) +static Directory *getSubDirectory(Directory * directory, char *name, + char **shortname) { - Directory * subDirectory; + Directory *subDirectory; int len; - if(name==NULL || name[0]=='\0' || strcmp(name,"/")==0) { + if (name == NULL || name[0] == '\0' || strcmp(name, "/") == 0) { return directory; } - if((subDirectory = findSubDirectory(directory,name))==NULL) return NULL; + if ((subDirectory = findSubDirectory(directory, name)) == NULL) + return NULL; *shortname = name; len = 0; - while(name[len]!='/' && name[len]!='\0') len++; - while(name[len]=='/') len++; + while (name[len] != '/' && name[len] != '\0') + len++; + while (name[len] == '/') + len++; - return getSubDirectory(subDirectory,&(name[len]),shortname); + return getSubDirectory(subDirectory, &(name[len]), shortname); } -static Directory * getDirectoryDetails(char * name, char ** shortname) { +static Directory *getDirectoryDetails(char *name, char **shortname) +{ *shortname = NULL; - return getSubDirectory(mp3rootDirectory,name,shortname); + return getSubDirectory(mp3rootDirectory, name, shortname); } -static Directory * getDirectory(char * name) { - char * shortname; +static Directory *getDirectory(char *name) +{ + char *shortname; - return getSubDirectory(mp3rootDirectory,name,&shortname); + return getSubDirectory(mp3rootDirectory, name, &shortname); } -static int printDirectoryList(FILE * fp, DirectoryList * directoryList) { - ListNode * node = directoryList->firstNode; - Directory * directory; +static int printDirectoryList(FILE * fp, DirectoryList * directoryList) +{ + ListNode *node = directoryList->firstNode; + Directory *directory; - while(node!=NULL) { - directory = (Directory *)node->data; - myfprintf(fp,"%s%s\n", DIRECTORY_DIR, - getDirectoryPath(directory)); + while (node != NULL) { + directory = (Directory *) node->data; + myfprintf(fp, "%s%s\n", DIRECTORY_DIR, + getDirectoryPath(directory)); node = node->nextNode; } return 0; } -int printDirectoryInfo(FILE * fp, char * name) { - Directory * directory; - - if((directory = getDirectory(name))==NULL) { +int printDirectoryInfo(FILE * fp, char *name) +{ + Directory *directory; + + if ((directory = getDirectory(name)) == NULL) { commandError(fp, ACK_ERROR_NO_EXIST, "directory not found", - NULL); + NULL); return -1; } - printDirectoryList(fp,directory->subDirectories); - printSongInfoFromList(fp,directory->songs); + printDirectoryList(fp, directory->subDirectories); + printSongInfoFromList(fp, directory->songs); return 0; } -static void writeDirectoryInfo(FILE * fp, Directory * directory) { - ListNode * node = (directory->subDirectories)->firstNode; - Directory * subDirectory; +static void writeDirectoryInfo(FILE * fp, Directory * directory) +{ + ListNode *node = (directory->subDirectories)->firstNode; + Directory *subDirectory; - if(directory->path) { - myfprintf(fp,"%s%s\n", DIRECTORY_BEGIN, - getDirectoryPath(directory)); + if (directory->path) { + myfprintf(fp, "%s%s\n", DIRECTORY_BEGIN, + getDirectoryPath(directory)); } - - while(node!=NULL) { - subDirectory = (Directory *)node->data; - myfprintf(fp,"%s%s\n",DIRECTORY_DIR,node->key); - writeDirectoryInfo(fp,subDirectory); + + while (node != NULL) { + subDirectory = (Directory *) node->data; + myfprintf(fp, "%s%s\n", DIRECTORY_DIR, node->key); + writeDirectoryInfo(fp, subDirectory); node = node->nextNode; } - writeSongInfoFromList(fp,directory->songs); + writeSongInfoFromList(fp, directory->songs); - if(directory->path) { - myfprintf(fp,"%s%s\n", DIRECTORY_END, - getDirectoryPath(directory)); + if (directory->path) { + myfprintf(fp, "%s%s\n", DIRECTORY_END, + getDirectoryPath(directory)); } } -static void readDirectoryInfo(FILE * fp,Directory * directory) { - char buffer[MAXPATHLEN*2]; - int bufferSize = MAXPATHLEN*2; - char * key; - Directory * subDirectory; +static void readDirectoryInfo(FILE * fp, Directory * directory) +{ + char buffer[MAXPATHLEN * 2]; + int bufferSize = MAXPATHLEN * 2; + char *key; + Directory *subDirectory; int strcmpRet; - char * name; - ListNode * nextDirNode = directory->subDirectories->firstNode; - ListNode * nodeTemp; + char *name; + ListNode *nextDirNode = directory->subDirectories->firstNode; + ListNode *nodeTemp; - while(myFgets(buffer,bufferSize,fp) && 0!=strncmp(DIRECTORY_END,buffer,strlen(DIRECTORY_END))) { - if(0==strncmp(DIRECTORY_DIR,buffer,strlen(DIRECTORY_DIR))) { + while (myFgets(buffer, bufferSize, fp) + && 0 != strncmp(DIRECTORY_END, buffer, strlen(DIRECTORY_END))) { + if (0 == strncmp(DIRECTORY_DIR, buffer, strlen(DIRECTORY_DIR))) { key = strdup(&(buffer[strlen(DIRECTORY_DIR)])); - if(myFgets(buffer,bufferSize,fp)<0) { - ERROR("Error reading db, fgets\n"); + if (myFgets(buffer, bufferSize, fp) < 0) { + ERROR("Error reading db, fgets\n"); exit(EXIT_FAILURE); } - /* for compatibility with db's prior to 0.11 */ - if(0==strncmp(DIRECTORY_MTIME,buffer, - strlen(DIRECTORY_MTIME))) - { - if(myFgets(buffer,bufferSize,fp)<0) { - ERROR("Error reading db, fgets\n"); - exit(EXIT_FAILURE); - } - } - if(strncmp(DIRECTORY_BEGIN,buffer,strlen(DIRECTORY_BEGIN))) { - ERROR("Error reading db at line: %s\n",buffer); + /* for compatibility with db's prior to 0.11 */ + if (0 == strncmp(DIRECTORY_MTIME, buffer, + strlen(DIRECTORY_MTIME))) { + if (myFgets(buffer, bufferSize, fp) < 0) { + ERROR("Error reading db, fgets\n"); + exit(EXIT_FAILURE); + } + } + if (strncmp + (DIRECTORY_BEGIN, buffer, + strlen(DIRECTORY_BEGIN))) { + ERROR("Error reading db at line: %s\n", buffer); exit(EXIT_FAILURE); } name = strdup(&(buffer[strlen(DIRECTORY_BEGIN)])); - while(nextDirNode && (strcmpRet = - strcmp(key,nextDirNode->key)) > 0) { + while (nextDirNode && (strcmpRet = + strcmp(key, + nextDirNode->key)) > 0) { nodeTemp = nextDirNode->nextNode; deleteNodeFromList(directory->subDirectories, - nextDirNode); + nextDirNode); nextDirNode = nodeTemp; } - if(NULL==nextDirNode) { + if (NULL == nextDirNode) { subDirectory = newDirectory(name, directory); insertInList(directory->subDirectories, - key, - (void *)subDirectory); - } - else if(strcmpRet == 0) { - subDirectory = (Directory *)nextDirNode->data; + key, (void *)subDirectory); + } else if (strcmpRet == 0) { + subDirectory = (Directory *) nextDirNode->data; nextDirNode = nextDirNode->nextNode; - } - else { + } else { subDirectory = newDirectory(name, directory); - insertInListBeforeNode( - directory->subDirectories, - nextDirNode, - -1, - key, - (void *)subDirectory); + insertInListBeforeNode(directory-> + subDirectories, + nextDirNode, -1, key, + (void *)subDirectory); } free(name); free(key); - readDirectoryInfo(fp,subDirectory); - } - else if(0==strncmp(SONG_BEGIN,buffer,strlen(SONG_BEGIN))) { + readDirectoryInfo(fp, subDirectory); + } else if (0 == strncmp(SONG_BEGIN, buffer, strlen(SONG_BEGIN))) { readSongInfoIntoList(fp, directory->songs, directory); - } - else { - ERROR("Unknown line in db: %s\n",buffer); + } else { + ERROR("Unknown line in db: %s\n", buffer); exit(EXIT_FAILURE); } } - while(nextDirNode) { + while (nextDirNode) { nodeTemp = nextDirNode->nextNode; - deleteNodeFromList(directory->subDirectories,nextDirNode); + deleteNodeFromList(directory->subDirectories, nextDirNode); nextDirNode = nodeTemp; } } -static void sortDirectory(Directory * directory) { - ListNode * node = directory->subDirectories->firstNode; - Directory * subDir; - +static void sortDirectory(Directory * directory) +{ + ListNode *node = directory->subDirectories->firstNode; + Directory *subDir; + sortList(directory->subDirectories); sortList(directory->songs); - while(node!=NULL) { - subDir = (Directory *)node->data; + while (node != NULL) { + subDir = (Directory *) node->data; sortDirectory(subDir); node = node->nextNode; } } -int checkDirectoryDB() { - char * dbFile = getDbFile(); +int checkDirectoryDB() +{ + char *dbFile = getDbFile(); /** * Check if the file exists */ - if(access(dbFile, F_OK)) { + if (access(dbFile, F_OK)) { char *dirPath = NULL; char *dbPath = strdup(dbFile); @@ -991,13 +1034,13 @@ int checkDirectoryDB() { * so we are going to try to get the directory path, and see if we can write a file in that */ dirPath = dirname(dbPath); - + /** * Check if we can write to the directory */ - if(access(dirPath, R_OK|W_OK)) - { - ERROR("Can't create db file in \"%s\": %s", dirPath, strerror(errno)); + if (access(dirPath, R_OK | W_OK)) { + ERROR("Can't create db file in \"%s\": %s", dirPath, + strerror(errno)); free(dbPath); return -1; @@ -1009,18 +1052,19 @@ int checkDirectoryDB() { /** * File exists, now check if we can write it */ - if(access(dbFile, R_OK|W_OK)) { + if (access(dbFile, R_OK | W_OK)) { ERROR("db file \"%s\" cannot be opened for reading/writing: %s", - dbFile, strerror(errno)); + dbFile, strerror(errno)); return -1; } - + return 0; } -int writeDirectoryDB() { - FILE * fp; - char * dbFile = getDbFile(); +int writeDirectoryDB() +{ + FILE *fp; + char *dbFile = getDbFile(); DEBUG("removing empty directories from DB\n"); deleteEmptyDirectoriesInDirectory(mp3rootDirectory); @@ -1031,36 +1075,38 @@ int writeDirectoryDB() { DEBUG("writing DB\n"); - while(!(fp=fopen(dbFile,"w")) && errno==EINTR); - if(!fp) { + while (!(fp = fopen(dbFile, "w")) && errno == EINTR) ; + if (!fp) { ERROR("unable to write to db file \"%s\": %s\n", - dbFile, strerror(errno)); + dbFile, strerror(errno)); return -1; } - /* block signals when writing the db so we don't get a corrupted db*/ - myfprintf(fp,"%s\n",DIRECTORY_INFO_BEGIN); - myfprintf(fp,"%s%s\n",DIRECTORY_MPD_VERSION,VERSION); - myfprintf(fp,"%s%s\n",DIRECTORY_FS_CHARSET,getFsCharset()); - myfprintf(fp,"%s\n",DIRECTORY_INFO_END); + /* block signals when writing the db so we don't get a corrupted db */ + myfprintf(fp, "%s\n", DIRECTORY_INFO_BEGIN); + myfprintf(fp, "%s%s\n", DIRECTORY_MPD_VERSION, VERSION); + myfprintf(fp, "%s%s\n", DIRECTORY_FS_CHARSET, getFsCharset()); + myfprintf(fp, "%s\n", DIRECTORY_INFO_END); - writeDirectoryInfo(fp,mp3rootDirectory); + writeDirectoryInfo(fp, mp3rootDirectory); - while(fclose(fp) && errno==EINTR); + while (fclose(fp) && errno == EINTR) ; return 0; } -int readDirectoryDB() { - FILE * fp = NULL; - char * dbFile = getDbFile(); - struct stat st; +int readDirectoryDB() +{ + FILE *fp = NULL; + char *dbFile = getDbFile(); + struct stat st; - if(!mp3rootDirectory) mp3rootDirectory = newDirectory(NULL, NULL); - while(!(fp=fopen(dbFile,"r")) && errno==EINTR); - if(fp == NULL) { - ERROR("unable open db file \"%s\": %s\n", - dbFile, strerror(errno)); + if (!mp3rootDirectory) + mp3rootDirectory = newDirectory(NULL, NULL); + while (!(fp = fopen(dbFile, "r")) && errno == EINTR) ; + if (fp == NULL) { + ERROR("unable open db file \"%s\": %s\n", + dbFile, strerror(errno)); return -1; } @@ -1071,31 +1117,30 @@ int readDirectoryDB() { int foundFsCharset = 0; int foundVersion = 0; - if(myFgets(buffer,bufferSize,fp)<0) { + if (myFgets(buffer, bufferSize, fp) < 0) { ERROR("Error reading db, fgets\n"); exit(EXIT_FAILURE); } - if(0==strcmp(DIRECTORY_INFO_BEGIN,buffer)) { - while(myFgets(buffer,bufferSize,fp) && - 0!=strcmp(DIRECTORY_INFO_END,buffer)) - { - if(0==strncmp(DIRECTORY_MPD_VERSION,buffer, - strlen(DIRECTORY_MPD_VERSION))) + if (0 == strcmp(DIRECTORY_INFO_BEGIN, buffer)) { + while (myFgets(buffer, bufferSize, fp) && + 0 != strcmp(DIRECTORY_INFO_END, buffer)) { + if (0 == strncmp(DIRECTORY_MPD_VERSION, buffer, + strlen(DIRECTORY_MPD_VERSION))) { - if(foundVersion) { + if (foundVersion) { ERROR("already found " - "version in db\n"); + "version in db\n"); exit(EXIT_FAILURE); } foundVersion = 1; - } - else if(0==strncmp(DIRECTORY_FS_CHARSET,buffer, - strlen(DIRECTORY_FS_CHARSET))) - { - char * fsCharset; - char * tempCharset; - - if(foundFsCharset) { + } else if (0 == + strncmp(DIRECTORY_FS_CHARSET, buffer, + strlen + (DIRECTORY_FS_CHARSET))) { + char *fsCharset; + char *tempCharset; + + if (foundFsCharset) { WARNING("already found " "fs charset in db\n"); exit(EXIT_FAILURE); @@ -1103,191 +1148,203 @@ int readDirectoryDB() { foundFsCharset = 1; - fsCharset = &(buffer[strlen( - DIRECTORY_FS_CHARSET)]); - if((tempCharset = - getConfigParamValue( - CONF_FS_CHARSET)) && - strcmp(fsCharset,tempCharset)) - { + fsCharset = + &(buffer + [strlen(DIRECTORY_FS_CHARSET)]); + if ((tempCharset = + getConfigParamValue + (CONF_FS_CHARSET)) + && strcmp(fsCharset, tempCharset)) { WARNING("Using \"%s\" for the " "filesystem charset " "instead of \"%s\"\n", - fsCharset,tempCharset); + fsCharset, tempCharset); WARNING("maybe you need to " "recreate the db?\n"); setFsCharset(fsCharset); } - } - else { - ERROR("directory: unknown line in db info: %s\n", - buffer); + } else { + ERROR + ("directory: unknown line in db info: %s\n", + buffer); exit(EXIT_FAILURE); } } - } - else { + } else { ERROR("db info not found in db file\n"); ERROR("you should recreate the db using --create-db\n"); - fseek(fp,0,SEEK_SET); + fseek(fp, 0, SEEK_SET); } } DEBUG("reading DB\n"); - readDirectoryInfo(fp,mp3rootDirectory); - while(fclose(fp) && errno==EINTR); + readDirectoryInfo(fp, mp3rootDirectory); + while (fclose(fp) && errno == EINTR) ; - stats.numberOfSongs = countSongsIn(stderr,NULL); - stats.dbPlayTime = sumSongTimesIn(stderr,NULL); + stats.numberOfSongs = countSongsIn(stderr, NULL); + stats.dbPlayTime = sumSongTimesIn(stderr, NULL); - if(stat(dbFile,&st)==0) directory_dbModTime = st.st_mtime; + if (stat(dbFile, &st) == 0) + directory_dbModTime = st.st_mtime; return 0; } -void updateMp3Directory() { - switch(updateDirectory(mp3rootDirectory)) { - case 0: - /* nothing updated */ - return; - case 1: - if(writeDirectoryDB()<0) { - exit(EXIT_FAILURE); - } - break; - default: - /* something was updated and db should be written */ +void updateMp3Directory() +{ + switch (updateDirectory(mp3rootDirectory)) { + case 0: + /* nothing updated */ + return; + case 1: + if (writeDirectoryDB() < 0) { + exit(EXIT_FAILURE); + } + break; + default: + /* something was updated and db should be written */ ERROR("problems updating music db\n"); - exit(EXIT_FAILURE); + exit(EXIT_FAILURE); } return; } static int traverseAllInSubDirectory(FILE * fp, Directory * directory, - int (*forEachSong)(FILE *, Song *, void *), - int (*forEachDir)(FILE *, Directory *, void *), - void * data) + int (*forEachSong) (FILE *, Song *, + void *), + int (*forEachDir) (FILE *, Directory *, + void *), void *data) { - ListNode * node = directory->songs->firstNode; - Song * song; - Directory * dir; - int errFlag = 0; - - if(forEachDir) { - errFlag = forEachDir(fp,directory,data); - if(errFlag) return errFlag; - } - - if(forEachSong) { - while(node!=NULL && !errFlag) { - song = (Song *)node->data; - errFlag = forEachSong(fp,song,data); - node = node->nextNode; - } - if(errFlag) return errFlag; - } - - node = directory->subDirectories->firstNode; - - while(node!=NULL && !errFlag) { - dir = (Directory *)node->data; - errFlag = traverseAllInSubDirectory(fp,dir,forEachSong, - forEachDir,data); - node = node->nextNode; - } - - return errFlag; + ListNode *node = directory->songs->firstNode; + Song *song; + Directory *dir; + int errFlag = 0; + + if (forEachDir) { + errFlag = forEachDir(fp, directory, data); + if (errFlag) + return errFlag; + } + + if (forEachSong) { + while (node != NULL && !errFlag) { + song = (Song *) node->data; + errFlag = forEachSong(fp, song, data); + node = node->nextNode; + } + if (errFlag) + return errFlag; + } + + node = directory->subDirectories->firstNode; + + while (node != NULL && !errFlag) { + dir = (Directory *) node->data; + errFlag = traverseAllInSubDirectory(fp, dir, forEachSong, + forEachDir, data); + node = node->nextNode; + } + + return errFlag; } -int traverseAllIn(FILE * fp, char * name, - int (*forEachSong)(FILE *, Song *, void *), - int (*forEachDir)(FILE *, Directory *, void *), - void * data) { - Directory * directory; +int traverseAllIn(FILE * fp, char *name, + int (*forEachSong) (FILE *, Song *, void *), + int (*forEachDir) (FILE *, Directory *, void *), void *data) +{ + Directory *directory; - if((directory = getDirectory(name))==NULL) { - Song * song; - if((song = getSongFromDB(name)) && forEachSong) { + if ((directory = getDirectory(name)) == NULL) { + Song *song; + if ((song = getSongFromDB(name)) && forEachSong) { return forEachSong(fp, song, data); } commandError(fp, ACK_ERROR_NO_EXIST, - "directory or file not found", NULL); + "directory or file not found", NULL); return -1; } - return traverseAllInSubDirectory(fp,directory,forEachSong,forEachDir, - data); + return traverseAllInSubDirectory(fp, directory, forEachSong, forEachDir, + data); } -static void freeAllDirectoryStats(Directory * directory) { - ListNode * node = directory->subDirectories->firstNode; +static void freeAllDirectoryStats(Directory * directory) +{ + ListNode *node = directory->subDirectories->firstNode; - while(node != NULL) { - freeAllDirectoryStats((Directory *)node->data); + while (node != NULL) { + freeAllDirectoryStats((Directory *) node->data); node = node->nextNode; } freeDirectoryStatFromDirectory(directory); } -void initMp3Directory() { +void initMp3Directory() +{ struct stat st; mp3rootDirectory = newDirectory(NULL, NULL); exploreDirectory(mp3rootDirectory); freeAllDirectoryStats(mp3rootDirectory); - stats.numberOfSongs = countSongsIn(stderr,NULL); - stats.dbPlayTime = sumSongTimesIn(stderr,NULL); + stats.numberOfSongs = countSongsIn(stderr, NULL); + stats.dbPlayTime = sumSongTimesIn(stderr, NULL); - if(stat(getDbFile(),&st)==0) directory_dbModTime = st.st_mtime; + if (stat(getDbFile(), &st) == 0) + directory_dbModTime = st.st_mtime; } -static Song * getSongDetails(char * file, char ** shortnameRet, - Directory ** directoryRet) +static Song *getSongDetails(char *file, char **shortnameRet, + Directory ** directoryRet) { - void * song = NULL; - Directory * directory; - char * dir = NULL; - char * dup = strdup(file); - char * shortname = dup; - char * c = strtok(dup,"/"); + void *song = NULL; + Directory *directory; + char *dir = NULL; + char *dup = strdup(file); + char *shortname = dup; + char *c = strtok(dup, "/"); - DEBUG("get song: %s\n",file); + DEBUG("get song: %s\n", file); - while(c) { + while (c) { shortname = c; - c = strtok(NULL,"/"); + c = strtok(NULL, "/"); } - if(shortname!=dup) { - for(c = dup; c < shortname-1; c++) { - if(*c=='\0') *c = '/'; + if (shortname != dup) { + for (c = dup; c < shortname - 1; c++) { + if (*c == '\0') + *c = '/'; } dir = dup; } - if(!(directory = getDirectory(dir))) { + if (!(directory = getDirectory(dir))) { free(dup); return NULL; } - if(!findInList(directory->songs,shortname,&song)) { + if (!findInList(directory->songs, shortname, &song)) { free(dup); return NULL; } free(dup); - if(shortnameRet) *shortnameRet = shortname; - if(directoryRet) *directoryRet = directory; - return (Song *)song; + if (shortnameRet) + *shortnameRet = shortname; + if (directoryRet) + *directoryRet = directory; + return (Song *) song; } -Song * getSongFromDB(char * file) { - return getSongDetails(file,NULL,NULL); +Song *getSongFromDB(char *file) +{ + return getSongDetails(file, NULL, NULL); } -time_t getDbModTime() { +time_t getDbModTime() +{ return directory_dbModTime; } |