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);
- strcpy(afhi->info_string, buf + AFHI_INFO_STRING_OFFSET);
+ afhi->info_string = para_strdup(buf + AFHI_INFO_STRING_OFFSET);
}
static unsigned sizeof_chunk_table(struct afh_info *afhi)
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)
- return ret;
- afd->afhi.chunk_table = NULL;
+ goto err;
ret = mmap_full_file(path, O_RDONLY, &map.data,
&map.size, &afd->fd);
if (ret < 0)
load_chunk_table(&afd->afhi, chunk_table_obj.data);
{
struct ls_data d = {
- .afhi = afd->afhi,
+ .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);
+ 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);
ret = save_afd(afd);
err:
free(afd->afhi.chunk_table);
+ free(afd->afhi.info_string);
osl_close_disk_object(&chunk_table_obj);
return ret;
}
char asc_hash[2 * HASH_SIZE + 1];
char *att_lines, *lyrics_lines, *image_lines, *filename_lines;
- if (opts->mode == LS_MODE_SHORT)
- return para_printf(b, "%s\n", d->path);
- if (opts->mode == LS_MODE_CHUNKS)
- return print_chunk_table(d, b);
+ if (opts->mode == LS_MODE_SHORT) {
+ ret = para_printf(b, "%s\n", d->path);
+ goto out;
+ }
+ if (opts->mode == LS_MODE_CHUNKS) {
+ ret = print_chunk_table(d, b);
+ goto out;
+ }
get_attribute_bitmap(&afsi->attributes, att_buf);
ret = get_local_time(&afsi->last_played, last_played_time,
sizeof(last_played_time), current_time, opts->mode);
if (ret < 0)
- return ret;
+ goto out;
get_duration_buf(afhi->seconds_total, duration_buf, opts);
if (have_score) {
if (opts->mode == LS_MODE_LONG)
}
if (opts->mode == LS_MODE_LONG) {
- return para_printf(b,
+ ret = para_printf(b,
"%s" /* score */
"%s " /* attributes */
"%*d " /* image_id */
last_played_time,
d->path
);
+ goto out;
}
hash_to_asc(d->hash, asc_hash);
att_lines = make_attribute_lines(att_buf, afsi);
last_played_time,
bn? bn : "?");
if (ret < 0)
- return ret;
+ goto out;
}
ret = para_printf(b,
"%s" /* filename stuff */
status_item_list[SI_NUM_CHUNKS], afhi->chunks_total
);
if (ret < 0)
- return ret;
+ goto out;
if (opts->mode == LS_MODE_MBOX) {
struct osl_object lyrics_def;
lyr_get_def_by_id(afsi->lyrics_id, &lyrics_def);
free(lyrics_lines);
free(image_lines);
free(filename_lines);
+out:
+ free(afhi->info_string);
return ret;
}
d->path = path;
ret = get_hash_of_row(aft_row, &d->hash);
if (ret < 0)
- return ret;
+ goto err;
w = &options->widths;
GET_NUM_DIGITS(d->afsi.image_id, &num_digits);
w->image_id_width = PARA_MAX(w->image_id_width, num_digits);
d->score = score;
}
return 1;
+err:
+ free(d->afhi.info_string);
+ return ret;
}
static void com_ls_callback(int fd, const struct osl_object *query)
send_ret = send_va_buffer(pad->fd, "failed to add %s (%s)\n", path,
para_strerror(-ret));
free(obj.data);
- if (afhi_ptr)
+ if (afhi_ptr) {
free(afhi_ptr->chunk_table);
+ free(afhi_ptr->info_string);
+ }
/* Stop adding files only on send errors. */
return send_ret;
}
static void vss_eof(struct vss_task *vsst)
{
- char *tmp;
-
mmd->stream_start = *now;
if (!vsst->map)
return;
mmd->afd.afhi.chunk_tv.tv_usec = 0;
free(mmd->afd.afhi.chunk_table);
mmd->afd.afhi.chunk_table = NULL;
- tmp = make_message("%s:\n%s:\n%s:\n", status_item_list[SI_AUDIO_FILE_INFO],
+ free(mmd->afd.afhi.info_string);
+ mmd->afd.afhi.info_string = make_message("%s:\n%s:\n%s:\n", status_item_list[SI_AUDIO_FILE_INFO],
status_item_list[SI_TAGINFO1], status_item_list[SI_TAGINFO2]);
- strncpy(mmd->afd.afhi.info_string, tmp, sizeof(mmd->afd.afhi.info_string));
- mmd->afd.afhi.info_string[sizeof(mmd->afd.afhi.info_string) - 1] = '\0';
make_empty_status_items(mmd->afd.verbose_ls_output);
- free(tmp);
mmd->mtime = 0;
mmd->size = 0;
mmd->events++;