Rework message send/receive functions for new prototypes.

Add case(s) for drm master drop/set commands.

Signed-off-by: Chris Michael <cp.michael@samsung.com>
This commit is contained in:
Chris Michael 2013-12-30 08:06:17 +00:00
parent 874609a680
commit b51b92522f
1 changed files with 36 additions and 36 deletions

View File

@ -86,8 +86,6 @@ _ecore_drm_launcher_spawn(void)
char *args[1] = { NULL }; char *args[1] = { NULL };
sigset_t mask; sigset_t mask;
/* setsid(); */
/* read socket for slave is 1 */ /* read socket for slave is 1 */
snprintf(env, sizeof(env), "%d", _ecore_drm_sockets[1]); snprintf(env, sizeof(env), "%d", _ecore_drm_sockets[1]);
setenv("ECORE_DRM_LAUNCHER_SOCKET_READ", env, 1); setenv("ECORE_DRM_LAUNCHER_SOCKET_READ", env, 1);
@ -106,6 +104,8 @@ _ecore_drm_launcher_spawn(void)
sigaddset(&mask, SIGTERM); sigaddset(&mask, SIGTERM);
sigaddset(&mask, SIGCHLD); sigaddset(&mask, SIGCHLD);
sigaddset(&mask, SIGINT); sigaddset(&mask, SIGINT);
sigaddset(&mask, SIGTTIN);
sigaddset(&mask, SIGTTOU);
sigprocmask(SIG_UNBLOCK, &mask, NULL); sigprocmask(SIG_UNBLOCK, &mask, NULL);
execv(buff, args); execv(buff, args);
@ -170,37 +170,44 @@ _ecore_drm_socket_send(int opcode, int fd, void *data, size_t bytes)
msg.msg_control = cmsgptr; msg.msg_control = cmsgptr;
msg.msg_controllen = RIGHTS_LEN; msg.msg_controllen = RIGHTS_LEN;
*((int *)CMSG_DATA(cmsgptr)) = fd; if ((opcode == ECORE_DRM_OP_DEVICE_MASTER_DROP) ||
(opcode == ECORE_DRM_OP_DEVICE_MASTER_SET))
DBG("Sending Fd: %d", fd);
if (fd > -1)
*((int *)CMSG_DATA(cmsgptr)) = fd;
else
*((int *)CMSG_DATA(cmsgptr)) = _ecore_drm_sockets[1];
/* cmsg = CMSG_FIRSTHDR(&msg); */ /* cmsg = CMSG_FIRSTHDR(&msg); */
/* cmsg->cmsg_level = SOL_SOCKET; */ /* cmsg->cmsg_level = SOL_SOCKET; */
/* cmsg->cmsg_type = SCM_RIGHTS; */ /* cmsg->cmsg_type = SCM_RIGHTS; */
/* cmsg->cmsg_len = CMSG_LEN(sizeof(int)); */ /* cmsg->cmsg_len = CMSG_LEN(sizeof(int)); */
DBG("Dmsg Size: %d", dmsg.size); /* DBG("Dmsg Size: %d", dmsg.size); */
DBG("Message Size: %li", sizeof(msg)); /* DBG("Message Size: %li", sizeof(msg)); */
DBG("Message Len: %d", (int)msg.msg_controllen); /* DBG("Message Len: %d", (int)msg.msg_controllen); */
DBG("Control Size: %li", sizeof(cmsgptr)); /* DBG("Control Size: %li", sizeof(cmsgptr)); */
DBG("Control Len: %d", (int)cmsgptr->cmsg_len); /* DBG("Control Len: %d", (int)cmsgptr->cmsg_len); */
DBG("Data Size: %li", sizeof(data)); /* DBG("Data Size: %li", sizeof(data)); */
DBG("Data Len: %li", bytes); /* DBG("Data Len: %li", bytes); */
errno = 0; errno = 0;
size = sendmsg(fd, &msg, MSG_EOR); size = sendmsg(_ecore_drm_sockets[1], &msg, MSG_EOR);
if (errno != 0) if (errno != 0)
{ {
DBG("Error Sending Message: %m"); DBG("Error Sending Message: %m");
} }
DBG("Sent %li bytes to Socket %d", size, fd); DBG("Sent %li bytes to Socket %d", size, _ecore_drm_sockets[1]);
return size; return size;
} }
static int static int
_ecore_drm_socket_receive(int opcode, int fd, void **data, size_t bytes) _ecore_drm_socket_receive(int opcode, int *fd, void **data, size_t bytes)
{ {
int ret = -1, rfd; int rfd, ret = ECORE_DRM_OP_FAILURE;
Ecore_Drm_Message dmsg; Ecore_Drm_Message dmsg;
struct cmsghdr *cmsg; struct cmsghdr *cmsg;
struct iovec iov[2]; struct iovec iov[2];
@ -223,22 +230,18 @@ _ecore_drm_socket_receive(int opcode, int fd, void **data, size_t bytes)
if ((!cmsgptr) && (!(cmsgptr = malloc(RIGHTS_LEN)))) if ((!cmsgptr) && (!(cmsgptr = malloc(RIGHTS_LEN))))
return -1; return -1;
/* cmsgptr->cmsg_level = SOL_SOCKET; */
/* cmsgptr->cmsg_type = SCM_RIGHTS; */
/* cmsgptr->cmsg_len = RIGHTS_LEN; */
msg.msg_control = cmsgptr; msg.msg_control = cmsgptr;
msg.msg_controllen = RIGHTS_LEN; msg.msg_controllen = RIGHTS_LEN;
errno = 0; errno = 0;
size = recvmsg(fd, &msg, 0); size = recvmsg(_ecore_drm_sockets[0], &msg, 0);
if (errno != 0) if (errno != 0)
{ {
ERR("Failed to receive message: %m"); ERR("Failed to receive message: %m");
return -1; return -1;
} }
DBG("Received %li bytes from %d", size, fd); DBG("Received %li bytes from %d", size, _ecore_drm_sockets[0]);
for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;
cmsg = CMSG_NXTHDR(&msg, cmsg)) cmsg = CMSG_NXTHDR(&msg, cmsg))
@ -249,17 +252,17 @@ _ecore_drm_socket_receive(int opcode, int fd, void **data, size_t bytes)
switch (cmsg->cmsg_type) switch (cmsg->cmsg_type)
{ {
case SCM_RIGHTS: case SCM_RIGHTS:
rfd = *((int *)CMSG_DATA(cmsg)); if (fd) *fd = *((int *)CMSG_DATA(cmsg));
switch (dmsg.opcode) switch (dmsg.opcode)
{ {
case ECORE_DRM_OP_DEVICE_OPEN: case ECORE_DRM_OP_DEVICE_OPEN:
case ECORE_DRM_OP_TTY_OPEN: case ECORE_DRM_OP_TTY_OPEN:
if (rfd >= 0) ret = 1; case ECORE_DRM_OP_DEVICE_MASTER_DROP:
if (data) memcpy(*data, CMSG_DATA(cmsg), sizeof(int)); case ECORE_DRM_OP_DEVICE_MASTER_SET:
/* if (data) *data = &rfd; */ if (*fd >= 0) ret = ECORE_DRM_OP_SUCCESS;
if (data) memcpy(*data, buff, bytes);
break; break;
default: default:
ret = -1;
break; break;
} }
break; break;
@ -268,31 +271,27 @@ _ecore_drm_socket_receive(int opcode, int fd, void **data, size_t bytes)
} }
} }
DBG("Received FD: %d", rfd); DBG("Received FD: %d", *fd);
DBG("Opcode: %d", opcode); DBG("Opcode: %d", opcode);
DBG("DMsg Opcode: %d", dmsg.opcode); DBG("DMsg Opcode: %d", dmsg.opcode);
/* if (dmsg.opcode != opcode) return -1; */
DBG("Returning %d", ret); DBG("Returning %d", ret);
return ret; return ret;
} }
void void
_ecore_drm_message_send(int opcode, void *data, size_t bytes) _ecore_drm_message_send(int opcode, int fd, void *data, size_t bytes)
{ {
_ecore_drm_socket_send(opcode, _ecore_drm_sockets[1], data, bytes); _ecore_drm_socket_send(opcode, fd, data, bytes);
} }
Eina_Bool Eina_Bool
_ecore_drm_message_receive(int opcode, void **data, size_t bytes) _ecore_drm_message_receive(int opcode, int *fd, void **data, size_t bytes)
{ {
int ret; int ret = ECORE_DRM_OP_FAILURE;
ret = _ecore_drm_socket_receive(opcode, _ecore_drm_sockets[0], ret = _ecore_drm_socket_receive(opcode, fd, data, bytes);
data, bytes); if (ret != ECORE_DRM_OP_SUCCESS) return EINA_FALSE;
if (ret < 0) return EINA_FALSE;
return EINA_TRUE; return EINA_TRUE;
} }
@ -330,6 +329,7 @@ ecore_drm_init(void)
eina_log_level_set(EINA_LOG_LEVEL_DBG); eina_log_level_set(EINA_LOG_LEVEL_DBG);
setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);
/* optionally log output to a file */ /* optionally log output to a file */
#ifdef LOG_TO_FILE #ifdef LOG_TO_FILE