}
}
-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;
free(pb->buf);
}
-static int com_select_callback(int fd, const struct osl_object *query)
+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 = fd,
- .band = SBD_OUTPUT
- },
- .max_size_handler = afs_max_size_handler,
- };
- char *arg = query->data;
+ 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;
}
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;
}
{
void *query_shm;
struct callback_query *cq;
- struct osl_object query;
int ret, ret2;
+ struct afs_callback_arg aca = {.fd = fd};
ret = shm_attach(query_shmid, ATTACH_RW, &query_shm);
if (ret < 0)
return ret;
cq = query_shm;
- query.data = (char *)query_shm + sizeof(*cq);
- query.size = cq->query_size;
- ret = cq->handler(fd, &query);
+ 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) {
if (ret < 0) /* ignore (but log) detach error */
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));
exit(EXIT_FAILURE);
}
-static int com_init_callback(int fd, const struct osl_object *query)
+static int com_init_callback(struct afs_callback_arg *aca)
{
- uint32_t table_mask = *(uint32_t *)query->data;
+ 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 = fd,
- .band = SBD_OUTPUT
- }
- };
close_afs_tables();
for (i = 0; i < NUM_AFS_TABLES; i++) {
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;
}