Fix checking of return values from osl_open().
[paraslash.git] / aft.c
diff --git a/aft.c b/aft.c
index 2d40c235df8cf51fab7c2134e6bce1499769c9bf..f425b6d3d81431b61fe0541742905c4af6b1af96 100644 (file)
--- a/aft.c
+++ b/aft.c
@@ -1,5 +1,5 @@
 /*
- * 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.
  */
@@ -7,6 +7,7 @@
 /** \file aft.c Audio file table functions. */
 
 #include <dirent.h> /* readdir() */
+#include <osl.h>
 #include "para.h"
 #include "error.h"
 #include "string.h"
@@ -20,6 +21,7 @@
 #include "vss.h"
 #include "fd.h"
 #include "ipc.h"
+#include "portable_io.h"
 
 static struct osl_table *audio_file_table;
 
@@ -217,12 +219,27 @@ enum audio_file_table_columns {
        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] = {
@@ -416,13 +433,13 @@ static void load_chunk_table(struct afh_info *afhi, char *buf)
  * \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));
 }
 
 /**
@@ -431,12 +448,12 @@ int aft_get_row_of_path(const char *path, struct osl_row **row)
  * \param hash The hash value of the desired audio file.
  * \param row resul 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));
 }
 
 /**
@@ -445,11 +462,11 @@ int aft_get_row_of_hash(HASH_TYPE *hash, struct osl_row **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));
 }
 
 /**
@@ -518,8 +535,8 @@ int get_afsi_of_path(const char *path, struct afs_info *afsi)
 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;
@@ -536,9 +553,10 @@ int get_audio_file_path_of_row(const struct osl_row *row, char **path)
  *
  * \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));
 }
 
 /**
@@ -576,8 +594,8 @@ static int get_hash_of_row(const struct osl_row *row, HASH_TYPE **hash)
 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);
@@ -588,8 +606,6 @@ int get_afhi_of_row(const struct osl_row *row, struct afh_info *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;
@@ -628,94 +644,6 @@ int load_afd(int shmid, struct audio_file_data *afd)
        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)
 {
@@ -742,7 +670,7 @@ static int get_local_time(uint64_t *seconds, char *buf, size_t size,
 #define GET_NUM_DIGITS(x, num) { \
        typeof((x)) _tmp = PARA_ABS(x); \
        *num = 1; \
-       if ((x)) \
+       if ((_tmp)) \
                while ((_tmp) > 9) { \
                        (_tmp) /= 10; \
                        (*num)++; \
@@ -1009,6 +937,13 @@ out:
        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,
@@ -1062,18 +997,170 @@ void make_empty_status_items(char *buf)
        );
 }
 
-int make_status_items(struct ls_data *d, struct para_buffer *pb)
+static void fixup_taginfo(char *begin, char *end)
+{
+       char *p = begin;
+
+       for (;;) {
+               p = strchr(p, '\n');
+               if (!p)
+                       break;
+               if (p >= end - 1)
+                       break;
+               *p = ' ';
+               p++;
+       }
+}
+
+/* crap, remove this ASAP. */
+static int fixup_info_string(char *info_string)
 {
+       char *t1, *t2, *end;
+
+       if (strncmp(info_string, "audio_file_info:", 16))
+               return -ERRNO_TO_PARA_ERROR(EINVAL);
+       t1 = strstr(info_string, "\ntaginfo1:");
+       if (!t1)
+               return -ERRNO_TO_PARA_ERROR(EINVAL);
+       t2 = strstr(info_string, "\ntaginfo2: ");
+       if (!t2)
+               return -ERRNO_TO_PARA_ERROR(EINVAL);
+
+       end = t2 + strlen(t2) + 1;
+       fixup_taginfo(info_string + 16, t1);
+       fixup_taginfo(t1 + 10, t2);
+       fixup_taginfo(t2 + 10, end);
+
+       if (t1 - info_string < 80 && t2 - t1 < 80 && end - t2 < 80)
+               return 0;
+       if (t1 - info_string >= 80) {
+               memmove(info_string + 80, t1, end - t1);
+               t1 = info_string + 80;
+               t2 -= t1 - info_string - 80;
+               end -= t1 - info_string - 80;
+       }
+       if (t2 - t1 >= 80) {
+               memmove(t1 + 80, t2, end - t2);
+               end -= t2 - t1 - 80;
+               t2 = t1 + 80;
+       }
+       if (end - t2 >= 80) {
+               t2[78] = '\n';
+               t2[79] = '\0';
+       }
+       return 1;
+}
+
+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;
 
+       ret = fixup_info_string(afd->afhi.info_string);
+       if (ret < 0) {
+               PARA_WARNING_LOG("ignoring invalid tag info\n");
+               afd->afhi.info_string[0] = '\0';
+       } else if (ret)
+               PARA_NOTICE_LOG("truncated overlong tag info\n");
        time(&current_time);
-       return print_list_item(d, &opts, pb, current_time);
+       ret = print_list_item(&d, &opts, &pb, current_time); /* frees info string */
+       afd->afhi.info_string = NULL;
+       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);
+       free(afd->afhi.info_string);
+       osl_close_disk_object(&chunk_table_obj);
+       return ret;
+}
 
 static int ls_audio_format_compare(const void *a, const void *b)
 {
@@ -1261,8 +1348,8 @@ static int prepare_ls_row(struct osl_row *row, void *ls_opts)
        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) {
@@ -1298,11 +1385,10 @@ static void com_ls_callback(int fd, const struct osl_object *query)
        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);
@@ -1448,12 +1534,12 @@ int com_ls(int fd, int argc, char * const * const argv)
  * \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)
@@ -1599,6 +1685,7 @@ static void com_add_callback(int fd, const struct osl_object *query)
        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);;
@@ -1612,7 +1699,7 @@ static void com_add_callback(int fd, const struct osl_object *query)
        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)
@@ -1629,23 +1716,23 @@ static void com_add_callback(int fd, const struct osl_object *query)
                                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);
@@ -1653,8 +1740,8 @@ static void com_add_callback(int fd, const struct osl_object *query)
                        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;
@@ -1689,12 +1776,12 @@ static void com_add_callback(int fd, const struct osl_object *query)
                        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);
@@ -1712,11 +1799,11 @@ static void com_add_callback(int fd, const struct osl_object *query)
        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);
@@ -1775,7 +1862,7 @@ static int add_one_audio_file(const char *path, void *private_data)
        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 */
@@ -2131,7 +2218,7 @@ static int remove_audio_file(__a_unused struct osl_table *table,
                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);
@@ -2139,10 +2226,9 @@ static int remove_audio_file(__a_unused struct osl_table *table,
                        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;
@@ -2171,7 +2257,7 @@ static void com_rm_callback(int fd, const struct osl_object *query)
                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))
@@ -2304,10 +2390,6 @@ static void com_cpsi_callback(int fd, const struct osl_object *query)
        };
        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,
@@ -2318,17 +2400,20 @@ static void com_cpsi_callback(int fd, const struct osl_object *query)
                .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);
@@ -2480,7 +2565,7 @@ static int aft_open(const char *dir)
        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);
@@ -2489,7 +2574,7 @@ static int aft_open(const char *dir)
        }
        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;
 }
@@ -2497,7 +2582,7 @@ static int aft_open(const char *dir)
 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)