X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=aft.c;h=f81c48569d23a83c6e863f7b23e1d72e7f137926;hp=ff2691f90d127901c77579cdb58aed0b00b82583;hb=152ea84aba06555f8b828fce19d9531e97ff0b21;hpb=61250cf03241bf73662dac3753e44660a572fa2a diff --git a/aft.c b/aft.c index ff2691f9..f81c4856 100644 --- a/aft.c +++ b/aft.c @@ -349,11 +349,13 @@ static void load_afhi(const char *buf, struct audio_format_info *afhi) strcpy(afhi->info_string, buf + AFHI_INFO_STRING_OFFSET); } +//#define SIZEOF_CHUNK_TABLE(afhi) (((afhi)->chunks_total + 1) * sizeof(uint32_t)) + static unsigned sizeof_chunk_info_buf(struct audio_format_info *afhi) { if (!afhi) return 0; - return 4 * afhi->chunks_total + 20; + return 4 * (afhi->chunks_total + 1) + 20; } @@ -376,14 +378,16 @@ enum chunk_info_offsets{ static void save_chunk_table(struct audio_format_info *afhi, char *buf) { int i; - for (i = 0; i < afhi->chunks_total; i++) + + PARA_NOTICE_LOG("%lu chunks\n", afhi->chunks_total); + for (i = 0; i <= afhi->chunks_total; i++) write_u32(buf + 4 * i, afhi->chunk_table[i]); } static void load_chunk_table(struct audio_format_info *afhi, char *buf) { int i; - for (i = 0; i < afhi->chunks_total; i++) + for (i = 0; i <= afhi->chunks_total; i++) afhi->chunk_table[i] = read_u32(buf + 4 * i); } @@ -413,9 +417,9 @@ static int load_chunk_info(struct osl_object *obj, struct audio_format_info *afh 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); - if (afhi->chunks_total * 4 + CHUNK_TABLE_OFFSET > obj->size) + if ((afhi->chunks_total + 1) * 4 + CHUNK_TABLE_OFFSET > obj->size) return -E_BAD_DATA_SIZE; - afhi->chunk_table = para_malloc(afhi->chunks_total * sizeof(size_t)); + afhi->chunk_table = para_malloc((afhi->chunks_total + 1) * 4); load_chunk_table(afhi, buf + CHUNK_TABLE_OFFSET); return 1; } @@ -591,36 +595,12 @@ int get_afhi_of_row(const struct osl_row *row, struct audio_format_info *afhi) return 1; } -#if 0 -/** - * Get the chunk table of an audio file, given a row of the audio file table. - * - * \param row Pointer to a row of the audio file table. - * \param afhi Result pointer. - * - * \return The return value of the underlying call to osl_open_disk_object(). - * - * \sa get_afhi_of_row(). - */ -static int get_chunk_table_of_row(const struct osl_row *row, struct audio_format_info *afhi) -{ - struct osl_object obj; - int ret = osl_open_disk_object(audio_file_table, row, AFTCOL_CHUNKS, - &obj); - if (ret < 0) - return ret; - ret = load_chunk_info(&obj, afhi); - osl_close_disk_object(&obj); - return ret; -} -#endif - /* returns shmid on success */ static int save_afd(struct audio_file_data *afd) { size_t path_size = strlen(afd->path) + 1; size_t size = sizeof(*afd) + path_size - + 4 * afd->afhi.chunks_total; + + 4 * (afd->afhi.chunks_total + 1); PARA_NOTICE_LOG("size: %zu\n", size); int shmid, ret = shm_new(size); @@ -660,7 +640,7 @@ int load_afd(int shmid, struct audio_file_data *afd) buf += sizeof(*afd); afd->path = para_strdup(buf); buf += strlen(buf) + 1; - afd->afhi.chunk_table = para_malloc(afd->afhi.chunks_total * sizeof(size_t)); + afd->afhi.chunk_table = para_malloc((afd->afhi.chunks_total + 1) * 4); load_chunk_table(&afd->afhi, buf); shm_detach(shm_afd); return 1; @@ -686,6 +666,7 @@ int open_and_update_audio_file(struct osl_row *aft_row, struct audio_file_data * int ret = get_hash_of_row(aft_row, &aft_hash); struct afsi_change_event_data aced; struct osl_object map, chunk_table_obj; + char *tmp; if (ret < 0) return ret; @@ -724,7 +705,12 @@ int open_and_update_audio_file(struct osl_row *aft_row, struct audio_file_data * ret = load_chunk_info(&chunk_table_obj, &afd->afhi); if (ret < 0) goto err; - + ret = get_attribute_text(&afd->afsi.attributes, " ", &tmp); + if (ret < 0) + goto err; + tmp[sizeof(afd->attributes_string) - 1] = '\0'; + strcpy(afd->attributes_string, tmp); /* OK */ + free(tmp); aced.aft_row = aft_row; aced.old_afsi = &afd->afsi; afs_event(AFSI_CHANGE, NULL, &aced); @@ -1228,7 +1214,7 @@ out: * full list: list everything, including afsi, afhi, atts as clear text * * */ -int com_afs_ls(int fd, int argc, char * const * const argv) +int com_ls(int fd, int argc, char * const * const argv) { int i, ret; unsigned flags = 0; @@ -2008,7 +1994,7 @@ static int com_rm_callback(const struct osl_object *query, } /* TODO options: -r (recursive) */ -int com_afs_rm(int fd, int argc, char * const * const argv) +int com_rm(int fd, int argc, char * const * const argv) { uint32_t flags = 0; struct osl_object query = {.data = &flags, .size = sizeof(flags)},