]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - afs.c
afs: Provide pbout para_buffer for each callback.
[paraslash.git] / afs.c
diff --git a/afs.c b/afs.c
index 30acfa041d4d8b6d483857096b9196e17311ba20..bd705050d328a23dda1b9610c3c5dd5d9dcb483d 100644 (file)
--- a/afs.c
+++ b/afs.c
@@ -574,7 +574,7 @@ int afs_cb_result_handler(struct osl_object *result, uint8_t band,
        }
 }
 
-void flush_and_free_pb(struct para_buffer *pb)
+static void flush_and_free_pb(struct para_buffer *pb)
 {
        int ret;
        struct afs_max_size_handler_data *amshd = pb->private_data;
@@ -590,20 +590,12 @@ void flush_and_free_pb(struct para_buffer *pb)
 
 static int com_select_callback(struct afs_callback_arg *aca)
 {
-       struct para_buffer pb = {
-               .max_size = shm_get_shmmax(),
-               .private_data = &(struct afs_max_size_handler_data) {
-                       .fd = aca->fd,
-                       .band = SBD_OUTPUT
-               },
-               .max_size_handler = afs_max_size_handler,
-       };
        char *arg = aca->query.data;
        int num_admissible, ret;
 
        ret = clear_score_table();
        if (ret < 0) {
-               para_printf(&pb, "could not clear score table: %s\n",
+               para_printf(&aca->pbout, "could not clear score table: %s\n",
                        para_strerror(-ret));
                return ret;
        }
@@ -614,20 +606,19 @@ static int com_select_callback(struct afs_callback_arg *aca)
        ret = activate_mood_or_playlist(arg, &num_admissible);
        if (ret >= 0)
                goto out;
-       para_printf(&pb, "could not activate %s: %s\n"
+       /* ignore subsequent errors (but log them) */
+       para_printf(&aca->pbout, "could not activate %s: %s\n"
                "switching back to %s\n",
                arg, para_strerror(-ret), current_mop? current_mop : "dummy");
-       /* ignore subsequent errors (but log them) */
        ret = activate_mood_or_playlist(current_mop, &num_admissible);
        if (ret >= 0)
                goto out;
-       para_printf(&pb, "could not activate %s: %s\nswitching to dummy\n",
+       para_printf(&aca->pbout, "could not activate %s: %s\nswitching to dummy\n",
                current_mop, para_strerror(-ret));
        activate_mood_or_playlist(NULL, &num_admissible);
 out:
-       para_printf(&pb, "activated %s (%d admissible files)\n",
+       para_printf(&aca->pbout, "activated %s (%d admissible files)\n",
                current_mop? current_mop : "dummy mood", num_admissible);
-       flush_and_free_pb(&pb);
        return ret;
 }
 
@@ -858,6 +849,12 @@ static int call_callback(int fd, int query_shmid)
        cq = query_shm;
        aca.query.data = (char *)query_shm + sizeof(*cq);
        aca.query.size = cq->query_size;
+       aca.pbout.max_size = shm_get_shmmax();
+       aca.pbout.max_size_handler = afs_max_size_handler;
+       aca.pbout.private_data = &(struct afs_max_size_handler_data) {
+               .fd = fd,
+               .band = SBD_OUTPUT
+       };
        ret = cq->handler(&aca);
        ret2 = shm_detach(query_shm);
        if (ret2 < 0) {
@@ -867,6 +864,7 @@ static int call_callback(int fd, int query_shmid)
                else
                        ret = ret2;
        }
+       flush_and_free_pb(&aca.pbout);
        if (ret < 0) {
                ret2 = pass_buffer_as_shm(fd, SBD_AFS_CB_FAILURE,
                        (const char *)&ret, sizeof(ret));
@@ -1037,13 +1035,6 @@ static int com_init_callback(struct afs_callback_arg *aca)
 {
        uint32_t table_mask = *(uint32_t *)aca->query.data;
        int i, ret;
-       struct para_buffer pb = {
-               .max_size = shm_get_shmmax(),
-               .private_data = &(struct afs_max_size_handler_data) {
-                       .fd = aca->fd,
-                       .band = SBD_OUTPUT
-               }
-       };
 
        close_afs_tables();
        for (i = 0; i < NUM_AFS_TABLES; i++) {
@@ -1055,16 +1046,17 @@ static int com_init_callback(struct afs_callback_arg *aca)
                        continue;
                ret = t->create(database_dir);
                if (ret < 0) {
-                       para_printf(&pb, "cannot create table %s\n", t->name);
+                       para_printf(&aca->pbout, "cannot create table %s\n",
+                               t->name);
                        goto out;
                }
-               para_printf(&pb, "successfully created %s table\n", t->name);
+               para_printf(&aca->pbout, "successfully created %s table\n",
+                       t->name);
        }
        ret = open_afs_tables();
        if (ret < 0)
-               para_printf(&pb, "cannot open afs tables\n");
+               para_printf(&aca->pbout, "cannot open afs tables\n");
 out:
-       flush_and_free_pb(&pb);
        return ret;
 }