Use sideband also for challenge response.
[paraslash.git] / afh.c
diff --git a/afh.c b/afh.c
index c5d7aec296a7a44b2fedfd2532ad838f89654e6c..5b1cfe9bd1bd367939b9df2ddce2e4069c6df70d 100644 (file)
--- a/afh.c
+++ b/afh.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2011 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2008-2012 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -7,7 +7,6 @@
 /** \file afh.c Paraslash's standalone audio format handler tool. */
 
 #include <regex.h>
-#include <dirent.h>
 #include <sys/time.h>
 
 #include "para.h"
 #include "fd.h"
 #include "afh.h"
 #include "error.h"
+#include "version.h"
 
 static struct afh_args_info conf;
-/** The list of all status items */
-const char *status_item_list[] = {STATUS_ITEM_ARRAY};
-
 INIT_AFH_ERRLISTS;
 
 static int loglevel;
@@ -115,12 +112,16 @@ static int cat_file(struct afh_info *afhi, int audio_format_id,
                return -ERRNO_TO_PARA_ERROR(EINVAL);
        if (!afhi->chunks_total)
                return 1;
+       /* eliminate the possibility of short writes */
+       ret = mark_fd_blocking(STDOUT_FILENO);
+       if (ret < 0)
+               return ret;
        if (first_chunk > 0 && !conf.no_header_given) {
                afh_get_header(afhi, audio_format_id, audio_file_data, audio_file_size,
                        &header, &size);
                if (size > 0) {
                        PARA_INFO_LOG("writing header (%zu bytes)\n", size);
-                       ret = write(STDOUT_FILENO, header, size); /* FIXME */
+                       ret = write_all(STDOUT_FILENO, header, size);
                        afh_free_header(header, audio_format_id);
                        if (ret < 0)
                                return ret;
@@ -148,7 +149,7 @@ static int cat_file(struct afh_info *afhi, int audio_format_id,
                if (!size)
                        continue;
                PARA_INFO_LOG("writing chunk %lu\n", i);
-               ret = write_all(STDOUT_FILENO, buf, &size);
+               ret = write_all(STDOUT_FILENO, buf, size);
                if (ret < 0)
                        return ret;
        }
@@ -183,8 +184,10 @@ int main(int argc, char **argv)
                int ret2;
                ret = mmap_full_file(conf.inputs[i], O_RDONLY, &audio_file_data,
                        &audio_file_size, &fd);
-               if (ret < 0)
+               if (ret < 0) {
+                       PARA_ERROR_LOG("failed to mmap \"%s\"\n", conf.inputs[i]);
                        goto out;
+               }
                ret = compute_afhi(conf.inputs[i], audio_file_data, audio_file_size,
                        fd, &afhi);
                if (ret < 0)
@@ -201,13 +204,7 @@ int main(int argc, char **argv)
                                print_chunk_table(&afhi);
                        printf("\n");
                }
-               free(afhi.techinfo);
-               free(afhi.tags.artist);
-               free(afhi.tags.title);
-               free(afhi.tags.year);
-               free(afhi.tags.album);
-               free(afhi.tags.comment);
-               free(afhi.chunk_table);
+               clear_afhi(&afhi);
                ret2 = para_munmap(audio_file_data, audio_file_size);
                if (ret2 < 0 && ret >= 0)
                        ret = ret2;