osaf/libs/core/leap/os_defs.c | 20 +-------------------
osaf/libs/core/leap/sysf_mem.c | 2 +-
osaf/libs/core/mds/mds_dt_tcp.c | 16 +---------------
3 files changed, 3 insertions(+), 35 deletions(-)
Since Linux 2.6.27, socketpair() supports the SOCK_NONBLOCK and SOCK_CLOEXEC
flags described in socket(2).
Linux glibc 2.7 introduced the e flag to cause a close-on-exec flag upon open.
So optimized the code, this is useful as it avoid a race condition between
fopen() and a subsequent call to fcntl().
diff --git a/osaf/libs/core/leap/os_defs.c b/osaf/libs/core/leap/os_defs.c
--- a/osaf/libs/core/leap/os_defs.c
+++ b/osaf/libs/core/leap/os_defs.c
@@ -1060,21 +1060,11 @@ uint32_t ncs_sel_obj_create(NCS_SEL_OBJ
int s_pair[2];
int flags = 0;
- osaf_mutex_lock_ordie(&s_cloexec_mutex);
- if (0 != socketpair(AF_UNIX, SOCK_STREAM, 0, s_pair)) {
+ if (0 != socketpair(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0, s_pair)) {
syslog(LOG_ERR, "%s: socketpair failed - %s", __FUNCTION__,
strerror(errno));
- osaf_mutex_unlock_ordie(&s_cloexec_mutex);
return NCSCC_RC_FAILURE;
}
- flags = fcntl(s_pair[0], F_GETFD, 0);
- fcntl(s_pair[0], F_SETFD, (flags | FD_CLOEXEC));
-
- flags = fcntl(s_pair[1], F_GETFD, 0);
- fcntl(s_pair[1], F_SETFD, (flags | FD_CLOEXEC));
-
- osaf_mutex_unlock_ordie(&s_cloexec_mutex);
-
if (s_pair[0] > s_pair[1]) {
/* Ensure s_pair[1] is equal or greater */
int temp = s_pair[0];
@@ -1293,18 +1283,10 @@ int ncs_sel_obj_rmv_ind(NCS_SEL_OBJ *i_i
FILE *ncs_os_fopen(const char *fpath, const char *fmode)
{
FILE *fp = NULL;
- int flags = 0;
- osaf_mutex_lock_ordie(&s_cloexec_mutex);
fp = fopen(fpath, fmode);
if (fp == NULL) {
- osaf_mutex_unlock_ordie(&s_cloexec_mutex);
return NULL;
}
- flags = fcntl(fileno(fp), F_GETFD, 0);
- fcntl(fileno(fp), F_SETFD, (flags | FD_CLOEXEC));
-
- osaf_mutex_unlock_ordie(&s_cloexec_mutex);
-
return fp;
}
diff --git a/osaf/libs/core/leap/sysf_mem.c b/osaf/libs/core/leap/sysf_mem.c
--- a/osaf/libs/core/leap/sysf_mem.c
+++ b/osaf/libs/core/leap/sysf_mem.c
@@ -1917,7 +1917,7 @@ uint32_t sysf_pick_output(char *str, cha
FILE *file;
if (fname != NULL) {
- if ((file = ncs_os_fopen(fname, "at")) == NULL)
+ if ((file = ncs_os_fopen(fname, "ate")) == NULL)
return NCSCC_RC_FAILURE;
fprintf(file, "%s\n", str);
fclose(file);
diff --git a/osaf/libs/core/mds/mds_dt_tcp.c b/osaf/libs/core/mds/mds_dt_tcp.c
--- a/osaf/libs/core/mds/mds_dt_tcp.c
+++ b/osaf/libs/core/mds/mds_dt_tcp.c
@@ -81,7 +81,6 @@ uint32_t mdtm_process_recv_events_tcp(vo
*/
uint32_t mds_mdtm_init_tcp(NODE_ID nodeid, uint32_t *mds_tcp_ref)
{
- uint32_t flags;
uint32_t sndbuf_size = 0; /* Send buffer size */
uint32_t rcvbuf_size = 0; /* Receive buffer size */
socklen_t optlen; /* Option length */
@@ -125,7 +124,7 @@ uint32_t mds_mdtm_init_tcp(NODE_ID nodei
/* Create the sockets required for Binding, Send, receive and Discovery
*/
- tcp_cb->DBSRsock = socket(mds_socket_domain, SOCK_STREAM, 0);
+ tcp_cb->DBSRsock = socket(mds_socket_domain, SOCK_STREAM|SOCK_CLOEXEC,
0);
if (tcp_cb->DBSRsock < 0) {
syslog(LOG_ERR, "MDS:MDTM:TCP DBSRsock Socket creation failed
in MDTM_INIT err :%s", strerror(errno));
return NCSCC_RC_FAILURE;
@@ -177,19 +176,6 @@ uint32_t mds_mdtm_init_tcp(NODE_ID nodei
return NCSCC_RC_FAILURE;
}
- flags = fcntl(tcp_cb->DBSRsock, F_GETFD, 0);
- if ((flags < 0) || (flags > 1)) {
- syslog(LOG_ERR, "MDS:MDTM:TCP Unable to get the CLOEXEC Flag on
DBSRsock err :%s", strerror(errno));
- close(tcp_cb->DBSRsock);
- return NCSCC_RC_FAILURE;
- } else {
- if (fcntl(tcp_cb->DBSRsock, F_SETFD, (flags | FD_CLOEXEC)) ==
(-1)) {
- syslog(LOG_ERR, "MDS:MDTM:TCP Unable to set the CLOEXEC
Flag on DBSRsock err :%s", strerror(errno));
- close(tcp_cb->DBSRsock);
- return NCSCC_RC_FAILURE;
- }
- }
-
tcp_cb->adest = ((uint64_t)(nodeid)) << 32;
tcp_cb->adest |= mdtm_pid;
tcp_cb->node_id = nodeid;
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel