Signed-off-by: Angus Salkeld <asalkeld(a)redhat.com>
---
lib/ipc_us.c | 35 ++++++++++++++++++++---------------
1 file changed, 20 insertions(+), 15 deletions(-)
diff --git a/lib/ipc_us.c b/lib/ipc_us.c
index d26218a..9c8b5be 100644
--- a/lib/ipc_us.c
+++ b/lib/ipc_us.c
@@ -447,7 +447,7 @@ qb_ipcc_us_connect(struct qb_ipcc_connection *c,
struct qb_ipc_event_connection_request request;
char path[PATH_MAX];
int32_t fd_hdr;
- struct ipc_us_control *ctl;
+ char * shm_ptr;
c->needs_sock_for_poll = QB_FALSE;
c->funcs.send = qb_ipc_us_send;
@@ -468,20 +468,17 @@ qb_ipcc_us_connect(struct qb_ipcc_connection *c,
return res;
}
(void)strlcpy(c->request.u.us.shared_file_name, r->request, NAME_MAX);
- c->request.u.us.shared_data = mmap(0,
- sizeof(struct ipc_us_control),
- PROT_READ | PROT_WRITE, MAP_SHARED,
- fd_hdr, 0);
+ shm_ptr = mmap(0, 3 * sizeof(struct ipc_us_control),
+ PROT_READ | PROT_WRITE, MAP_SHARED, fd_hdr, 0);
- if (c->request.u.us.shared_data == MAP_FAILED) {
+ if (shm_ptr == MAP_FAILED) {
res = -errno;
qb_util_perror(LOG_ERR, "couldn't create mmap for header");
goto cleanup_hdr;
}
-
- ctl = (struct ipc_us_control *)c->request.u.us.shared_data;
- ctl->sent = 0;
- ctl->flow_control = 0;
+ c->request.u.us.shared_data = shm_ptr;
+ c->response.u.us.shared_data = shm_ptr + sizeof(struct ipc_us_control);
+ c->event.u.us.shared_data = shm_ptr + (2 * sizeof(struct ipc_us_control));
close(fd_hdr);
@@ -922,6 +919,7 @@ qb_ipcs_us_connect(struct qb_ipcs_service *s,
int32_t fd_hdr;
int32_t res = 0;
struct ipc_us_control *ctl;
+ char * shm_ptr;
qb_util_log(LOG_DEBUG, "connecting to client [%d]", c->pid);
@@ -940,20 +938,27 @@ qb_ipcs_us_connect(struct qb_ipcs_service *s,
(void)strlcpy(c->request.u.us.shared_file_name, r->request, NAME_MAX);
(void)chown(r->request, c->euid, c->egid);
- c->request.u.us.shared_data = mmap(0,
- sizeof(struct ipc_us_control),
- PROT_READ | PROT_WRITE, MAP_SHARED,
- fd_hdr, 0);
+ shm_ptr = mmap(0, 3 * sizeof(struct ipc_us_control),
+ PROT_READ | PROT_WRITE, MAP_SHARED, fd_hdr, 0);
- if (c->request.u.us.shared_data == MAP_FAILED) {
+ if (shm_ptr == MAP_FAILED) {
res = -errno;
qb_util_perror(LOG_ERR, "couldn't create mmap for header");
goto cleanup_hdr;
}
+ c->request.u.us.shared_data = shm_ptr;
+ c->response.u.us.shared_data = shm_ptr + sizeof(struct ipc_us_control);
+ c->event.u.us.shared_data = shm_ptr + (2 * sizeof(struct ipc_us_control));
ctl = (struct ipc_us_control *)c->request.u.us.shared_data;
ctl->sent = 0;
ctl->flow_control = 0;
+ ctl = (struct ipc_us_control *)c->response.u.us.shared_data;
+ ctl->sent = 0;
+ ctl->flow_control = 0;
+ ctl = (struct ipc_us_control *)c->event.u.us.shared_data;
+ ctl->sent = 0;
+ ctl->flow_control = 0;
close(fd_hdr);
return res;
--
1.7.10
Show replies by date