X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=aft.c;h=3283dda82d309769fa569d7ab6b32b299d368b4f;hp=daa9c730484437f58b56dca863d9d0b617d5c418;hb=711b364a5a88932de99aa559ce4a683b26dc2afc;hpb=e5e59d29676be79d4938e8871b46f12f6a5fca66 diff --git a/aft.c b/aft.c index daa9c730..3283dda8 100644 --- a/aft.c +++ b/aft.c @@ -627,94 +627,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) { @@ -1068,18 +980,110 @@ void make_empty_status_items(char *buf) ); } -int make_status_items(struct ls_data *d, struct para_buffer *pb) +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, /* struct copy */ + .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; time(¤t_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) { @@ -1308,7 +1312,6 @@ static void com_ls_callback(int fd, const struct osl_object *query) 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); @@ -1723,7 +1726,7 @@ static void com_add_callback(int fd, const struct osl_object *query) 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); @@ -2138,7 +2141,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); @@ -2148,8 +2151,7 @@ static int remove_audio_file(__a_unused struct osl_table *table, afs_event(AUDIO_FILE_REMOVE, &crd->pb, row); ret = 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; @@ -2178,7 +2180,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)) @@ -2328,14 +2330,13 @@ static void com_cpsi_callback(int fd, const struct osl_object *query) 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);