]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
Merge branch 'maint'
authorAndre Noll <maan@tuebingen.mpg.de>
Sun, 12 Feb 2023 16:17:24 +0000 (17:17 +0100)
committerAndre Noll <maan@tuebingen.mpg.de>
Sun, 12 Feb 2023 16:17:24 +0000 (17:17 +0100)
Two fixes for the chunk table output of the ls command.

* maint:
  server: ls -l=c: Don't print chunk table in case of dynamic chunks.
  server: Fix ls -l=c.

1  2 
aft.c

diff --combined aft.c
index 0009a54f3c5b1f169381ff631f20b141da71f75b,a15a1d2cc673326385a795e3d9900ddd0fb7cb37..6aeb0589dbef919a4fcae2bb9d5a8de58f9a9a60
--- 1/aft.c
--- 2/aft.c
+++ b/aft.c
@@@ -42,7 -42,7 +42,7 @@@ struct ls_data 
   */
  static struct osl_table *audio_file_table; /* NULL if table not open */
  static struct osl_row *current_aft_row; /* NULL if no audio file open */
 -static unsigned char current_hash[HASH_SIZE]; /* only used on sighup */
 +static unsigned char current_hash[HASH2_SIZE]; /* only used on sighup */
  
  static char *status_items;
  static char *parser_friendly_status_items;
@@@ -226,7 -226,7 +226,7 @@@ static struct osl_column_description af
                .storage_flags = OSL_RBTREE | OSL_FIXED_SIZE | OSL_UNIQUE,
                .name = "hash",
                .compare_function = aft_hash_compare,
 -              .data_size = HASH_SIZE
 +              .data_size = HASH2_SIZE
        },
        [AFTCOL_PATH] = {
                .storage_type = OSL_MAPPED_STORAGE,
  };
  
  static struct osl_table_description audio_file_table_desc = {
 -      .name = "audio_files",
 +      .name = "audio-files",
        .num_columns = NUM_AFT_COLUMNS,
        .flags = OSL_LARGE_TABLE,
        .column_descriptions = aft_cols
@@@ -412,7 -412,7 +412,7 @@@ static void load_chunk_table(struct afh
                return;
        }
        sz  = PARA_MIN(((size_t)afhi->chunks_total + 1) * 4, ct->size) + 1;
 -      afhi->chunk_table = para_malloc(sz);
 +      afhi->chunk_table = alloc(sz);
        for (i = 0; i <= afhi->chunks_total && i * 4 + 3 < ct->size; i++)
                afhi->chunk_table[i] = read_u32(ct->data + 4 * i);
  }
@@@ -442,7 -442,7 +442,7 @@@ int aft_get_row_of_path(const char *pat
   */
  static int aft_get_row_of_hash(unsigned char *hash, struct osl_row **row)
  {
 -      const struct osl_object obj = {.data = hash, .size = HASH_SIZE};
 +      const struct osl_object obj = {.data = hash, .size = HASH2_SIZE};
        return osl(osl_get_row(audio_file_table, AFTCOL_HASH, &obj, row));
  }
  
@@@ -779,17 -779,18 +779,17 @@@ static void write_image_items(struct pa
  static void write_filename_items(struct para_buffer *b, const char *path,
                bool basename)
  {
 -      char *val;
 +      const char *slash;
  
        if (basename) {
                WRITE_STATUS_ITEM(b, SI_basename, "%s\n", path);
                return;
        }
        WRITE_STATUS_ITEM(b, SI_path, "%s\n", path);
 -      val = para_basename(path);
 -      WRITE_STATUS_ITEM(b, SI_basename, "%s\n", val? val : "");
 -      val = para_dirname(path);
 -      WRITE_STATUS_ITEM(b, SI_directory, "%s\n", val? val : "");
 -      free(val);
 +      slash = strrchr(path, '/');
 +      WRITE_STATUS_ITEM(b, SI_basename, "%s\n", slash? slash + 1 : path);
 +      WRITE_STATUS_ITEM(b, SI_directory, "%.*s\n",
 +              slash? (int)(slash - path) : (int)strlen(path), path);
  }
  
  static int print_chunk_table(struct ls_data *d, struct para_buffer *b)
        int ret, i;
        char *buf;
  
+       para_printf(b, "%s\nchunk_time: %lu:%lu\n", d->path,
+               (long unsigned) d->afhi.chunk_tv.tv_sec,
+               (long unsigned) d->afhi.chunk_tv.tv_usec
+       );
+       if (afh_supports_dynamic_chunks(d->afsi.audio_format_id))
+               return 0;
        ret = aft_get_row_of_hash(d->hash, &aft_row);
        if (ret < 0)
                return ret;
                AFTCOL_CHUNKS, &chunk_table_obj));
        if (ret < 0)
                return ret;
-       para_printf(b, "%s\n"
-               "chunk_time: %lu:%lu\nchunk_offsets: ",
-               d->path,
-               (long unsigned) d->afhi.chunk_tv.tv_sec,
-               (long unsigned) d->afhi.chunk_tv.tv_usec
-       );
+       para_printf(b, "chunk_offsets: ");
        buf = chunk_table_obj.data;
        for (
                i = 0;
@@@ -837,7 -839,7 +838,7 @@@ static int print_list_item(struct ls_da
        char duration_buf[30]; /* nobody has an audio file long enough to overflow this */
        struct afs_info *afsi = &d->afsi;
        struct afh_info *afhi = &d->afhi;
 -      char asc_hash[2 * HASH_SIZE + 1];
 +      char asc_hash[2 * HASH2_SIZE + 1];
  
        if (opts->mode == LS_MODE_SHORT) {
                para_printf(b, "%s\n", d->path);
                goto out;
        }
        if (opts->mode == LS_MODE_MBOX) {
 -              const char *bn = para_basename(d->path);
 +              const char *slash = strrchr(d->path, '/');
                para_printf(b,
                        "From foo@localhost %s\n"
                        "Received: from\nTo: bar\nFrom: a\n"
                        "Subject: %s\n\n",
                        last_played_time,
 -                      bn? bn : "?");
 +                      slash? slash + 1 : "?");
        }
        write_filename_items(b, d->path, lls_opt_given(r_b));
        if (lls_opt_given(r_a))
@@@ -1040,7 -1042,7 +1041,7 @@@ out
   */
  int open_and_update_audio_file(int *fd)
  {
 -      unsigned char file_hash[HASH_SIZE];
 +      unsigned char file_hash[HASH2_SIZE];
        struct osl_object afsi_obj;
        struct afs_info new_afsi;
        int ret;
@@@ -1066,7 -1068,7 +1067,7 @@@ again
        if (ret < 0)
                return ret;
        if (!d->hash)
 -              d->hash = para_malloc(HASH_SIZE);
 +              d->hash = alloc(HASH_SIZE);
        memcpy(d->hash, tmp_hash, HASH_SIZE);
        free(d->path);
        ret = get_audio_file_path_of_row(current_aft_row, &d->path);
        ret = mmap_full_file(d->path, O_RDONLY, &map.data, &map.size, fd);
        if (ret < 0)
                goto out;
 -      hash_function(map.data, map.size, file_hash);
 +      hash2_function(map.data, map.size, file_hash);
        ret = hash_compare(file_hash, d->hash);
        para_munmap(map.data, map.size);
        if (ret) {
@@@ -1140,7 -1142,7 +1141,7 @@@ out
  static int ls_hash_compare(const void *a, const void *b)
  {
        struct ls_data *d1 = *(struct ls_data **)a, *d2 = *(struct ls_data **)b;
 -      return memcmp(d1->hash, d2->hash, HASH_SIZE);
 +      return memcmp(d1->hash, d2->hash, HASH2_SIZE);
  }
  
  static int ls_audio_format_compare(const void *a, const void *b)
@@@ -1224,7 -1226,7 +1225,7 @@@ static int sort_matching_paths(struct l
        int (*compar)(const void *, const void *);
        int i;
  
 -      options->data_ptr = para_malloc(nmemb * sizeof(*options->data_ptr));
 +      options->data_ptr = arr_alloc(nmemb, sizeof(*options->data_ptr));
        for (i = 0; i < nmemb; i++)
                options->data_ptr[i] = options->data + i;
  
@@@ -1317,8 -1319,8 +1318,8 @@@ static int prepare_ls_row(struct osl_ro
        if (options->num_matching_paths > options->array_size) {
                options->array_size++;
                options->array_size *= 2;
 -              options->data = para_realloc(options->data, options->array_size
 -                      sizeof(*options->data));
 +              options->data = arr_realloc(options->data, options->array_size,
 +                      sizeof(*options->data));
        }
        d = options->data + tmp;
        ret = get_afsi_of_row(aft_row, &d->afsi);
@@@ -1375,7 -1377,7 +1376,7 @@@ static int com_ls_callback(struct afs_c
  
        aca->pbout.flags = (opts->mode == LS_MODE_PARSER)? PBF_SIZE_PREFIX : 0;
        if (admissible_only(opts))
 -              ret = admissible_file_loop(opts, prepare_ls_row);
 +              ret = score_loop(prepare_ls_row, opts);
        else
                ret = osl(osl_rbtree_loop(audio_file_table, AFTCOL_PATH, opts,
                        prepare_ls_row));
@@@ -1424,7 -1426,7 +1425,7 @@@ static int com_ls(struct command_contex
        ret = lls_serialize_parse_result(lpr, cmd, NULL, &query.size);
        assert(ret >= 0);
        query.size += sizeof(*opts);
 -      query.data = para_malloc(query.size);
 +      query.data = alloc(query.size);
        opts = query.data;
        memset(opts, 0, sizeof(*opts));
        slpr = query.data + sizeof(*opts);
                else if (!strcmp(val, "m") || !strcmp(val, "mbox"))
                        opts->mode = LS_MODE_MBOX;
                else if (!strcmp(val, "c") || !strcmp(val, "chunk-table"))
-                       opts->mode = LS_MODE_MBOX;
+                       opts->mode = LS_MODE_CHUNKS;
                else if (!strcmp(val, "p") || !strcmp(val, "parser-friendly"))
                        opts->mode = LS_MODE_PARSER;
                else {
 -                      ret = -E_AFT_SYNTAX;
 +                      ret = -ERRNO_TO_PARA_ERROR(EINVAL);
                        goto out;
                }
        }
                else if (!strcmp(val, "h") || !strcmp(val, "hash"))
                        opts->sorting = LS_SORT_BY_HASH;
                else {
 -                      ret = -E_AFT_SYNTAX;
 +                      ret = -ERRNO_TO_PARA_ERROR(EINVAL);
                        goto out;
                }
        }
@@@ -1535,7 -1537,7 +1536,7 @@@ enum com_add_buffer_offsets 
        /** The hash of the audio file being added. */
        CAB_HASH_OFFSET = 13,
        /** Start of the path of the audio file. */
 -      CAB_PATH_OFFSET = (CAB_HASH_OFFSET + HASH_SIZE),
 +      CAB_PATH_OFFSET = (CAB_HASH_OFFSET + HASH2_SIZE),
  };
  
  /*
@@@ -1553,12 -1555,12 +1554,12 @@@ static void save_add_callback_buffer(un
        size_t afhi_size = sizeof_afhi_buf(afhi);
        size_t size = CAB_PATH_OFFSET + path_len + afhi_size
                + sizeof_chunk_table(afhi) + slpr_size;
 -      char *buf = para_malloc(size);
 +      char *buf = alloc(size);
        uint32_t pos;
  
        assert(size <= ~(uint32_t)0);
        write_u8(buf + CAB_AUDIO_FORMAT_ID_OFFSET, audio_format_num);
 -      memcpy(buf + CAB_HASH_OFFSET, hash, HASH_SIZE);
 +      memcpy(buf + CAB_HASH_OFFSET, hash, HASH2_SIZE);
        strcpy(buf + CAB_PATH_OFFSET, path);
        pos = CAB_PATH_OFFSET + path_len;
        write_u32(buf + CAB_AFHI_OFFSET_POS, pos);
@@@ -1634,7 -1636,7 +1635,7 @@@ static int com_add_callback(struct afs_
        struct osl_row *hs;
        struct osl_object objs[NUM_AFT_COLUMNS];
        unsigned char *hash;
 -      char asc[2 * HASH_SIZE + 1];
 +      char asc[2 * HASH2_SIZE + 1];
        int ret;
        char afsi_buf[AFSI_SIZE];
        char *slpr = buf + read_u32(buf + CAB_LPR_OFFSET);
        hash = (unsigned char *)buf + CAB_HASH_OFFSET;
        hash_to_asc(hash, asc);
        objs[AFTCOL_HASH].data = buf + CAB_HASH_OFFSET;
 -      objs[AFTCOL_HASH].size = HASH_SIZE;
 +      objs[AFTCOL_HASH].size = HASH2_SIZE;
  
        path = buf + CAB_PATH_OFFSET;
        objs[AFTCOL_PATH].data = path;
        objs[AFTCOL_CHUNKS].data = buf + chunks_offset;
        objs[AFTCOL_CHUNKS].size = aca->query.size - chunks_offset;
        if (pb && !hs) { /* update pb's hash */
 -              char old_asc[2 * HASH_SIZE + 1];
 +              char old_asc[2 * HASH2_SIZE + 1];
                unsigned char *old_hash;
                ret = get_hash_of_row(pb, &old_hash);
                if (ret < 0)
        ret = afs_event(AUDIO_FILE_ADD, &aca->pbout, aft_row);
  out:
        if (ret < 0)
 -              para_printf(&aca->pbout, "could not add %s\n", path);
 +              afs_error(aca, "could not add %s\n", path);
        lls_free_parse_result(aca->lpr, cmd);
        return ret;
  }
@@@ -1819,7 -1821,7 +1820,7 @@@ static int add_one_audio_file(const cha
        struct afh_info afhi, *afhi_ptr = NULL;
        struct osl_row *pb = NULL, *hs = NULL; /* path brother/hash sister */
        struct osl_object map, obj = {.data = NULL}, query;
 -      unsigned char hash[HASH_SIZE];
 +      unsigned char hash[HASH2_SIZE];
        bool a_given = SERVER_CMD_OPT_GIVEN(ADD, ALL, pad->lpr);
        bool f_given = SERVER_CMD_OPT_GIVEN(ADD, FORCE, pad->lpr);
        bool l_given = SERVER_CMD_OPT_GIVEN(ADD, LAZY, pad->lpr);
        ret = mmap_full_file(path, O_RDONLY, &map.data, &map.size, &fd);
        if (ret < 0)
                goto out_free;
 -      hash_function(map.data, map.size, hash);
 +      hash2_function(map.data, map.size, hash);
  
        /* Check whether the database contains a file with the same hash. */
        query.data = hash;
 -      query.size = HASH_SIZE;
 +      query.size = HASH2_SIZE;
        ret = send_callback_request(hash_sister_callback, &query,
                get_row_pointer_from_result, &hs);
        if (ret < 0)
@@@ -1979,12 -1981,12 +1980,12 @@@ static int touch_audio_file(__a_unused 
  
        ret = get_afsi_object_of_row(row, &obj);
        if (ret < 0) {
 -              para_printf(&aca->pbout, "cannot touch %s\n", name);
 +              afs_error(aca, "cannot touch %s\n", name);
                return ret;
        }
        ret = load_afsi(&old_afsi, &obj);
        if (ret < 0) {
 -              para_printf(&aca->pbout, "cannot touch %s\n", name);
 +              afs_error(aca, "cannot touch %s\n", name);
                return ret;
        }
        new_afsi = old_afsi;
@@@ -2038,7 -2040,7 +2039,7 @@@ static int com_touch_callback(struct af
                uint32_t id = lls_uint32_val(0, r_i);
                ret = img_get_name_by_id(id, NULL);
                if (ret < 0) {
 -                      para_printf(&aca->pbout, "invalid image ID: %u\n", id);
 +                      afs_error(aca, "invalid image ID: %u\n", id);
                        return ret;
                }
        }
                uint32_t id = lls_uint32_val(0, r_y);
                ret = lyr_get_name_by_id(id, NULL);
                if (ret < 0) {
 -                      para_printf(&aca->pbout, "invalid lyrics ID: %u\n", id);
 +                      afs_error(aca, "invalid lyrics ID: %u\n", id);
                        return ret;
                }
        }
@@@ -2090,7 -2092,7 +2091,7 @@@ static int remove_audio_file(__a_unuse
                return ret;
        ret = osl(osl_del_row(audio_file_table, row));
        if (ret < 0)
 -              para_printf(&aca->pbout, "cannot remove %s\n", name);
 +              afs_error(aca, "cannot remove %s\n", name);
        return ret;
  }
  
@@@ -2320,13 -2322,13 +2321,13 @@@ static int com_setatt_callback(struct a
                                goto out; /* no attribute modifier given */
                        goto set_atts;
                }
 -              p = para_malloc(len);
 +              p = alloc(len);
                memcpy(p, arg, len - 1);
                p[len - 1] = '\0';
                ret = get_attribute_bitnum_by_name(p, &bitnum);
                free(p);
                if (ret < 0) {
 -                      para_printf(&aca->pbout, "invalid argument: %s\n", arg);
 +                      afs_error(aca, "invalid argument: %s\n", arg);
                        goto out;
                }
                if (c == '+')
@@@ -2516,7 -2518,7 +2517,7 @@@ static void aft_close(void
                        PARA_WARNING_LOG("hash lookup failure\n");
                        current_aft_row = NULL;
                } else
 -                      memcpy(current_hash, p, HASH_SIZE);
 +                      memcpy(current_hash, p, HASH2_SIZE);
        }
        osl_close_table(audio_file_table, OSL_MARK_CLEAN);
        audio_file_table = NULL;
@@@ -2648,10 -2650,15 +2649,10 @@@ static int aft_event_handler(enum afs_e
        }
  }
  
 -/**
 - * Initialize the audio file table.
 - *
 - * \param t Pointer to the structure to be initialized.
 - */
 -void aft_init(struct afs_table *t)
 -{
 -      t->open = aft_open;
 -      t->close = aft_close;
 -      t->create = aft_create;
 -      t->event_handler = aft_event_handler;
 -}
 +/** The audio file table contains information about known audio files. */
 +const struct afs_table_operations aft_ops = {
 +      .open = aft_open,
 +      .close = aft_close,
 +      .create = aft_create,
 +      .event_handler = aft_event_handler,
 +};