- ret = recv_bin_buffer(fd, buf, sizeof(buf));
- if (ret < 0)
- goto out;
- if (ret != sizeof(int)) {
- ret = -E_RECV;
- goto out;
- }
- ret = *(int *) buf;
- if (ret <= 0)
- goto out;
- result_shmid = ret;
- ret = shm_attach(result_shmid, ATTACH_RO, &result_shm);
- if (ret >= 0) {
- assert(result);
- cr = result_shm;
- result->size = cr->result_size;
- result->data = para_malloc(result->size);
- memcpy(result->data, result_shm + sizeof(*cr), result->size);
- ret = shm_detach(result_shm);
+ for (;;) {
+ ret = recv_bin_buffer(fd, buf, sizeof(int));
+ if (ret <= 0)
+ goto out;
+ if (ret != sizeof(int)) {
+ ret = -E_AFS_SHORT_READ;
+ goto out;
+ }
+ ret = *(int *) buf;
+ if (ret <= 0)
+ goto out;
+ result_shmid = ret;
+ ret = shm_attach(result_shmid, ATTACH_RO, &result_shm);
+ if (ret >= 0) {
+ struct callback_result *cr = result_shm;
+ struct osl_object result;
+ num_results++;
+ result.size = cr->result_size;
+ result.data = result_shm + sizeof(*cr);
+ if (result.size) {
+ assert(result_handler);
+ ret = result_handler(&result, private_result_data);
+ if (shm_detach(result_shm) < 0)
+ PARA_ERROR_LOG("can not detach result\n");
+ }
+ } else
+ PARA_ERROR_LOG("attach result failed: %d\n", ret);
+ if (shm_destroy(result_shmid) < 0)
+ PARA_ERROR_LOG("destroy result failed\n");