Add missing newline in ls output.
[paraslash.git] / aft.c
diff --git a/aft.c b/aft.c
index 6d6cd8d0218c860a3e89032cd91a019b67403953..93c96cb49c8e01bd3e5259e380d413d047f92344 100644 (file)
--- a/aft.c
+++ b/aft.c
@@ -99,7 +99,7 @@ struct ls_widths {
 /** Data passed to the different compare functions (called by qsort()). */
 struct ls_data {
        /** Usual audio format handler information. */
-       struct audio_format_info afhi;
+       struct afh_info afhi;
        /** Audio file selector information. */
        struct afs_info afsi;
        /** The full path of the audio file. */
@@ -110,16 +110,27 @@ struct ls_data {
        HASH_TYPE *hash;
 };
 
+/** Data passed from the ls command handler to its callback function. */
 struct ls_options {
+       /** The given command line flags. */
        unsigned flags;
+       /** The sorting method given at the command line. */
        enum ls_sorting_method sorting;
+       /** The given listing mode (short, long, verbose, mbox). */
        enum ls_listing_mode mode;
+       /** The arguments passed to the ls command. */
        char **patterns;
+       /** Number of non-option arguments. */
        int num_patterns;
+       /** Used for long listing mode to align the output fields. */
        struct ls_widths widths;
+       /** Size of the \a data array. */
        uint32_t array_size;
+       /** Number of used entries in the data array. */
        uint32_t num_matching_paths;
+       /** Array of matching entries. */
        struct ls_data *data;
+       /** Used to sort the array. */
        struct ls_data **data_ptr;
 };
 
@@ -312,22 +323,28 @@ enum afhi_offsets {
        AFHI_BITRATE_OFFSET = 4,
        /** Position of the frequency. */
        AFHI_FREQUENCY_OFFSET = 8,
+       /** Location of the audio file header. */
+       AFHI_HEADER_OFFSET_OFFSET = 12,
+       /* Length of the audio file header. Zero means: No header. */
+       AFHI_HEADER_LEN_OFFSET = 16,
        /** Number of channels is stored here. */
-       AFHI_CHANNELS_OFFSET = 12,
+       AFHI_CHANNELS_OFFSET = 20,
+       /** EOF timeout in ms. */
+       AFHI_EOF_OFFSET = 21,
        /** The tag info position. */
-       AFHI_INFO_STRING_OFFSET = 13,
+       AFHI_INFO_STRING_OFFSET = 23,
        /** Minimal on-disk size of a valid afhi struct. */
-       MIN_AFHI_SIZE = 14
+       MIN_AFHI_SIZE = 24
 };
 
-static unsigned sizeof_afhi_buf(const struct audio_format_info *afhi)
+static unsigned sizeof_afhi_buf(const struct afh_info *afhi)
 {
        if (!afhi)
                return 0;
        return strlen(afhi->info_string) + MIN_AFHI_SIZE;
 }
 
-static void save_afhi(struct audio_format_info *afhi, char *buf)
+static void save_afhi(struct afh_info *afhi, char *buf)
 {
        if (!afhi)
                return;
@@ -335,23 +352,29 @@ static void save_afhi(struct audio_format_info *afhi, char *buf)
                afhi->seconds_total);
        write_u32(buf + AFHI_BITRATE_OFFSET, afhi->bitrate);
        write_u32(buf + AFHI_FREQUENCY_OFFSET, afhi->frequency);
+       write_u32(buf + AFHI_HEADER_OFFSET_OFFSET, afhi->header_offset);
+       write_u32(buf + AFHI_HEADER_LEN_OFFSET, afhi->header_len);
        write_u8(buf + AFHI_CHANNELS_OFFSET, afhi->channels);
+       write_u16(buf + AFHI_EOF_OFFSET, tv2ms(&afhi->eof_tv));
        strcpy(buf + AFHI_INFO_STRING_OFFSET, afhi->info_string); /* OK */
        PARA_DEBUG_LOG("last byte written: %p\n", buf + AFHI_INFO_STRING_OFFSET + strlen(afhi->info_string));
 }
 
-static void load_afhi(const char *buf, struct audio_format_info *afhi)
+static void load_afhi(const char *buf, struct afh_info *afhi)
 {
        afhi->seconds_total = read_u32(buf + AFHI_SECONDS_TOTAL_OFFSET);
        afhi->bitrate = read_u32(buf + AFHI_BITRATE_OFFSET);
        afhi->frequency = read_u32(buf + AFHI_FREQUENCY_OFFSET);
        afhi->channels = read_u8(buf + AFHI_CHANNELS_OFFSET);
+       afhi->header_offset = read_u32(buf + AFHI_HEADER_OFFSET_OFFSET);
+       afhi->header_len = read_u32(buf + AFHI_HEADER_LEN_OFFSET);
+       ms2tv(read_u16(buf + AFHI_EOF_OFFSET), &afhi->eof_tv);
        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)
+static unsigned sizeof_chunk_info_buf(struct afh_info *afhi)
 {
        if (!afhi)
                return 0;
@@ -375,7 +398,7 @@ enum chunk_info_offsets{
        CHUNK_TABLE_OFFSET = 20,
 };
 
-static void save_chunk_table(struct audio_format_info *afhi, char *buf)
+static void save_chunk_table(struct afh_info *afhi, char *buf)
 {
        int i;
 
@@ -384,7 +407,7 @@ static void save_chunk_table(struct audio_format_info *afhi, char *buf)
                write_u32(buf + 4 * i, afhi->chunk_table[i]);
 }
 
-static void load_chunk_table(struct audio_format_info *afhi, char *buf)
+static void load_chunk_table(struct afh_info *afhi, char *buf)
 {
        int i;
        for (i = 0; i <= afhi->chunks_total; i++)
@@ -392,7 +415,7 @@ static void load_chunk_table(struct audio_format_info *afhi, char *buf)
 }
 
 /* TODO: audio format handlers could just produce this */
-static void save_chunk_info(struct audio_format_info *afhi, char *buf)
+static void save_chunk_info(struct afh_info *afhi, char *buf)
 {
        if (!afhi)
                return;
@@ -404,7 +427,7 @@ static void save_chunk_info(struct audio_format_info *afhi, char *buf)
        save_chunk_table(afhi, buf + CHUNK_TABLE_OFFSET);
 }
 
-static int load_chunk_info(struct osl_object *obj, struct audio_format_info *afhi)
+static int load_chunk_info(struct osl_object *obj, struct afh_info *afhi)
 {
        char *buf = obj->data;
 
@@ -587,7 +610,7 @@ static int get_hash_of_row(const struct osl_row *row, HASH_TYPE **hash)
  *
  * \sa get_chunk_table_of_row().
  */
-int get_afhi_of_row(const struct osl_row *row, struct audio_format_info *afhi)
+int get_afhi_of_row(const struct osl_row *row, struct afh_info *afhi)
 {
        struct osl_object obj;
        int ret = osl_get_object(audio_file_table, row, AFTCOL_AFHI,
@@ -708,8 +731,9 @@ int open_and_update_audio_file(struct osl_row *aft_row, struct audio_file_data *
        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 */
+       assert(tmp);
+       strncpy(afd->attributes_string, tmp, sizeof(afd->attributes_string));
+       afd->attributes_string[sizeof(afd->attributes_string) - 1] = '\0';
        free(tmp);
 
        aced.aft_row = aft_row;
@@ -821,7 +845,7 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts,
        char duration_buf[30]; /* nobody has an audio file long enough to overflow this */
        char score_buf[30] = "";
        struct afs_info *afsi = &d->afsi;
-       struct audio_format_info *afhi = &d->afhi;
+       struct afh_info *afhi = &d->afhi;
        struct ls_widths *w = &opts->widths;
        int have_score = opts->flags & LS_FLAG_ADMISSIBLE_ONLY;
        char asc_hash[2 * HASH_SIZE + 1];
@@ -919,7 +943,7 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts,
                        "Received: from\nTo: bar\nFrom: a\n"
                        "Subject: %s\n\n" /* path */
                        "%s%s%s" /* score */
-                       "%s"
+                       "%s\n" /* attributes */
                        "hash: %s\n"
                        "image_id: %s\n"
                        "lyrics_id: %s\n"
@@ -1210,12 +1234,8 @@ out:
 }
 
 /*
- * TODO: flags -h (sort by hash) -lm (list in mbox format)
- *
- * long list: list hash, attributes as (xx--x-x-), file size, lastplayed
- * full list: list everything, including afsi, afhi, atts as clear text
- *
- * */
+ * TODO: flags -h (sort by hash)
+ */
 int com_ls(int fd, int argc, char * const * const argv)
 {
        int i, ret;
@@ -1362,7 +1382,7 @@ enum aft_row_offsets {
 /* never save the afsi, as the server knows it too. Note that afhi might be NULL.
  * In this case, afhi won't be stored in the buffer  */
 static void save_audio_file_info(HASH_TYPE *hash, const char *path,
-               struct audio_format_info *afhi, uint32_t flags,
+               struct afh_info *afhi, uint32_t flags,
                uint8_t audio_format_num, struct osl_object *obj)
 {
        size_t path_len = strlen(path) + 1;
@@ -1571,8 +1591,11 @@ out:
        return 1;
 }
 
+/** Used by com_add(). */
 struct private_add_data {
+       /** The socket file descriptor. */
        int fd;
+       /** The given add flags. */
        uint32_t flags;
 };
 
@@ -1610,7 +1633,7 @@ static int add_one_audio_file(const char *path, const void *private_data)
        int ret, ret2;
        uint8_t format_num = -1;
        const struct private_add_data *pad = private_data;
-       struct audio_format_info afhi, *afhi_ptr = NULL;
+       struct afh_info afhi, *afhi_ptr = NULL;
        struct osl_row *pb = NULL, *hs = NULL; /* path brother/hash sister */
        struct osl_object map, obj = {.data = NULL}, query, result = {.data = NULL};
        HASH_TYPE hash[HASH_SIZE];
@@ -1779,16 +1802,25 @@ enum touch_flags {
        TOUCH_FLAG_VERBOSE = 2
 };
 
+/** Options used by com_touch(). */
 struct com_touch_options {
+       /** New num_played value. */
        int32_t num_played;
+       /** New last played count. */
        int64_t last_played;
+       /** new lyrics id. */
        int32_t lyrics_id;
+       /** new image id. */
        int32_t image_id;
+       /** command line flags (see \ref touch_flags). */
        unsigned flags;
 };
 
+/** Data passed to the action handler of com_touch(). */
 struct touch_action_data {
+       /** Command line options (see \ref com_touch_options). */
        struct com_touch_options *cto;
+       /** Message buffer. */
        struct para_buffer pb;
 };
 
@@ -1933,22 +1965,30 @@ int com_touch(int fd, int argc, char * const * const argv)
        return ret;
 }
 
+/** Flags for com_rm(). */
 enum rm_flags {
+       /** -v */
        RM_FLAG_VERBOSE = 1,
+       /** -f */
        RM_FLAG_FORCE = 2,
+       /** -p */
        RM_FLAG_FNM_PATHNAME = 4
 };
 
-struct com_rm_data {
+/** Data passed to the action handler of com_rm(). */
+struct com_rm_action_data {
+       /** Command line flags ((see \ref rm_flags). */
        uint32_t flags;
+       /** Message buffer. */
        struct para_buffer pb;
+       /** Number of audio files removed. */
        unsigned num_removed;
 };
 
 static int remove_audio_file(__a_unused struct osl_table *table,
                struct osl_row *row, const char *name, void *data)
 {
-       struct com_rm_data *crd = data;
+       struct com_rm_action_data *crd = data;
        int ret;
 
        if (crd->flags & RM_FLAG_VERBOSE)
@@ -1965,7 +2005,7 @@ static int remove_audio_file(__a_unused struct osl_table *table,
 static int com_rm_callback(const struct osl_object *query,
                __a_unused struct osl_object *result)
 {
-       struct com_rm_data crd = {.flags = *(uint32_t *)query->data};
+       struct com_rm_action_data crd = {.flags = *(uint32_t *)query->data};
        int ret;
        struct pattern_match_data pmd = {
                .table = audio_file_table,
@@ -2057,10 +2097,15 @@ enum cpsi_flags {
        CPSI_FLAG_VERBOSE = 32,
 };
 
+/** Data passed to the action handler of com_cpsi(). */
 struct cpsi_action_data {
+       /** command line flags (see \ref cpsi_flags). */
        unsigned flags;
+       /** Number of audio files changed. */
        unsigned num_copied;
+       /** Message buffer. */
        struct para_buffer pb;
+       /** Values are copied from here. */
        struct afs_info source_afsi;
 };
 
@@ -2254,7 +2299,7 @@ int aft_check_callback(__a_unused const struct osl_object *query, struct osl_obj
 /**
  * Close the audio file table.
  *
- * \param flags Ususal flags that are passed to osl_close_table().
+ * \param flags Usual flags that are passed to osl_close_table().
  *
  * \sa osl_close_table().
  */