From: Andre Noll Date: Tue, 20 Feb 2007 20:15:53 +0000 (+0100) Subject: rename db.c to afs.c and db.h to afs.h X-Git-Tag: v0.2.16~76^2~3 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=1d298ac7426fdc13221f759848dbf766ef606c0b rename db.c to afs.c and db.h to afs.h --- diff --git a/afs.c b/afs.c new file mode 100644 index 00000000..f5de6609 --- /dev/null +++ b/afs.c @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2005-2007 Andre Noll + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + */ + + +/** \file afs.c functions common to all audio file selectors */ + +#include "server.cmdline.h" +#include "server.h" +#include "vss.h" +#include /* readdir() */ +#include /* stat */ +#include /* mode_t */ +#include "error.h" +#include "string.h" + +/** + * traverse the given directory recursively + * + * @param dirname the directory to traverse + * @param f: the function to call for each entry. + * + * for each regular file whose filename ends in .yyy, where yyy is a supported + * audio format, the supplied function \a f is called. The directory and + * filename component of the regular file are passed to \a f. + * + * \return On success, 1 is returned. Otherwise, this function returns a + * negative value which indicates the kind of the error. + */ +int find_audio_files(const char *dirname, int (*f)(const char *, const char *)) +{ + DIR *dir = NULL; + struct dirent *entry; + /* + * Opening the current directory (".") and calling fchdir() to return + * is usually faster and more reliable than saving cwd in some buffer + * and calling chdir() afterwards (see man 3 getcwd). + */ + int cwd_fd = open(".", O_RDONLY); + struct stat s; + int ret = -1; + +// PARA_DEBUG_LOG("dirname: %s\n", dirname); + if (cwd_fd < 0) + return -E_GETCWD; + ret = -E_CHDIR; + if (chdir(dirname) < 0) + goto out; + ret = -E_OPENDIR; + dir = opendir("."); + if (!dir) + goto out; + /* scan cwd recursively */ + while ((entry = readdir(dir))) { + mode_t m; + char *tmp; + + if (!strcmp(entry->d_name, ".")) + continue; + if (!strcmp(entry->d_name, "..")) + continue; + ret = -E_LSTAT; + if (lstat(entry->d_name, &s) == -1) + continue; + m = s.st_mode; + if (!S_ISREG(m) && !S_ISDIR(m)) /* skip links, sockets, ... */ + continue; + if (S_ISREG(m)) { /* regular file */ + if (guess_audio_format(entry->d_name) < 0) + continue; + ret = f(dirname, entry->d_name); + if (ret < 0) + goto out; + continue; + } + /* directory */ + tmp = make_message("%s/%s", dirname, entry->d_name); + ret = find_audio_files(tmp, f); + free(tmp); + if (ret < 0) + goto out; + } + ret = 1; +out: + if (dir) + closedir(dir); + if (fchdir(cwd_fd) < 0) + ret = -E_CHDIR; + close(cwd_fd); + if (ret < 0) + PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret)); + return ret; +} diff --git a/afs.h b/afs.h new file mode 100644 index 00000000..520bd5ba --- /dev/null +++ b/afs.h @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2005-2007 Andre Noll + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + */ + +/** \file afs.h data structures common to all audio file selectors */ + +#include + + +int find_audio_files(const char *dirname, int (*f)(const char *, const char *)); + +/** + * describes one supported audio file selector + * + * There is one such struct for each supported selector. During the startup + * part of para_server the \a init() function of the activated selector gets + * called which fills in all other function pointers. + * + */ +struct audio_file_selector { +/** + * name name of this selector + */ +const char *name; +/** + * the init routine of the selector + * + * It should check its command line options and do all necessary initialization + * like connecting to a database server. + * + * A negative return value indicates an initialization error and means that + * this selector should be ignored for now (it may later be activated again via + * the chs command). + * + * If \a init() returns success (non-negative return value), it must have + * initialized in all non-optional function pointers of the given selector + * struct. Moreover, \a cmd_list must point to a NULL-terminated array which + * holds the list of all commands that are supported by this selector. + */ +int (*init)(struct audio_file_selector *self); +/** + * list of commands supported by this selector + */ +struct server_command *cmd_list; +/** + * pointer to function returning list of at most \a num audio files to be + * streamed next + * + * \a get_audio_file_list() must return a pointer to a array of at most \a num + * char* pointers (terminated by a NULL pointer), or NULL on errors. Both the + * array and its contents must be dynamically allocated and are freed by the + * caller. + * +*/ +char **(*get_audio_file_list)(unsigned int num); +/** + * + * the update hook + * + * The \a update_audio_file pointer is optional and need not be supplied. In this + * case it is not neccessary to init this pointer from within init(). If + * \a update_audio_file is non-NULL, the function it points to gets called + * whenever a new audio file was successfully loaded and is going to be + * streamed by any of paraslash's senders. The full path of the audio file is + * passed \a update_audio_file(). + * + */ +void (*update_audio_file)(char *audio_file); +/** + * + * shutdown this selector and free all resources + * + * This gets called whenever the audio file selector changes. The reason for + * this change might be that some user sent the chs command, that para_server + * receives the HUP signal, or that para_server shuts down. It is assumed to + * succeed. + */ +void (*shutdown)(void); +/** + * + * add file descriptors to fd_sets + * + * The pre_select function of the activated selector gets called just before + * para_server enters its main select loop. The selector may add its own file + * descriptors to the \a rfds or the \a wfds set. + * + * \return The highest-numbered file descriptor which was added to either of + * the two fd sets (or -1 if no file descriptors were added). + * + * \sa select(2) + */ +int (*pre_select)(fd_set *rfds, fd_set *wfds); +/** + * handle the file descriptors which are ready for I/O + * + * If the pre_select hook added one ore more file descriptors to the read or write + * set, this is the hook to check the result and do any I/O on those descriptors + * which are ready for reading/writing. + */ +void (*post_select)(fd_set *rfds, fd_set *wfds); +/** + * each selector has its private data pointer */ +void *private_data; +}; + +int mysql_selector_init(struct audio_file_selector*); +int playlist_selector_init(struct audio_file_selector*); +int random_selector_init(struct audio_file_selector*); + diff --git a/command.c b/command.c index ffd660d6..325f7686 100644 --- a/command.c +++ b/command.c @@ -20,7 +20,7 @@ #include /* gettimeofday */ #include "server.cmdline.h" -#include "db.h" +#include "afs.h" #include "server.h" #include "vss.h" #include "send.h" diff --git a/configure.ac b/configure.ac index fd01b188..aeb6f8d4 100644 --- a/configure.ac +++ b/configure.ac @@ -91,7 +91,7 @@ audiod_audio_formats="" server_cmdline_objs="server.cmdline server_command_list random_selector_command_list playlist_selector_command_list" server_errlist_objs="server mp3_afh vss command net string signal random_selector - time daemon stat crypt http_send db close_on_fork playlist_selector + time daemon stat crypt http_send afs close_on_fork playlist_selector ipc dccp dccp_send fd user_list" server_ldflags="" server_audio_formats=" mp3" diff --git a/db.c b/db.c deleted file mode 100644 index 027dfda5..00000000 --- a/db.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2005-2007 Andre Noll - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. - */ - - -/** \file db.c functions common to all audio file selectors */ - -#include "server.cmdline.h" -#include "server.h" -#include "vss.h" -#include /* readdir() */ -#include /* stat */ -#include /* mode_t */ -#include "error.h" -#include "string.h" - -/** - * traverse the given directory recursively - * - * @param dirname the directory to traverse - * @param f: the function to call for each entry. - * - * for each regular file whose filename ends in .yyy, where yyy is a supported - * audio format, the supplied function \a f is called. The directory and - * filename component of the regular file are passed to \a f. - * - * \return On success, 1 is returned. Otherwise, this function returns a - * negative value which indicates the kind of the error. - */ -int find_audio_files(const char *dirname, int (*f)(const char *, const char *)) -{ - DIR *dir = NULL; - struct dirent *entry; - /* - * Opening the current directory (".") and calling fchdir() to return - * is usually faster and more reliable than saving cwd in some buffer - * and calling chdir() afterwards (see man 3 getcwd). - */ - int cwd_fd = open(".", O_RDONLY); - struct stat s; - int ret = -1; - -// PARA_DEBUG_LOG("dirname: %s\n", dirname); - if (cwd_fd < 0) - return -E_GETCWD; - ret = -E_CHDIR; - if (chdir(dirname) < 0) - goto out; - ret = -E_OPENDIR; - dir = opendir("."); - if (!dir) - goto out; - /* scan cwd recursively */ - while ((entry = readdir(dir))) { - mode_t m; - char *tmp; - - if (!strcmp(entry->d_name, ".")) - continue; - if (!strcmp(entry->d_name, "..")) - continue; - ret = -E_LSTAT; - if (lstat(entry->d_name, &s) == -1) - continue; - m = s.st_mode; - if (!S_ISREG(m) && !S_ISDIR(m)) /* skip links, sockets, ... */ - continue; - if (S_ISREG(m)) { /* regular file */ - if (guess_audio_format(entry->d_name) < 0) - continue; - ret = f(dirname, entry->d_name); - if (ret < 0) - goto out; - continue; - } - /* directory */ - tmp = make_message("%s/%s", dirname, entry->d_name); - ret = find_audio_files(tmp, f); - free(tmp); - if (ret < 0) - goto out; - } - ret = 1; -out: - if (dir) - closedir(dir); - if (fchdir(cwd_fd) < 0) - ret = -E_CHDIR; - close(cwd_fd); - if (ret < 0) - PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret)); - return ret; -} diff --git a/db.h b/db.h deleted file mode 100644 index 3b9d4530..00000000 --- a/db.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (C) 2005-2006 Andre Noll - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. - */ - -/** \file db.h data structures common to all audio file selectors */ - -#include - - -int find_audio_files(const char *dirname, int (*f)(const char *, const char *)); - -/** - * describes one supported audio file selector - * - * There is one such struct for each supported selector. During the startup - * part of para_server the \a init() function of the activated selector gets - * called which fills in all other function pointers. - * - */ -struct audio_file_selector { -/** - * name name of this selector - */ -const char *name; -/** - * the init routine of the selector - * - * It should check its command line options and do all necessary initialization - * like connecting to a database server. - * - * A negative return value indicates an initialization error and means that - * this selector should be ignored for now (it may later be activated again via - * the chs command). - * - * If \a init() returns success (non-negative return value), it must have - * initialized in all non-optional function pointers of the given selector - * struct. Moreover, \a cmd_list must point to a NULL-terminated array which - * holds the list of all commands that are supported by this selector. - */ -int (*init)(struct audio_file_selector *self); -/** - * list of commands supported by this selector - */ -struct server_command *cmd_list; -/** - * pointer to function returning list of at most \a num audio files to be - * streamed next - * - * \a get_audio_file_list() must return a pointer to a array of at most \a num - * char* pointers (terminated by a NULL pointer), or NULL on errors. Both the - * array and its contents must be dynamically allocated and are freed by the - * caller. - * -*/ -char **(*get_audio_file_list)(unsigned int num); -/** - * - * the update hook - * - * The \a update_audio_file pointer is optional and need not be supplied. In this - * case it is not neccessary to init this pointer from within init(). If - * \a update_audio_file is non-NULL, the function it points to gets called - * whenever a new audio file was successfully loaded and is going to be - * streamed by any of paraslash's senders. The full path of the audio file is - * passed \a update_audio_file(). - * - */ -void (*update_audio_file)(char *audio_file); -/** - * - * shutdown this selector and free all resources - * - * This gets called whenever the audio file selector changes. The reason for - * this change might be that some user sent the chs command, that para_server - * receives the HUP signal, or that para_server shuts down. It is assumed to - * succeed. - */ -void (*shutdown)(void); -/** - * - * add file descriptors to fd_sets - * - * The pre_select function of the activated selector gets called just before - * para_server enters its main select loop. The selector may add its own file - * descriptors to the \a rfds or the \a wfds set. - * - * \return The highest-numbered file descriptor which was added to either of - * the two fd sets (or -1 if no file descriptors were added). - * - * \sa select(2) - */ -int (*pre_select)(fd_set *rfds, fd_set *wfds); -/** - * handle the file descriptors which are ready for I/O - * - * If the pre_select hook added one ore more file descriptors to the read or write - * set, this is the hook to check the result and do any I/O on those descriptors - * which are ready for reading/writing. - */ -void (*post_select)(fd_set *rfds, fd_set *wfds); -/** - * each selector has its private data pointer */ -void *private_data; -}; - -int mysql_selector_init(struct audio_file_selector*); -int playlist_selector_init(struct audio_file_selector*); -int random_selector_init(struct audio_file_selector*); - diff --git a/error.h b/error.h index b9709477..537aca57 100644 --- a/error.h +++ b/error.h @@ -55,7 +55,7 @@ enum para_subsystem { SS_CRYPT, SS_HTTP_SEND, SS_ORTP_SEND, - SS_DB, + SS_AFS, SS_OGG_AFH, SS_MP3_AFH, SS_AAC_AFH, @@ -305,7 +305,7 @@ extern const char **para_errlist[]; PARA_ERROR(FSTAT, "failed to fstat() audio file"), \ -#define DB_ERRORS \ +#define AFS_ERRORS \ PARA_ERROR(GETCWD, "can not get current working directory"), \ PARA_ERROR(CHDIR, "can not change directory"), \ PARA_ERROR(OPENDIR, "can not open directory"), \ @@ -559,7 +559,7 @@ SS_ENUM(PLAYLIST_SELECTOR); SS_ENUM(CRYPT); SS_ENUM(HTTP_SEND); SS_ENUM(ORTP_SEND); -SS_ENUM(DB); +SS_ENUM(AFS); SS_ENUM(MYSQL_SELECTOR); SS_ENUM(IPC); SS_ENUM(DCCP); diff --git a/mysql_selector.c b/mysql_selector.c index d4ccc868..e545f0da 100644 --- a/mysql_selector.c +++ b/mysql_selector.c @@ -25,7 +25,7 @@ #include "server.cmdline.h" #include "server.h" #include "vss.h" -#include "db.h" +#include "afs.h" #include #include #include diff --git a/playlist_selector.c b/playlist_selector.c index 8d1d4516..2b0599cb 100644 --- a/playlist_selector.c +++ b/playlist_selector.c @@ -19,7 +19,7 @@ /** \file playlist_selector.c The playlist audio file selector of paraslash */ #include "server.h" -#include "db.h" +#include "afs.h" #include "error.h" #include "net.h" #include "string.h" diff --git a/random_selector.c b/random_selector.c index 5d8b386c..d9efaaf2 100644 --- a/random_selector.c +++ b/random_selector.c @@ -21,7 +21,7 @@ #include /* gettimeofday */ #include "server.cmdline.h" #include "server.h" -#include "db.h" +#include "afs.h" #include "error.h" #include "net.h" #include "string.h" diff --git a/server.c b/server.c index 89f901f4..41d9a2ac 100644 --- a/server.c +++ b/server.c @@ -30,7 +30,7 @@ #include "server.cmdline.h" -#include "db.h" +#include "afs.h" #include "server.h" #include "vss.h" #include "config.h" diff --git a/vss.c b/vss.c index 4a395593..b34703de 100644 --- a/vss.c +++ b/vss.c @@ -25,7 +25,7 @@ #include "server.h" #include /* gettimeofday */ #include "server.cmdline.h" -#include "db.h" +#include "afs.h" #include "afh.h" #include "vss.h" #include "send.h"