From 8e3c40f032d1c760b9dc11df654c577baaf5f76a Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sun, 7 Sep 2008 13:50:06 +0200 Subject: directory: don't pass "fd" to updateInit() Again, move error handling to command.c. --- src/command.c | 48 +++++++++++++++++++++++++++++++++++++++++++----- src/directory.c | 15 ++++----------- src/directory.h | 7 ++++++- 3 files changed, 53 insertions(+), 17 deletions(-) diff --git a/src/command.c b/src/command.c index 14b1aca09..f197db393 100644 --- a/src/command.c +++ b/src/command.c @@ -816,9 +816,27 @@ static int listHandleUpdate(int fd, nextCmd = getCommandEntryFromString(next->data, permission); if (cmd != nextCmd) { - int ret = updateInit(fd, pathList); + int ret = updateInit(pathList); freeList(pathList); pathList = NULL; + + switch (ret) { + case 0: + commandError(fd, ACK_ERROR_UPDATE_ALREADY, + "already updating"); + break; + + case -1: + commandError(fd, ACK_ERROR_SYSTEM, + "problems trying to update"); + break; + + default: + fdprintf(fd, "updating_db: %i\n", ret); + ret = 0; + break; + } + return ret; } @@ -828,15 +846,35 @@ static int listHandleUpdate(int fd, static int handleUpdate(int fd, mpd_unused int *permission, mpd_unused int argc, char *argv[]) { + int ret; + if (argc == 2) { - int ret; List *pathList = makeList(NULL, 1); insertInList(pathList, argv[1], NULL); - ret = updateInit(fd, pathList); + ret = updateInit(pathList); freeList(pathList); - return ret; + } else + ret = updateInit(NULL); + + switch (ret) { + case 0: + commandError(fd, ACK_ERROR_UPDATE_ALREADY, + "already updating"); + ret = -1; + break; + + case -1: + commandError(fd, ACK_ERROR_SYSTEM, + "problems trying to update"); + break; + + default: + fdprintf(fd, "updating_db: %i\n", ret); + ret = 0; + break; } - return updateInit(fd, NULL); + + return ret; } static int handleNext(mpd_unused int fd, mpd_unused int *permission, diff --git a/src/directory.c b/src/directory.c index a9cb892a8..2e3e61f6f 100644 --- a/src/directory.c +++ b/src/directory.c @@ -18,7 +18,6 @@ #include "directory.h" -#include "command.h" #include "conf.h" #include "client.h" #include "listen.h" @@ -30,7 +29,6 @@ #include "stats.h" #include "utils.h" #include "volume.h" -#include "ack.h" #include "myfprintf.h" #include "dbUtils.h" #include "song_print.h" @@ -160,12 +158,10 @@ void readDirectoryDBIfUpdateIsFinished(void) } } -int updateInit(int fd, List * pathList) +int updateInit(List * pathList) { - if (directory_updatePid > 0) { - commandError(fd, ACK_ERROR_UPDATE_ALREADY, "already updating"); - return -1; - } + if (directory_updatePid > 0) + return 0; /* need to block CHLD signal, cause it can exit before we even get a chance to assign directory_updatePID */ @@ -216,8 +212,6 @@ int updateInit(int fd, List * pathList) } else if (directory_updatePid < 0) { unblockSignals(); ERROR("updateInit: Problems forking()'ing\n"); - commandError(fd, ACK_ERROR_SYSTEM, - "problems trying to update"); directory_updatePid = 0; return -1; } @@ -228,9 +222,8 @@ int updateInit(int fd, List * pathList) directory_updateJobId = 1; DEBUG("updateInit: fork()'d update child for update job id %i\n", (int)directory_updateJobId); - fdprintf(fd, "updating_db: %i\n", (int)directory_updateJobId); - return 0; + return (int)directory_updateJobId; } static DirectoryStat *newDirectoryStat(struct stat *st) diff --git a/src/directory.h b/src/directory.h index 19dada309..f23372c3b 100644 --- a/src/directory.h +++ b/src/directory.h @@ -42,7 +42,12 @@ int isUpdatingDB(void); void directory_sigChldHandler(int pid, int status); -int updateInit(int fd, List * pathList); +/** + * Starts the tag cache update in the specified location(s). Returns + * the job id on success, -1 on error or 0 if an update is already + * running. + */ +int updateInit(List * pathList); void initMp3Directory(void); -- cgit v1.2.3