t->ret = 1;
}
+int pass_object_as_shm(int fd, struct osl_object *obj)
+{
+ int ret, shmid;
+ void *shm;
+ struct callback_result *cr;
+
+ if (!obj->data || !obj->size)
+ return 0;
+ ret = shm_new(obj->size + sizeof(struct callback_result));
+ if (ret < 0)
+ return ret;
+ shmid = ret;
+ ret = shm_attach(shmid, ATTACH_RW, &shm);
+ if (ret < 0)
+ goto err;
+ cr = shm;
+ cr->result_size = obj->size;
+ memcpy(shm + sizeof(*cr), obj->data, obj->size);
+ ret = shm_detach(shm);
+ if (ret < 0)
+ goto err;
+ ret = send_bin_buffer(fd, (char *)&shmid, sizeof(int));
+ if (ret >= 0)
+ return ret;
+err:
+ if (shm_destroy(shmid) < 0)
+ PARA_ERROR_LOG("destroy result failed\n");
+ return ret;
+}
+
/*
* On errors, negative value is written to fd.
* On success: If query produced a result, the result_shmid is written to fd.
* Otherwise, zero is written.
*/
-static int call_callback(int fd, int query_shmid)
+static void call_callback(int fd, int query_shmid)
{
- void *query_shm, *result_shm;
+ void *query_shm;
struct callback_query *cq;
- struct callback_result *cr;
struct osl_object query, result = {.data = NULL};
- int result_shmid = -1, ret, ret2;
+ int ret;
ret = shm_attach(query_shmid, ATTACH_RW, &query_shm);
if (ret < 0)
query.data = (char *)query_shm + sizeof(*cq);
query.size = cq->query_size;
ret = cq->handler(&query, &result);
- ret2 = shm_detach(query_shm);
- if (ret2 < 0 && ret >= 0)
- ret = ret2;
- if (ret < 0)
- goto out;
- ret = 0;
- if (!result.data || !result.size)
- goto out;
- ret = shm_new(result.size + sizeof(struct callback_result));
- if (ret < 0)
- goto out;
- result_shmid = ret;
- ret = shm_attach(result_shmid, ATTACH_RW, &result_shm);
- if (ret < 0)
- goto out;
- cr = result_shm;
- cr->result_size = result.size;
- memcpy(result_shm + sizeof(*cr), result.data, result.size);
- ret = shm_detach(result_shm);
if (ret < 0)
goto out;
- ret = result_shmid;
+ ret = pass_object_as_shm(fd, &result);
out:
free(result.data);
- ret2 = send_bin_buffer(fd, (char *)&ret, sizeof(int));
- if (ret < 0 || ret2 < 0) {
- if (result_shmid >= 0)
- if (shm_destroy(result_shmid) < 0)
- PARA_ERROR_LOG("destroy result failed\n");
- if (ret >= 0)
- ret = ret2;
- }
- return ret;
+ if (ret < 0)
+ PARA_ERROR_LOG("%s\n", para_strerror(-ret));
}
static void execute_server_command(void)
query_shmid);
return;
}
- /* Ignore return value: Errors might be OK here. */
call_callback(fd, query_shmid);
}