X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=aft.c;h=85ceee9f1d7312c74f29114f63976fc6f5decd51;hp=99b972c9d19a6dfb729bdd0ed56b09f73762ac59;hb=7a711d24a3cae6feba02de127df5ad90cd35c0bb;hpb=54a480aef5bd11e922c3c2339bb207334c170df8 diff --git a/aft.c b/aft.c index 99b972c9..85ceee9f 100644 --- a/aft.c +++ b/aft.c @@ -524,7 +524,10 @@ int get_afsi_of_path(const char *path, struct afs_info *afsi) * \param row Pointer to a row in the audio file table. * \param path Result pointer. * - * \return Positive on success, negative on errors. + * The result is a pointer to mmapped data. The caller must not attempt + * to free it. + * + * \return Standard. */ int get_audio_file_path_of_row(const struct osl_row *row, char **path) { @@ -598,8 +601,7 @@ int get_afhi_of_row(const struct osl_row *row, struct audio_format_info *afhi) /* 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 + size_t size = sizeof(*afd) + 4 * (afd->afhi.chunks_total + 1); PARA_NOTICE_LOG("size: %zu\n", size); @@ -616,8 +618,6 @@ static int save_afd(struct audio_file_data *afd) *(struct audio_file_data *)shm_afd = *afd; buf = shm_afd; buf += sizeof(*afd); - strcpy(buf, afd->path); - buf += path_size; save_chunk_table(&afd->afhi, buf); shm_detach(shm_afd); return shmid; @@ -638,8 +638,6 @@ int load_afd(int shmid, struct audio_file_data *afd) *afd = *(struct audio_file_data *)shm_afd; buf = shm_afd; buf += sizeof(*afd); - afd->path = para_strdup(buf); - buf += strlen(buf) + 1; afd->afhi.chunk_table = para_malloc((afd->afhi.chunks_total + 1) * 4); load_chunk_table(&afd->afhi, buf); shm_detach(shm_afd); @@ -666,12 +664,15 @@ 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, *path; if (ret < 0) return ret; - ret = get_audio_file_path_of_row(aft_row, &afd->path); + ret = get_audio_file_path_of_row(aft_row, &path); if (ret < 0) return ret; + strncpy(afd->path, path, sizeof(afd->path) - 1); + afd->path[sizeof(afd->path) - 1] = '\0'; ret = get_afsi_object_of_row(aft_row, &afsi_obj); if (ret < 0) return ret; @@ -685,7 +686,7 @@ int open_and_update_audio_file(struct osl_row *aft_row, struct audio_file_data * AFTCOL_CHUNKS, &chunk_table_obj); if (ret < 0) return ret; - ret = mmap_full_file(afd->path, O_RDONLY, &map.data, + ret = mmap_full_file(path, O_RDONLY, &map.data, &map.size, &afd->fd); if (ret < 0) goto err; @@ -704,6 +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; @@ -1920,7 +1927,7 @@ int com_touch(int fd, int argc, char * const * const argv) if (ret > 0) { send_buffer(fd, (char *)result.data); free(result.data); - } else + } else if (ret < 0) send_va_buffer(fd, "%s\n", PARA_STRERROR(-ret)); return ret; }