/*
- * Copyright (C) 2007-2008 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2007-2009 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
/** \file aft.c Audio file table functions. */
#include <dirent.h> /* readdir() */
+#include <osl.h>
#include "para.h"
#include "error.h"
#include "string.h"
#include "vss.h"
#include "fd.h"
#include "ipc.h"
+#include "portable_io.h"
static struct osl_table *audio_file_table;
NUM_AFT_COLUMNS
};
+/**
+ * Compare two osl objects pointing to hash values.
+ *
+ * \param obj1 Pointer to the first hash object.
+ * \param obj2 Pointer to the second hash object.
+ *
+ * \return The values required for an osl compare function.
+ *
+ * \sa osl_compare_func, uint32_compare().
+ */
+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);
+}
+
static struct osl_column_description aft_cols[] = {
[AFTCOL_HASH] = {
.storage_type = OSL_MAPPED_STORAGE,
.storage_flags = OSL_RBTREE | OSL_FIXED_SIZE | OSL_UNIQUE,
.name = "hash",
- .compare_function = osl_hash_compare,
+ .compare_function = aft_hash_compare,
.data_size = HASH_SIZE
},
[AFTCOL_PATH] = {
CHUNK_TV_TV_USEC_OFFSET = 36,
/** Number of channels is stored here. (1 byte) */
AFHI_CHANNELS_OFFSET = 40,
- /** EOF timeout in ms. (2 byte) */
- AFHI_EOF_OFFSET = 41,
/** The tag info position. */
- AFHI_INFO_STRING_OFFSET = 43,
+ AFHI_INFO_STRING_OFFSET = 41,
/** Minimal on-disk size of a valid afhi struct. */
- MIN_AFHI_SIZE = 44
+ MIN_AFHI_SIZE = 47, /* at least 6 null bytes for techinfo/tags */
};
static unsigned sizeof_afhi_buf(const struct afh_info *afhi)
{
if (!afhi)
return 0;
- return strlen(afhi->info_string) + MIN_AFHI_SIZE;
+ return MIN_AFHI_SIZE
+ + strlen(afhi->techinfo)
+ + strlen(afhi->tags.artist)
+ + strlen(afhi->tags.title)
+ + strlen(afhi->tags.year)
+ + strlen(afhi->tags.album)
+ + strlen(afhi->tags.comment);
}
static void save_afhi(struct afh_info *afhi, char *buf)
{
+ char *p;
+
if (!afhi)
return;
write_u32(buf + AFHI_SECONDS_TOTAL_OFFSET, afhi->seconds_total);
write_u32(buf + HEADER_OFFSET_OFFSET, afhi->header_offset);
write_u32(buf + CHUNK_TV_TV_SEC_OFFSET, afhi->chunk_tv.tv_sec);
write_u32(buf + CHUNK_TV_TV_USEC_OFFSET, afhi->chunk_tv.tv_usec);
- write_u16(buf + AFHI_EOF_OFFSET, tv2ms(&afhi->eof_tv));
- strcpy(buf + AFHI_INFO_STRING_OFFSET, afhi->info_string); /* OK */
+ p = buf + AFHI_INFO_STRING_OFFSET;
+ /* The sprintf's below are OK as our caller made sure that buf is large enough */
+ p += sprintf(p, "%s", afhi->techinfo) + 1;
+ p += sprintf(p, "%s", afhi->tags.artist) + 1;
+ p += sprintf(p, "%s", afhi->tags.title) + 1;
+ p += sprintf(p, "%s", afhi->tags.year) + 1;
+ p += sprintf(p, "%s", afhi->tags.album) + 1;
+ sprintf(p, "%s", afhi->tags.comment);
}
static void load_afhi(const char *buf, struct afh_info *afhi)
afhi->header_offset = read_u32(buf + HEADER_OFFSET_OFFSET);
afhi->chunk_tv.tv_sec = read_u32(buf + CHUNK_TV_TV_SEC_OFFSET);
afhi->chunk_tv.tv_usec = read_u32(buf + CHUNK_TV_TV_USEC_OFFSET);
- ms2tv(read_u16(buf + AFHI_EOF_OFFSET), &afhi->eof_tv);
- afhi->info_string = para_strdup(buf + AFHI_INFO_STRING_OFFSET);
+ afhi->techinfo = buf + AFHI_INFO_STRING_OFFSET;
+ afhi->tags.artist = afhi->techinfo + strlen(afhi->techinfo) + 1;
+ afhi->tags.title = afhi->tags.artist + strlen(afhi->tags.artist) + 1;
+ afhi->tags.year = afhi->tags.title + strlen(afhi->tags.title) + 1;
+ afhi->tags.album = afhi->tags.year + strlen(afhi->tags.year) + 1;
+ afhi->tags.comment = afhi->tags.album + strlen(afhi->tags.album) + 1;
}
static unsigned sizeof_chunk_table(struct afh_info *afhi)
* \param path The full path of the audio file.
* \param row Result pointer.
*
- * \return The return value of the underlying call to osl_get_row().
+ * \return Standard.
*/
int aft_get_row_of_path(const char *path, struct osl_row **row)
{
struct osl_object obj = {.data = (char *)path, .size = strlen(path) + 1};
- return osl_get_row(audio_file_table, AFTCOL_PATH, &obj, row);
+ return osl(osl_get_row(audio_file_table, AFTCOL_PATH, &obj, row));
}
/**
* Get the row of the audio file table corresponding to the given hash value.
*
* \param hash The hash value of the desired audio file.
- * \param row resul pointer.
+ * \param row Result pointer.
*
- * \return The return value of the underlying call to osl_get_row().
+ * \return Standard.
*/
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_get_row(audio_file_table, AFTCOL_HASH, &obj, row);
+ return osl(osl_get_row(audio_file_table, AFTCOL_HASH, &obj, row));
}
/**
* \param row Pointer to a row in the audio file table.
* \param obj Result pointer.
*
- * \return The return value of the underlying call to osl_get_object().
+ * \return Standard.
*/
int get_afsi_object_of_row(const struct osl_row *row, struct osl_object *obj)
{
- return osl_get_object(audio_file_table, row, AFTCOL_AFSI, obj);
+ return osl(osl_get_object(audio_file_table, row, AFTCOL_AFSI, obj));
}
/**
int get_audio_file_path_of_row(const struct osl_row *row, char **path)
{
struct osl_object path_obj;
- int ret = osl_get_object(audio_file_table, row, AFTCOL_PATH,
- &path_obj);
+ int ret = osl(osl_get_object(audio_file_table, row, AFTCOL_PATH,
+ &path_obj));
if (ret < 0)
return ret;
*path = path_obj.data;
*
* \sa get_hash_of_row().
*/
-static int get_hash_object_of_aft_row(const struct osl_row *row, struct osl_object *obj)
+static int get_hash_object_of_aft_row(const struct osl_row *row,
+ struct osl_object *obj)
{
- return osl_get_object(audio_file_table, row, AFTCOL_HASH, obj);
+ return osl(osl_get_object(audio_file_table, row, AFTCOL_HASH, obj));
}
/**
int get_afhi_of_row(const struct osl_row *row, struct afh_info *afhi)
{
struct osl_object obj;
- int ret = osl_get_object(audio_file_table, row, AFTCOL_AFHI,
- &obj);
+ int ret = osl(osl_get_object(audio_file_table, row, AFTCOL_AFHI,
+ &obj));
if (ret < 0)
return ret;
load_afhi(obj.data, afhi);
static int save_afd(struct audio_file_data *afd)
{
size_t size = sizeof(*afd) + sizeof_chunk_table(&afd->afhi);
-
- PARA_DEBUG_LOG("size: %zu\n", size);
int shmid, ret = shm_new(size);
void *shm_afd;
char *buf;
return 1;
}
-/**
- * Mmap the given audio file and update statistics.
- *
- * \param aft_row Determines the audio file to be opened and updated.
- * \param score The score of the audio file.
- * \param afd Result pointer.
- *
- * On success, the numplayed field of the audio file selector info is increased
- * and the lastplayed time is set to the current time. Finally, the score of
- * the audio file is updated.
- *
- * \return Positive shmid on success, negative on errors.
- */
-int open_and_update_audio_file(struct osl_row *aft_row, long score,
- struct audio_file_data *afd)
-{
- HASH_TYPE *aft_hash, file_hash[HASH_SIZE];
- struct osl_object afsi_obj;
- struct afs_info old_afsi, new_afsi;
- int ret = get_hash_of_row(aft_row, &aft_hash);
- struct afsi_change_event_data aced;
- struct osl_object map, chunk_table_obj;
- char *path;
-
- if (ret < 0)
- return ret;
- ret = get_audio_file_path_of_row(aft_row, &path);
- if (ret < 0)
- return ret;
- ret = get_afsi_object_of_row(aft_row, &afsi_obj);
- if (ret < 0)
- return ret;
- ret = load_afsi(&old_afsi, &afsi_obj);
- if (ret < 0)
- return ret;
- ret = get_afhi_of_row(aft_row, &afd->afhi);
- if (ret < 0)
- return ret;
- afd->afhi.chunk_table = NULL;
- ret = osl_open_disk_object(audio_file_table, aft_row,
- AFTCOL_CHUNKS, &chunk_table_obj);
- if (ret < 0)
- goto err;
- ret = mmap_full_file(path, O_RDONLY, &map.data,
- &map.size, &afd->fd);
- if (ret < 0)
- goto err;
- hash_function(map.data, map.size, file_hash);
- ret = hash_compare(file_hash, aft_hash);
- para_munmap(map.data, map.size);
- if (ret) {
- ret = -E_HASH_MISMATCH;
- goto err;
- }
- new_afsi = old_afsi;
- new_afsi.num_played++;
- new_afsi.last_played = time(NULL);
- save_afsi(&new_afsi, &afsi_obj); /* in-place update */
-
- load_chunk_table(&afd->afhi, chunk_table_obj.data);
- {
- struct ls_data d = {
- .afhi = afd->afhi, /* struct copy */
- .afsi = old_afsi,
- .path = path,
- .score = score,
- .hash = file_hash
- };
- struct para_buffer pb = {.max_size = VERBOSE_LS_OUTPUT_SIZE - 1};
- ret = make_status_items(&d, &pb); /* frees info string */
- afd->afhi.info_string = NULL;
- if (ret < 0)
- goto err;
- strncpy(afd->verbose_ls_output, pb.buf, VERBOSE_LS_OUTPUT_SIZE);
- afd->verbose_ls_output[VERBOSE_LS_OUTPUT_SIZE - 1] = '\0';
- free(pb.buf);
- }
- aced.aft_row = aft_row;
- aced.old_afsi = &old_afsi;
- afs_event(AFSI_CHANGE, NULL, &aced);
- ret = save_afd(afd);
-err:
- free(afd->afhi.chunk_table);
- free(afd->afhi.info_string);
- osl_close_disk_object(&chunk_table_obj);
- return ret;
-}
-
static int get_local_time(uint64_t *seconds, char *buf, size_t size,
time_t current_time, enum ls_listing_mode lm)
{
#define GET_NUM_DIGITS(x, num) { \
typeof((x)) _tmp = PARA_ABS(x); \
*num = 1; \
- if ((x)) \
+ if ((_tmp)) \
while ((_tmp) > 9) { \
(_tmp) /= 10; \
(*num)++; \
"%s: %lu\n" /* seconds total */
"%s: %s\n" /* last played time */
"%s: %d\n" /* num_played */
- "%s: %u\n" /* ampplification */
- "%s" /* tag info */
+ "%s: %u\n" /* amplification */
"%s: %lu\n" /* chunk time */
- "%s: %lu\n", /* num chunks */
+ "%s: %lu\n" /* num chunks */
+ "%s: %s\n" /* techinfo */
+ "%s: %s\n" /* artist */
+ "%s: %s\n" /* title */
+ "%s: %s\n" /* year */
+ "%s: %s\n" /* album */
+ "%s: %s\n", /* comment */
filename_lines,
have_score? status_item_list[SI_SCORE] : "",
have_score? ": " : "",
status_item_list[SI_LAST_PLAYED], last_played_time,
status_item_list[SI_NUM_PLAYED], afsi->num_played,
status_item_list[SI_AMPLIFICATION], afsi->amp,
- afhi->info_string,
status_item_list[SI_CHUNK_TIME], tv2ms(&afhi->chunk_tv),
- status_item_list[SI_NUM_CHUNKS], afhi->chunks_total
+ status_item_list[SI_NUM_CHUNKS], afhi->chunks_total,
+ status_item_list[SI_TECHINFO], afhi->techinfo,
+ status_item_list[SI_ARTIST], afhi->tags.artist,
+ status_item_list[SI_TITLE], afhi->tags.title,
+ status_item_list[SI_YEAR], afhi->tags.year,
+ status_item_list[SI_ALBUM], afhi->tags.album,
+ status_item_list[SI_COMMENT], afhi->tags.comment
);
if (ret < 0)
goto out;
free(image_lines);
free(filename_lines);
out:
- free(afhi->info_string);
return ret;
}
+/**
+ * Write a list of audio-file related status items with empty values.
+ *
+ * \param buf Result pointer.
+ *
+ * This is used by vss when currently no audio file is open.
+ */
void make_empty_status_items(char *buf)
{
sprintf(buf,
"%s: \n" /* seconds total */
"%s: \n" /* num played */
"%s: \n" /* last played */
- "%s: \n" /* audio file info */
- "%s: \n" /* taginfo1 */
- "%s: \n" /* taginfo2 */
+ "%s: \n" /* techinfo */
+ "%s: \n" /* artist */
+ "%s: \n" /* title */
+ "%s: \n" /* year */
+ "%s: \n" /* album */
+ "%s: \n" /* comment */
"%s: \n" /* amplification */
,
status_item_list[SI_PATH],
status_item_list[SI_SECONDS_TOTAL],
status_item_list[SI_NUM_PLAYED],
status_item_list[SI_LAST_PLAYED],
- status_item_list[SI_AUDIO_FILE_INFO],
- status_item_list[SI_TAGINFO1],
- status_item_list[SI_TAGINFO2],
+ status_item_list[SI_TECHINFO],
+ status_item_list[SI_ARTIST],
+ status_item_list[SI_TITLE],
+ status_item_list[SI_YEAR],
+ status_item_list[SI_ALBUM],
+ status_item_list[SI_COMMENT],
status_item_list[SI_AMPLIFICATION]
);
}
-int make_status_items(struct ls_data *d, struct para_buffer *pb)
+static int make_status_items(struct audio_file_data *afd,
+ struct afs_info *afsi, char *path, long score,
+ HASH_TYPE *hash)
{
+ struct ls_data d = {
+ .afhi = afd->afhi,
+ .afsi = *afsi,
+ .path = path,
+ .score = score,
+ .hash = hash
+ };
struct ls_options opts = {
.flags = LS_FLAG_FULL_PATH | LS_FLAG_ADMISSIBLE_ONLY,
.mode = LS_MODE_VERBOSE,
};
+ struct para_buffer pb = {.max_size = VERBOSE_LS_OUTPUT_SIZE - 1};
time_t current_time;
+ int ret;
time(¤t_time);
- return print_list_item(d, &opts, pb, current_time);
+ ret = print_list_item(&d, &opts, &pb, current_time);
+ if (ret < 0)
+ goto out;
+ strncpy(afd->verbose_ls_output, pb.buf, VERBOSE_LS_OUTPUT_SIZE);
+ afd->verbose_ls_output[VERBOSE_LS_OUTPUT_SIZE - 1] = '\0';
+out:
+ free(pb.buf);
+ return ret;
}
+/**
+ * Mmap the given audio file and update statistics.
+ *
+ * \param aft_row Determines the audio file to be opened and updated.
+ * \param score The score of the audio file.
+ * \param afd Result pointer.
+ *
+ * On success, the numplayed field of the audio file selector info is increased
+ * and the lastplayed time is set to the current time. Finally, the score of
+ * the audio file is updated.
+ *
+ * \return Positive shmid on success, negative on errors.
+ */
+int open_and_update_audio_file(struct osl_row *aft_row, long score,
+ struct audio_file_data *afd)
+{
+ HASH_TYPE *aft_hash, file_hash[HASH_SIZE];
+ struct osl_object afsi_obj;
+ struct afs_info old_afsi, new_afsi;
+ int ret = get_hash_of_row(aft_row, &aft_hash);
+ struct afsi_change_event_data aced;
+ struct osl_object map, chunk_table_obj;
+ char *path;
+
+ if (ret < 0)
+ return ret;
+ ret = get_audio_file_path_of_row(aft_row, &path);
+ if (ret < 0)
+ return ret;
+ ret = get_afsi_object_of_row(aft_row, &afsi_obj);
+ if (ret < 0)
+ return ret;
+ ret = load_afsi(&old_afsi, &afsi_obj);
+ if (ret < 0)
+ return ret;
+ ret = get_afhi_of_row(aft_row, &afd->afhi);
+ if (ret < 0)
+ return ret;
+ afd->afhi.chunk_table = NULL;
+ ret = osl_open_disk_object(audio_file_table, aft_row,
+ AFTCOL_CHUNKS, &chunk_table_obj);
+ if (ret < 0)
+ goto err;
+ ret = mmap_full_file(path, O_RDONLY, &map.data,
+ &map.size, &afd->fd);
+ if (ret < 0)
+ goto err;
+ hash_function(map.data, map.size, file_hash);
+ ret = hash_compare(file_hash, aft_hash);
+ para_munmap(map.data, map.size);
+ if (ret) {
+ ret = -E_HASH_MISMATCH;
+ goto err;
+ }
+ new_afsi = old_afsi;
+ new_afsi.num_played++;
+ new_afsi.last_played = time(NULL);
+ save_afsi(&new_afsi, &afsi_obj); /* in-place update */
+
+ load_chunk_table(&afd->afhi, chunk_table_obj.data);
+ ret = make_status_items(afd, &old_afsi, path, score, file_hash);
+ if (ret < 0)
+ goto err;
+ aced.aft_row = aft_row;
+ aced.old_afsi = &old_afsi;
+ afs_event(AFSI_CHANGE, NULL, &aced);
+ ret = save_afd(afd);
+err:
+ free(afd->afhi.chunk_table);
+ osl_close_disk_object(&chunk_table_obj);
+ return ret;
+}
static int ls_audio_format_compare(const void *a, const void *b)
{
GET_NUM_DIGITS(d->afsi.num_played, &num_digits);
w->num_played_width = PARA_MAX(w->num_played_width, num_digits);
/* get the number of chars to print this amount of time */
- tmp = get_duration_width(d->afhi.seconds_total);
- w->duration_width = PARA_MAX(w->duration_width, tmp);
+ num_digits = get_duration_width(d->afhi.seconds_total);
+ w->duration_width = PARA_MAX(w->duration_width, num_digits);
GET_NUM_DIGITS(d->afsi.amp, &num_digits);
w->amp_width = PARA_MAX(w->amp_width, num_digits);
if (options->flags & LS_FLAG_ADMISSIBLE_ONLY) {
}
return 1;
err:
- free(d->afhi.info_string);
return ret;
}
if (opts->flags & LS_FLAG_ADMISSIBLE_ONLY)
ret = admissible_file_loop(opts, prepare_ls_row);
else
- ret = osl_rbtree_loop(audio_file_table, AFTCOL_PATH, opts,
- prepare_ls_row);
+ ret = osl(osl_rbtree_loop(audio_file_table, AFTCOL_PATH, opts,
+ prepare_ls_row));
if (ret < 0)
goto out;
- ret = opts->num_patterns? -E_NO_MATCH : 0;
if (!opts->num_matching_paths)
goto out;
ret = sort_matching_paths(opts);
* \param private_data An arbitrary data pointer, passed to \a func.
* \param func The custom function to be called.
*
- * \return The return value of the underlying call to osl_rbtree_loop().
+ * \return Standard.
*/
int audio_file_loop(void *private_data, osl_rbtree_loop_func *func)
{
- return osl_rbtree_loop(audio_file_table, AFTCOL_HASH, private_data,
- func);
+ return osl(osl_rbtree_loop(audio_file_table, AFTCOL_HASH, private_data,
+ func));
}
static struct osl_row *find_hash_sister(HASH_TYPE *hash)
struct afs_info default_afsi = {.last_played = 0};
struct para_buffer msg = {.max_size = SHMMAX,
.max_size_handler = pass_buffer_as_shm, .private_data = &fd};
+ uint16_t afhi_offset, chunks_offset;
hash = (HASH_TYPE *)buf + CAB_HASH_OFFSET;
hash_to_asc(hash, asc);;
PARA_INFO_LOG("request to add %s\n", path);
hs = find_hash_sister(hash);
ret = aft_get_row_of_path(path, &pb);
- if (ret < 0 && ret != -E_RB_KEY_NOT_FOUND)
+ if (ret < 0 && ret != -OSL_ERRNO_TO_PARA_ERROR(E_OSL_RB_KEY_NOT_FOUND))
goto out;
if (hs && pb && hs == pb && !(flags & ADD_FLAG_FORCE)) {
if (flags & ADD_FLAG_VERBOSE)
if (ret < 0)
goto out;
}
- ret = osl_del_row(audio_file_table, pb);
+ ret = osl(osl_del_row(audio_file_table, pb));
if (ret < 0)
goto out;
pb = NULL;
}
/* file rename, update hs' path */
if (flags & ADD_FLAG_VERBOSE) {
- ret = osl_get_object(audio_file_table, hs,
- AFTCOL_PATH, &obj);
+ ret = osl(osl_get_object(audio_file_table, hs,
+ AFTCOL_PATH, &obj));
if (ret < 0)
goto out;
ret = para_printf(&msg, "renamed from %s\n", (char *)obj.data);
if (ret < 0)
goto out;
}
- ret = osl_update_object(audio_file_table, hs, AFTCOL_PATH,
- &objs[AFTCOL_PATH]);
+ ret = osl(osl_update_object(audio_file_table, hs, AFTCOL_PATH,
+ &objs[AFTCOL_PATH]));
if (ret < 0)
goto out;
afs_event(AUDIO_FILE_RENAME, &msg, hs);
goto out;
}
/* no hs or force mode, child must have sent afhi */
- uint16_t afhi_offset = read_u16(buf + CAB_AFHI_OFFSET_POS);
- uint16_t chunks_offset = read_u16(buf + CAB_CHUNKS_OFFSET_POS);
+ afhi_offset = read_u16(buf + CAB_AFHI_OFFSET_POS);
+ chunks_offset = read_u16(buf + CAB_CHUNKS_OFFSET_POS);
objs[AFTCOL_AFHI].data = buf + afhi_offset;
objs[AFTCOL_AFHI].size = chunks_offset - afhi_offset;
if (ret < 0)
goto out;
}
- ret = osl_update_object(audio_file_table, row, AFTCOL_AFHI,
- &objs[AFTCOL_AFHI]);
+ ret = osl(osl_update_object(audio_file_table, row, AFTCOL_AFHI,
+ &objs[AFTCOL_AFHI]));
if (ret < 0)
goto out;
- ret = osl_update_object(audio_file_table, row, AFTCOL_CHUNKS,
- &objs[AFTCOL_CHUNKS]);
+ ret = osl(osl_update_object(audio_file_table, row, AFTCOL_CHUNKS,
+ &objs[AFTCOL_CHUNKS]));
if (ret < 0)
goto out;
afs_event(AFHI_CHANGE, &msg, row);
objs[AFTCOL_AFSI].data = &afsi_buf;
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);
+ ret = osl(osl_add_and_get_row(audio_file_table, objs, &aft_row));
afs_event(AUDIO_FILE_ADD, &msg, aft_row);
out:
if (ret < 0)
- ret = para_printf(&msg, "%s\n", para_strerror(-ret));
+ para_printf(&msg, "%s\n", para_strerror(-ret));
if (msg.offset)
pass_buffer_as_shm(msg.buf, msg.offset, &fd);
free(msg.buf);
query.size = strlen(path) + 1;
ret = send_callback_request(path_brother_callback, &query,
get_row_pointer_from_result, &pb);
- if (ret < 0 && ret != -E_RB_KEY_NOT_FOUND)
+ if (ret < 0 && ret != -OSL_ERRNO_TO_PARA_ERROR(E_OSL_RB_KEY_NOT_FOUND))
goto out_free;
ret = 1;
if (pb && (pad->flags & ADD_FLAG_LAZY)) { /* lazy is really cheap */
afhi_ptr = &afhi;
}
munmap(map.data, map.size);
+ close(fd);
if (pad->flags & ADD_FLAG_VERBOSE) {
send_ret = send_va_buffer(pad->fd, "adding %s\n", path);
if (send_ret < 0)
free(obj.data);
if (afhi_ptr) {
free(afhi_ptr->chunk_table);
- free(afhi_ptr->info_string);
+ free(afhi_ptr->techinfo);
+ free(afhi_ptr->tags.artist);
+ free(afhi_ptr->tags.title);
+ free(afhi_ptr->tags.year);
+ free(afhi_ptr->tags.album);
+ free(afhi_ptr->tags.comment);
}
/* Stop adding files only on send errors. */
return send_ret;
struct osl_row *row, const char *name, void *data)
{
struct com_rm_action_data *crd = data;
- int ret, ret2;
+ int ret;
if (crd->flags & RM_FLAG_VERBOSE) {
ret = para_printf(&crd->pb, "removing %s\n", name);
return ret;
}
afs_event(AUDIO_FILE_REMOVE, &crd->pb, row);
- ret = osl_del_row(audio_file_table, row);
+ ret = osl(osl_del_row(audio_file_table, row));
if (ret < 0)
- ret2 = para_printf(&crd->pb, "%s: %s\n", name,
- para_strerror(-ret));
+ para_printf(&crd->pb, "%s: %s\n", name, para_strerror(-ret));
else
crd->num_removed++;
return ret;
pmd.fnmatch_flags |= FNM_PATHNAME;
ret = for_each_matching_row(&pmd);
if (ret < 0) {
- ret = para_printf(&crd.pb, "%s\n", para_strerror(-ret));
+ para_printf(&crd.pb, "%s\n", para_strerror(-ret));
return;
}
if (!crd.num_removed && !(crd.flags & RM_FLAG_FORCE))
};
int ret;
char *source_path = (char *)query->data + sizeof(cad.flags);
-
- ret = get_afsi_of_path(source_path, &cad.source_afsi);
- if (ret < 0)
- goto out;
struct pattern_match_data pmd = {
.table = audio_file_table,
.loop_col_num = AFTCOL_HASH,
.data = &cad,
.action = copy_selector_info
};
+
+ ret = get_afsi_of_path(source_path, &cad.source_afsi);
+ if (ret < 0)
+ goto out;
ret = for_each_matching_row(&pmd);
out:
if (ret < 0)
- ret = para_printf(&cad.pb, "%s\n", para_strerror(-ret));
+ para_printf(&cad.pb, "%s\n", para_strerror(-ret));
else if (cad.flags & CPSI_FLAG_VERBOSE) {
if (cad.num_copied)
- ret = para_printf(&cad.pb, "copied requested afsi from %s "
- "to %u files\n",
- source_path, cad.num_copied);
+ para_printf(&cad.pb, "copied requested afsi from %s "
+ "to %u files\n", source_path, cad.num_copied);
else
- ret = para_printf(&cad.pb, "nothing copied\n");
+ para_printf(&cad.pb, "nothing copied\n");
}
if (cad.pb.offset)
pass_buffer_as_shm(cad.pb.buf, cad.pb.offset, &fd);
int ret;
audio_file_table_desc.dir = dir;
- ret = osl_open_table(&audio_file_table_desc, &audio_file_table);
+ ret = osl(osl_open_table(&audio_file_table_desc, &audio_file_table));
if (ret >= 0) {
unsigned num;
osl_get_num_rows(audio_file_table, &num);
}
PARA_INFO_LOG("failed to open audio file table\n");
audio_file_table = NULL;
- if (ret >= 0 || is_errno(-ret, ENOENT))
+ if (ret >= 0 || ret == -OSL_ERRNO_TO_PARA_ERROR(E_OSL_NOENT))
return 1;
return ret;
}
static int aft_create(const char *dir)
{
audio_file_table_desc.dir = dir;
- return osl_create_table(&audio_file_table_desc);
+ return osl(osl_create_table(&audio_file_table_desc));
}
static int clear_attribute(struct osl_row *row, void *data)