Make mp3_seek_next_header() more readable.
[paraslash.git] / aft.c
diff --git a/aft.c b/aft.c
index f6cfddf904d06a4b89acf826ce6ee63a0f44686b..5bedc9281b4f23872ac329e01cce16452d786cc3 100644 (file)
--- a/aft.c
+++ b/aft.c
@@ -377,7 +377,7 @@ static void load_afhi(const char *buf, struct afh_info *afhi)
        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)
@@ -660,11 +660,11 @@ int open_and_update_audio_file(struct osl_row *aft_row, long score,
        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)
@@ -684,14 +684,15 @@ int open_and_update_audio_file(struct osl_row *aft_row, long score,
        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);
@@ -704,6 +705,7 @@ int open_and_update_audio_file(struct osl_row *aft_row, long score,
        ret = save_afd(afd);
 err:
        free(afd->afhi.chunk_table);
+       free(afd->afhi.info_string);
        osl_close_disk_object(&chunk_table_obj);
        return ret;
 }
@@ -872,15 +874,19 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts,
        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)
@@ -890,7 +896,7 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts,
        }
 
        if (opts->mode == LS_MODE_LONG) {
-               return para_printf(b,
+               ret = para_printf(b,
                        "%s"    /* score */
                        "%s "   /* attributes */
                        "%*d "  /* image_id  */
@@ -916,6 +922,7 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts,
                        last_played_time,
                        d->path
                );
+               goto out;
        }
        hash_to_asc(d->hash, asc_hash);
        att_lines = make_attribute_lines(att_buf, afsi);
@@ -931,7 +938,7 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts,
                        last_played_time,
                        bn? bn : "?");
                if (ret < 0)
-                       return ret;
+                       goto out;
        }
        ret = para_printf(b,
                "%s" /* filename stuff */
@@ -973,7 +980,7 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts,
                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);
@@ -987,6 +994,8 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts,
        free(lyrics_lines);
        free(image_lines);
        free(filename_lines);
+out:
+       free(afhi->info_string);
        return ret;
 }
 
@@ -1221,7 +1230,7 @@ static int prepare_ls_row(struct osl_row *row, void *ls_opts)
        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);
@@ -1243,6 +1252,9 @@ static int prepare_ls_row(struct osl_row *row, void *ls_opts)
                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)
@@ -1801,8 +1813,10 @@ out_free:
                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;
 }