]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - ipc/ipcdev.git/blobdiff - linux/src/transport/TransportRpmsg.c
Merge remote-tracking branch 'origin/3.36' into ipc-next
[ipc/ipcdev.git] / linux / src / transport / TransportRpmsg.c
index fcc6fb6b26bb08362f8d048757bc7fc0cc5dde1b..ae426fb36ccceb78218faed05d4471d1bb88541b 100644 (file)
@@ -172,6 +172,7 @@ TransportRpmsg_Handle TransportRpmsg_create(TransportRpmsg_Params *params)
     Int status = MessageQ_S_SUCCESS;
     TransportRpmsg_Object *obj = NULL;
     int sock;
+    int flags;
     UInt16 clusterId;
     int i;
 
@@ -183,7 +184,8 @@ TransportRpmsg_Handle TransportRpmsg_create(TransportRpmsg_Params *params)
 
     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;
     }
@@ -194,11 +196,18 @@ TransportRpmsg_Handle TransportRpmsg_create(TransportRpmsg_Params *params)
 
     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));
 
@@ -274,6 +283,7 @@ Int TransportRpmsg_bind(Void *handle, UInt32 queueId)
     TransportRpmsg_Object *obj = (TransportRpmsg_Object *)handle;
     UInt16 queuePort = queueId & 0x0000ffff;
     int fd;
+    int flags;
     int err;
     uint64_t event;
     UInt16 rprocId;
@@ -301,7 +311,7 @@ Int TransportRpmsg_bind(Void *handle, UInt32 queueId)
     /*  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;
@@ -319,6 +329,12 @@ Int TransportRpmsg_bind(Void *handle, UInt32 queueId)
         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);
@@ -450,8 +466,8 @@ Bool TransportRpmsg_put(Void *handle, Ptr pmsg)
 
     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;
@@ -523,12 +539,14 @@ void *rpmsgThreadFxn(void *arg)
                 /* transport input fd was signalled: get the message */
                 tmpStatus = transportGet(fd, &retMsg);
                 if (tmpStatus < 0 && tmpStatus != MessageQ_E_SHUTDOWN) {
-                    printf("rpmsgThreadFxn: transportGet failed on fd %d,"
-                           " returned %d\n", fd, tmpStatus);
+                    fprintf(stderr,
+                            "rpmsgThreadFxn: transportGet failed on fd %d, "
+                            "returned %d\n", fd, tmpStatus);
                 }
                 else if (tmpStatus == MessageQ_E_SHUTDOWN) {
-                    printf("rpmsgThreadFxn: transportGet failed on fd %d,"
-                           " returned %d\n", fd, tmpStatus);
+                    fprintf(stderr,
+                            "rpmsgThreadFxn: transportGet failed on fd %d, "
+                            "returned %d\n", fd, tmpStatus);
 
                     pthread_mutex_lock(&TransportRpmsg_module->gate);
 
@@ -561,8 +579,9 @@ void *rpmsgThreadFxn(void *arg)
                         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 {
@@ -640,12 +659,12 @@ static Int transportGet(int sock, MessageQ_Msg *retMsg)
     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);
+        fprintf(stderr, "recvfrom failed: %s (%d)\n", strerror(errno), errno);
         if (errno == ENOLINK) {
             status = MessageQ_E_SHUTDOWN;
         }
@@ -782,6 +801,7 @@ Int TransportRpmsg_Factory_create(Void)
     Int i;
     UInt16 clusterSize;
     TransportRpmsg_Handle *inst;
+    int flags;
 
 
     /* needed to enumerate processors in cluster */
@@ -791,7 +811,8 @@ Int TransportRpmsg_Factory_create(Void)
     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;
     }
@@ -806,8 +827,8 @@ Int TransportRpmsg_Factory_create(Void)
     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;
     }
@@ -819,7 +840,8 @@ Int TransportRpmsg_Factory_create(Void)
     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;
     }
@@ -827,6 +849,16 @@ Int TransportRpmsg_Factory_create(Void)
     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);
@@ -840,7 +872,7 @@ Int TransportRpmsg_Factory_create(Void)
 
     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;