Add some more derived files to .gitignore.
[paraslash.git] / mood.c
diff --git a/mood.c b/mood.c
index 0f907cc0d6ac204669400f0825d736cabbd06042..57f3f00ab5b4e11ee4f9d78bb82f683eed361092 100644 (file)
--- a/mood.c
+++ b/mood.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2007-2009 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -13,6 +13,7 @@
 #include "afh.h"
 #include "afs.h"
 #include "list.h"
+#include "ipc.h"
 
 /**
  * Contains statistical data of the currently admissible audio files.
@@ -83,7 +84,7 @@ typedef void mood_cleanup_function(void *);
  * Used for scoring and to determine whether a file is admissible.
  */
 struct mood_method {
-       /* The name of the method. */
+       /** The name of the method. */
        const char *name;
        /** Pointer to the mood parser. */
        mood_parser *parser;
@@ -265,6 +266,7 @@ static int add_item_score(const struct osl_row *row, struct mood_item *item, lon
                ret = get_afhi_of_row(row, &afhi);
                if (ret< 0)
                        return ret;
+               free(afhi.info_string); /* don't need the tag info */
                ret = get_audio_file_path_of_row(row, &path);
                if (ret< 0)
                        return ret;
@@ -535,42 +537,50 @@ static int check_mood(struct osl_row *mood_row, void *data)
        struct osl_object mood_def;
        struct mood_line_parser_data mlpd = {.line_num = 0};
 
-       int ret = mood_get_name_and_def_by_row(mood_row, &mood_name, &mood_def);
+       int ret2, ret = mood_get_name_and_def_by_row(mood_row, &mood_name, &mood_def);
 
        if (ret < 0) {
-               para_printf(pb, "failed to get mood definition\n");
+               ret2 = para_printf(pb, "failed to get mood definition: %s\n",
+                       para_strerror(-ret));
                return ret;
        }
        if (!*mood_name) /* ignore dummy row */
                goto out;
-       para_printf(pb, "checking mood %s...\n", mood_name);
+       ret = para_printf(pb, "checking mood %s...\n", mood_name);
+       if (ret < 0)
+               goto out;
        ret = for_each_line_ro(mood_def.data, mood_def.size,
                parse_mood_line, &mlpd);
        if (ret < 0)
-               para_printf(pb, "%s line %u: %s\n", mood_name, mlpd.line_num,
+               ret2 = para_printf(pb, "%s line %u: %s\n", mood_name, mlpd.line_num,
                        para_strerror(-ret));
 out:
        osl_close_disk_object(&mood_def);
-       return 1;
+       return ret;
 }
 
 /**
  * Check all moods for syntax errors.
  *
+ * \param fd The afs socket.
  * \param query Unused.
- * \param result: Contains check messages.
  */
-int mood_check_callback(__a_unused const struct osl_object *query,
-       struct osl_object *result)
+void mood_check_callback(int fd, __a_unused const struct osl_object *query)
 {
-       struct para_buffer pb = {.buf = NULL};
+       struct para_buffer pb = {
+               .max_size = SHMMAX,
+               .private_data = &fd,
+               .max_size_handler = pass_buffer_as_shm
+       };
 
-       para_printf(&pb, "checking moods...\n");
+       int ret = para_printf(&pb, "checking moods...\n");
+       if (ret < 0)
+               return;
        osl_rbtree_loop(moods_table, BLOBCOL_ID, &pb,
                check_mood);
-       result->data = pb.buf;
-       result->size = pb.size;
-       return 1;
+       if (pb.offset)
+               pass_buffer_as_shm(pb.buf, pb.offset, &fd);
+       free(pb.buf);
 }
 
 #if 0
@@ -1058,6 +1068,5 @@ int moods_event_handler(enum afs_events event, __a_unused struct para_buffer *pb
        default:
                return 1;
        }
-       return 1;
 }