X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=aft.c;h=3d10ced25949d61e370eae617950dd7ff316b7e6;hb=8694f85b70488f2cdb48a1e853bdfae68dabc99f;hp=f6cfddf904d06a4b89acf826ce6ee63a0f44686b;hpb=7ba6e107eb38c5ceb6f66aac21ad6a5a3afa49ad;p=paraslash.git diff --git a/aft.c b/aft.c index f6cfddf9..3d10ced2 100644 --- 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) @@ -1728,7 +1740,7 @@ static int get_row_pointer_from_result(struct osl_object *result, void *private) static int add_one_audio_file(const char *path, void *private_data) { - int ret, send_ret = 1; + int ret, send_ret = 1, fd; uint8_t format_num = -1; struct private_add_data *pad = private_data; struct afh_info afhi, *afhi_ptr = NULL; @@ -1752,7 +1764,7 @@ static int add_one_audio_file(const char *path, void *private_data) goto out_free; } /* We still want to add this file. Compute its hash. */ - ret = mmap_full_file(path, O_RDONLY, &map.data, &map.size, NULL); + 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); @@ -1777,7 +1789,7 @@ static int add_one_audio_file(const char *path, void *private_data) * there is a hash sister and FORCE was not given. */ if (!hs || (pad->flags & ADD_FLAG_FORCE)) { - ret = compute_afhi(path, map.data, map.size, &afhi); + ret = compute_afhi(path, map.data, map.size, fd, &afhi); if (ret < 0) goto out_unmap; format_num = ret; @@ -1795,14 +1807,17 @@ static int add_one_audio_file(const char *path, void *private_data) goto out_free; out_unmap: + close(fd); munmap(map.data, map.size); out_free: if (ret < 0 && send_ret >= 0) 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; }