+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;
+}
+