X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=aft.c;h=5112affacdcd29ebcaf51b82eb9d6980035d5f88;hp=ce84ef0a47c822256ab52283c6259e0e787c9e37;hb=dcf9594fa041cdfae819186ed7e145d079110318;hpb=b7bfffa86a33626ebb8e8a5fcba51568492c3808 diff --git a/aft.c b/aft.c index ce84ef0a..5112affa 100644 --- a/aft.c +++ b/aft.c @@ -298,12 +298,19 @@ bad_path: return -E_BAD_PATH; } +/** The on-disk layout of a afhi struct. */ enum afhi_offsets { + /** Where the number of seconds is stored. */ AFHI_SECONDS_TOTAL_OFFSET = 0, + /** Position of the bitrate. */ AFHI_BITRATE_OFFSET = 4, + /** Position of the frequency. */ AFHI_FREQUENCY_OFFSET = 8, + /** Number of channels is stored here. */ AFHI_CHANNELS_OFFSET = 12, + /** The tag info position. */ AFHI_INFO_STRING_OFFSET = 13, + /** Minimal on-disk size of a valid afhi struct. */ MIN_AFHI_SIZE = 14 }; @@ -670,6 +677,7 @@ static int get_local_time(uint64_t *seconds, char *buf, size_t size, return 1; } +/** Compute the number of (decimal) digits of a number. */ #define GET_NUM_DIGITS(x, num) { \ typeof((x)) _tmp = PARA_ABS(x); \ *num = 1; \ @@ -1363,16 +1371,20 @@ afhi <=> force or no HS */ - -#define ADD_FLAG_LAZY 1 -#define ADD_FLAG_FORCE 2 -#define ADD_FLAG_VERBOSE 4 -#define ADD_FLAG_ALL 8 - -/* TODO: change log messages so that they get written to the result buffer */ +/** Flags passed to the add command. */ +enum com_add_flags { + /** Skip paths that exist already. */ + ADD_FLAG_LAZY = 1, + /** Force adding. */ + ADD_FLAG_FORCE = 2, + /** Print what is being done. */ + ADD_FLAG_VERBOSE = 4, + /** Try to add files with unknown suffixes. */ + ADD_FLAG_ALL = 8, +}; static int com_add_callback(const struct osl_object *query, - __a_unused struct osl_object *result) + struct osl_object *result) { char *buf = query->data, *path; struct osl_row *pb, *aft_row; @@ -1384,6 +1396,7 @@ static int com_add_callback(const struct osl_object *query, char afsi_buf[AFSI_SIZE]; uint32_t flags = read_u32(buf + AFTROW_FLAGS_OFFSET); struct afs_info default_afsi = {.last_played = 0}; + struct para_buffer msg = {.buf = NULL}; hash = (HASH_TYPE *)buf + AFTROW_HASH_OFFSET; hash_to_asc(hash, asc);; @@ -1401,29 +1414,30 @@ static int com_add_callback(const struct osl_object *query, return ret; if (hs && pb && hs == pb && !(flags & ADD_FLAG_FORCE)) { if (flags & ADD_FLAG_VERBOSE) - PARA_NOTICE_LOG("ignoring duplicate %p\n", path); - return 1; + para_printf(&msg, "ignoring duplicate\n"); + ret = 1; + goto out; } if (hs && hs != pb) { struct osl_object obj; if (pb) { /* hs trumps pb, remove pb */ if (flags & ADD_FLAG_VERBOSE) - PARA_NOTICE_LOG("removing path brother\n"); + para_printf(&msg, "removing path brother\n"); ret = osl_del_row(audio_file_table, pb); if (ret < 0) - return ret; + goto out; pb = NULL; } /* file rename, update hs' path */ ret = osl_get_object(audio_file_table, hs, AFTCOL_PATH, &obj); if (flags & ADD_FLAG_VERBOSE) - PARA_NOTICE_LOG("rename %s -> %s\n", (char *)obj.data, path); + para_printf(&msg, "renamed from %s\n", (char *)obj.data); ret = osl_update_object(audio_file_table, hs, AFTCOL_PATH, &objs[AFTCOL_PATH]); if (ret < 0) - return ret; + goto out; if (!(flags & ADD_FLAG_FORCE)) - return ret; + goto out; } /* no hs or force mode, child must have sent afhi */ uint16_t afhi_offset = read_u16(buf + AFTROW_AFHI_OFFSET_POS); @@ -1431,8 +1445,9 @@ static int com_add_callback(const struct osl_object *query, objs[AFTCOL_AFHI].data = buf + afhi_offset; objs[AFTCOL_AFHI].size = chunks_offset - afhi_offset; + ret = -E_NO_AFHI; if (!objs[AFTCOL_AFHI].size) /* "impossible" */ - return -E_NO_AFHI; + goto out; objs[AFTCOL_CHUNKS].data = buf + chunks_offset; objs[AFTCOL_CHUNKS].size = query->size - chunks_offset; if (pb && !hs) { /* update pb's hash */ @@ -1440,35 +1455,32 @@ static int com_add_callback(const struct osl_object *query, HASH_TYPE *old_hash; ret = get_hash_of_row(pb, &old_hash); if (ret < 0) - return ret; + goto out; hash_to_asc(old_hash, old_asc); if (flags & ADD_FLAG_VERBOSE) - PARA_NOTICE_LOG("file change: %s %s -> %s\n", path, + para_printf(&msg, "file change: %s -> %s\n", old_asc, asc); ret = osl_update_object(audio_file_table, pb, AFTCOL_HASH, &objs[AFTCOL_HASH]); if (ret < 0) - return ret; + goto out; } if (hs || pb) { /* (hs != NULL and pb != NULL) implies hs == pb */ const struct osl_row *row = pb? pb : hs; /* update afhi and chunk_table */ if (flags & ADD_FLAG_VERBOSE) - PARA_DEBUG_LOG("updating audio format handler info (%zd bytes)\n", - objs[AFTCOL_AFHI].size); + para_printf(&msg, "updating afhi and chunk table\n"); ret = osl_update_object(audio_file_table, row, AFTCOL_AFHI, &objs[AFTCOL_AFHI]); if (ret < 0) - return ret; - if (flags & ADD_FLAG_VERBOSE) - PARA_DEBUG_LOG("updating chunk table\n"); + goto out; ret = osl_update_object(audio_file_table, row, AFTCOL_CHUNKS, &objs[AFTCOL_CHUNKS]); - if (ret < 0) - return ret; - return mood_update_audio_file(row, NULL); + goto out; } /* new entry, use default afsi */ + if (flags & ADD_FLAG_VERBOSE) + para_printf(&msg, "new file\n"); default_afsi.last_played = time(NULL) - 365 * 24 * 60 * 60; default_afsi.audio_format_id = read_u8(buf + AFTROW_AUDIO_FORMAT_OFFSET); @@ -1476,9 +1488,15 @@ static int com_add_callback(const struct osl_object *query, objs[AFTCOL_AFSI].size = AFSI_SIZE; save_afsi(&default_afsi, &objs[AFTCOL_AFSI]); ret = osl_add_and_get_row(audio_file_table, objs, &aft_row); +out: if (ret < 0) - return ret; - return mood_update_audio_file(aft_row, NULL); + para_printf(&msg, "%s\n", PARA_STRERROR(-ret)); + if (!msg.buf) + return 0; + result->data = msg.buf; + result->size = msg.size; + return 1; + // mood_update_audio_file(aft_row, NULL); } struct private_add_data { @@ -1517,7 +1535,7 @@ static int hash_sister_callback(const struct osl_object *query, static int add_one_audio_file(const char *path, const void *private_data) { - int ret; + int ret, ret2; uint8_t format_num = -1; const struct private_add_data *pad = private_data; struct audio_format_info afhi, *afhi_ptr = NULL; @@ -1528,13 +1546,8 @@ static int add_one_audio_file(const char *path, const void *private_data) afhi.header_offset = 0; afhi.header_len = 0; ret = guess_audio_format(path); - if (ret < 0 && !(pad->flags & ADD_FLAG_ALL)) { - if (pad->flags & ADD_FLAG_VERBOSE) - ret = send_va_buffer(pad->fd, "%s: %s\n", - PARA_STRERROR(-ret), path); - ret = 1; + if (ret < 0 && !(pad->flags & ADD_FLAG_ALL)) goto out_free; - } query.data = (char *)path; query.size = strlen(path) + 1; ret = send_callback_request(path_brother_callback, &query, &result); @@ -1571,7 +1584,7 @@ static int add_one_audio_file(const char *path, const void *private_data) if (pb && hs && hs == pb && (!(pad->flags & ADD_FLAG_FORCE))) { if (pad->flags & ADD_FLAG_VERBOSE) ret = send_va_buffer(pad->fd, - "not forcing update: %s\n", path); + "%s exists, not forcing update\n", path); goto out_unmap; } /* @@ -1593,7 +1606,13 @@ static int add_one_audio_file(const char *path, const void *private_data) munmap(map.data, map.size); save_audio_file_info(hash, path, afhi_ptr, pad->flags, format_num, &obj); /* Ask afs to consider this entry for adding. */ - ret = send_callback_request(com_add_callback, &obj, NULL); + ret = send_callback_request(com_add_callback, &obj, &result); + if (result.data && result.size) { + ret2 = send_va_buffer(pad->fd, "%s", (char *)result.data); + free(result.data); + if (ret >= 0 && ret2 < 0) + ret = ret2; + } goto out_free; out_unmap: @@ -1676,8 +1695,15 @@ int com_add(int fd, int argc, char * const * const argv) } +/** + * Flags used by the touch command. + * + * \sa com_touch(). + */ enum touch_flags { + /** Whether the \p FNM_PATHNAME flag should be passed to fnmatch(). */ TOUCH_FLAG_FNM_PATHNAME = 1, + /** Activates verbose mode. */ TOUCH_FLAG_VERBOSE = 2 }; @@ -1940,12 +1966,23 @@ int com_afs_rm(int fd, int argc, char * const * const argv) return ret; } +/** + * Flags used by the cpsi command. + * + * \sa com_cpsi(). + */ enum cpsi_flags { + /** Whether the lyrics id should be copied. */ CPSI_FLAG_COPY_LYRICS_ID = 1, + /** Whether the image id should be copied. */ CPSI_FLAG_COPY_IMAGE_ID = 2, + /** Whether the lastplayed time should be copied. */ CPSI_FLAG_COPY_LASTPLAYED = 4, + /** Whether the numplayed count should be copied. */ CPSI_FLAG_COPY_NUMPLAYED = 8, + /** Whether the attributes should be copied. */ CPSI_FLAG_COPY_ATTRIBUTES = 16, + /** Activates verbose mode. */ CPSI_FLAG_VERBOSE = 32, }; @@ -2116,6 +2153,16 @@ static int check_audio_file(struct osl_row *row, void *data) return 1; } +/** + * Check the audio file table for inconsistencies. + * + * \param query Unused. + * \param result Contains message string upon return. + * + * This function always succeeds. + * + * \sa com_check(). + */ int aft_check_callback(__a_unused const struct osl_object *query, struct osl_object *result) { struct para_buffer pb = {.buf = NULL}; @@ -2128,8 +2175,6 @@ int aft_check_callback(__a_unused const struct osl_object *query, struct osl_obj } - - /** * Close the audio file table. * @@ -2168,5 +2213,7 @@ int aft_init(struct table_info *ti, const char *db) } PARA_INFO_LOG("failed to open audio file table\n"); audio_file_table = NULL; - return ret == -E_NOENT? 1 : ret; + if (ret >= 0 || is_errno(-ret, ENOENT)) + return 1; + return ret; }