index 6e3d704a9e548cef40cf7b9925c38c41f77c24a5..ae426fb36ccceb78218faed05d4471d1bb88541b 100644 (file)
Int status = MessageQ_S_SUCCESS;
TransportRpmsg_Object *obj = NULL;
int sock;
+ int flags;
UInt16 clusterId;
int i;
if (sock < 0) {
status = Ipc_E_FAIL;
- printf("TransportRpmsg_create: socket failed: %d (%s)\n", errno,
+ fprintf(stderr,
+ "TransportRpmsg_create: socket failed: %d (%s)\n", errno,
strerror(errno));
goto done;
}
if (status < 0) {
status = Ipc_E_FAIL;
- printf("TransportRpmsg_create: connect failed: %d (%s) procId: %d\n",
+ fprintf(stderr,
+ "TransportRpmsg_create: connect failed: %d (%s) procId: %d\n",
errno, strerror(errno), params->rprocId);
goto done;
}
+ /* make sure socket fd doesn't exist for 'fork() -> exec*()'ed child */
+ flags = fcntl(sock, F_GETFD);
+ if (flags != -1) {
+ fcntl(sock, F_SETFD, flags | FD_CLOEXEC);
+ }
+
/* create the instance object */
obj = calloc(1, sizeof(TransportRpmsg_Object));
TransportRpmsg_Object *obj = (TransportRpmsg_Object *)handle;
UInt16 queuePort = queueId & 0x0000ffff;
int fd;
+ int flags;
int err;
uint64_t event;
UInt16 rprocId;
/* Create the socket to receive messages for this messageQ. */
fd = socket(AF_RPMSG, SOCK_SEQPACKET, 0);
if (fd < 0) {
- printf("TransportRpmsg_bind: socket call failed: %d (%s)\n",
+ fprintf(stderr, "TransportRpmsg_bind: socket call failed: %d (%s)\n",
errno, strerror(errno));
status = MessageQ_E_OSFAILURE;
goto done;
goto done;
}
+ /* make sure socket fd doesn't exist for 'fork() -> exec*()'ed child */
+ flags = fcntl(fd, F_GETFD);
+ if (flags != -1) {
+ fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
+ }
+
/* pause the dispatch thread */
PRINTVERBOSE1("TransportRpmsg_bind: sending PAUSE event, tid=0x%x\n",
(unsigned int)tid);
err = send(sock, msg, msg->msgSize, 0);
if (err < 0) {
- printf("TransportRpmsg_put: send failed: %d (%s)\n",
- errno, strerror(errno));
+ fprintf(stderr, "TransportRpmsg_put: send failed: %d (%s)\n",
+ errno, strerror(errno));
status = FALSE;
goto exit;
/* transport input fd was signalled: get the message */
tmpStatus = transportGet(fd, &retMsg);
- if (tmpStatus < 0) {
- printf("rpmsgThreadFxn: transportGet failed on fd %d,"
- " returned %d\n", fd, tmpStatus);
+ if (tmpStatus < 0 && tmpStatus != MessageQ_E_SHUTDOWN) {
+ fprintf(stderr,
+ "rpmsgThreadFxn: transportGet failed on fd %d, "
+ "returned %d\n", fd, tmpStatus);
+ }
+ else if (tmpStatus == MessageQ_E_SHUTDOWN) {
+ fprintf(stderr,
+ "rpmsgThreadFxn: transportGet failed on fd %d, "
+ "returned %d\n", fd, tmpStatus);
pthread_mutex_lock(&TransportRpmsg_module->gate);
MessageQ_shutdown(handle);
}
else {
- printf("rpmsgThreadFxn: MessageQ_getLocalHandle(0x%x) "
- "returned NULL, can't shutdown\n", queueId);
+ fprintf(stderr,
+ "rpmsgThreadFxn: MessageQ_getLocalHandle(0x%x) "
+ "returned NULL, can't shutdown\n", queueId);
}
}
else {
byteCount = recvfrom(sock, msg, MESSAGEQ_RPMSG_MAXSIZE, 0,
(struct sockaddr *)&fromAddr, &len);
if (len != sizeof (fromAddr)) {
- printf("recvfrom: got bad addr len (%d)\n", len);
+ fprintf(stderr, "recvfrom: got bad addr len (%d)\n", len);
status = MessageQ_E_FAIL;
goto freeMsg;
}
if (byteCount < 0) {
- printf("recvfrom failed: %s (%d)\n", strerror(errno), errno);
- if (errno == ESHUTDOWN) {
+ fprintf(stderr, "recvfrom failed: %s (%d)\n", strerror(errno), errno);
+ if (errno == ENOLINK) {
status = MessageQ_E_SHUTDOWN;
}
else {
Int i;
UInt16 clusterSize;
TransportRpmsg_Handle *inst;
+ int flags;
/* needed to enumerate processors in cluster */
inst = calloc(clusterSize, sizeof(TransportRpmsg_Handle));
if (inst == NULL) {
- printf("Error: TransportRpmsg_Factory_create failed, no memory\n");
+ fprintf(stderr,
+ "Error: TransportRpmsg_Factory_create failed, no memory\n");
status = Ipc_E_MEMORY;
goto done;
}
TransportRpmsg_module->unblockEvent = eventfd(0, 0);
if (TransportRpmsg_module->unblockEvent == -1) {
- printf("create: unblock event failed: %d (%s)\n",
- errno, strerror(errno));
+ fprintf(stderr, "create: unblock event failed: %d (%s)\n",
+ errno, strerror(errno));
status = Ipc_E_FAIL;
goto done;
}
TransportRpmsg_module->waitEvent = eventfd(0, EFD_SEMAPHORE);
if (TransportRpmsg_module->waitEvent == -1) {
- printf("create: wait event failed: %d (%s)\n", errno, strerror(errno));
+ fprintf(stderr,
+ "create: wait event failed: %d (%s)\n", errno, strerror(errno));
status = Ipc_E_FAIL;
goto done;
}
PRINTVERBOSE1("create: created wait event %d\n",
TransportRpmsg_module->waitEvent)
+ /* make sure eventfds don't exist for 'fork() -> exec*()'ed child */
+ flags = fcntl(TransportRpmsg_module->waitEvent, F_GETFD);
+ if (flags != -1) {
+ fcntl(TransportRpmsg_module->waitEvent, F_SETFD, flags | FD_CLOEXEC);
+ }
+ flags = fcntl(TransportRpmsg_module->unblockEvent, F_GETFD);
+ if (flags != -1) {
+ fcntl(TransportRpmsg_module->unblockEvent, F_SETFD, flags | FD_CLOEXEC);
+ }
+
FD_ZERO(&TransportRpmsg_module->rfds);
FD_SET(TransportRpmsg_module->unblockEvent,
&TransportRpmsg_module->rfds);
if (status < 0) {
status = Ipc_E_FAIL;
- printf("attach: failed to spawn thread\n");
+ fprintf(stderr, "create: failed to spawn thread\n");
goto done;
}
TransportRpmsg_module->threadStarted = TRUE;