X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=aft.c;h=eb0f7b57911ed49fdb19a6bee1638d84ef1288a2;hp=daa9a500a7712d01731fcadb577f509060768ea4;hb=f393aab6b6e8c7413c02b4e198666ad95570066c;hpb=299df142bb50bacebc0b3050768f941bc95b5b6f diff --git a/aft.c b/aft.c index daa9a500..eb0f7b57 100644 --- a/aft.c +++ b/aft.c @@ -1,27 +1,26 @@ /* - * Copyright (C) 2007-2009 Andre Noll + * Copyright (C) 2007-2010 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ /** \file aft.c Audio file table functions. */ +#include #include /* readdir() */ #include - +#include +#include +#include #include + #include "para.h" #include "error.h" #include "crypt.h" #include "string.h" -#include -#include -#include - #include "afh.h" #include "afs.h" #include "net.h" -#include "vss.h" #include "fd.h" #include "ipc.h" #include "portable_io.h" @@ -238,7 +237,7 @@ enum audio_file_table_columns { * * \sa osl_compare_func, uint32_compare(). */ -int aft_hash_compare(const struct osl_object *obj1, const struct osl_object *obj2) +static int aft_hash_compare(const struct osl_object *obj1, const struct osl_object *obj2) { return hash_compare((HASH_TYPE *)obj1->data, (HASH_TYPE *)obj2->data); } @@ -475,7 +474,7 @@ int aft_get_row_of_path(const char *path, struct osl_row **row) * * \return Standard. */ -int aft_get_row_of_hash(HASH_TYPE *hash, struct osl_row **row) +static int aft_get_row_of_hash(HASH_TYPE *hash, struct osl_row **row) { const struct osl_object obj = {.data = hash, .size = HASH_SIZE}; return osl(osl_get_row(audio_file_table, AFTCOL_HASH, &obj, row)); @@ -503,7 +502,7 @@ int get_afsi_object_of_row(const struct osl_row *row, struct osl_object *obj) * * \return Positive on success, negative on errors. */ -int get_afsi_object_of_path(const char *path, struct osl_object *obj) +static int get_afsi_object_of_path(const char *path, struct osl_object *obj) { struct osl_row *row; int ret = aft_get_row_of_path(path, &row); @@ -652,6 +651,18 @@ err: return ret; } +/** + * Extract a afd stored in a shared memory area. + * + * Attach the shared memory area given by \a shmid, load the audio file data + * stored therein and detach the area afterwards. Called by vss, after + * receiving a positive response to the request for the next audio file. + + + * \param shmid The identifier of the shared memory area containing the afd. + * \param afd Result pointer. + * + * \return Standard. + */ int load_afd(int shmid, struct audio_file_data *afd) { void *shm_afd; @@ -1070,6 +1081,7 @@ int open_and_update_audio_file(struct osl_row *aft_row, long score, ret = get_audio_file_path_of_row(aft_row, &path); if (ret < 0) return ret; + PARA_NOTICE_LOG("%s\n", path); ret = get_afsi_object_of_row(aft_row, &afsi_obj); if (ret < 0) return ret; @@ -2105,33 +2117,33 @@ int com_touch(struct rc4_context *rc4c, int argc, char * const * const argv) i++; break; } - if (!strncmp(arg, "-n", 2)) { - ret = para_atoi32(arg + 2, &cto.num_played); + if (!strncmp(arg, "-n=", 3)) { + ret = para_atoi32(arg + 3, &cto.num_played); if (ret < 0) return ret; continue; } - if (!strncmp(arg, "-l", 2)) { - ret = para_atoi64(arg + 2, &cto.last_played); + if (!strncmp(arg, "-l=", 3)) { + ret = para_atoi64(arg + 3, &cto.last_played); if (ret < 0) return ret; continue; } - if (!strncmp(arg, "-y", 2)) { - ret = para_atoi32(arg + 2, &cto.lyrics_id); + if (!strncmp(arg, "-y=", 3)) { + ret = para_atoi32(arg + 3, &cto.lyrics_id); if (ret < 0) return ret; continue; } - if (!strncmp(arg, "-i", 2)) { - ret = para_atoi32(arg + 2, &cto.image_id); + if (!strncmp(arg, "-i=", 3)) { + ret = para_atoi32(arg + 3, &cto.image_id); if (ret < 0) return ret; continue; } - if (!strncmp(arg, "-a", 2)) { + if (!strncmp(arg, "-a=", 3)) { int32_t val; - ret = para_atoi32(arg + 2, &val); + ret = para_atoi32(arg + 3, &val); if (ret < 0) return ret; if (val < 0 || val > 255) @@ -2435,7 +2447,7 @@ int com_cpsi(struct rc4_context *rc4c, int argc, char * const * const argv) return ret; } -void afs_stat_callback(int fd, const struct osl_object *query) +static void afs_stat_callback(int fd, const struct osl_object *query) { int *parser_friendly = query->data; char *buf = *parser_friendly? @@ -2446,6 +2458,18 @@ void afs_stat_callback(int fd, const struct osl_object *query) pass_buffer_as_shm(buf, strlen(buf), &fd); } +/** + * Get the current afs status items from the afs process and send it using RC4. + * + * \param rc4c The rc4 context for data encryption. + * \param parser_friendly Whether parser-friendly output format should be used. + * + * As the contents of the afs status items change in time and the command + * handler only has a COW version created at fork time, it can not send + * up-to-date afs status items directly. Therefore the usual callback mechanism + * is used to pass the status items from the afs process to the command handler + * via a shared memory area and a pipe. + */ int send_afs_status(struct rc4_context *rc4c, int parser_friendly) { struct osl_object query = {.data = &parser_friendly, @@ -2610,9 +2634,13 @@ static int aft_event_handler(enum afs_events event, struct para_buffer *pb, } } +/** + * Initialize the audio file table. + * + * \param t Pointer to the structure to be initialized. + */ void aft_init(struct afs_table *t) { - t->name = audio_file_table_desc.name; t->open = aft_open; t->close = aft_close; t->create = aft_create;