summaryrefslogtreecommitdiff
path: root/dpid
diff options
context:
space:
mode:
Diffstat (limited to 'dpid')
-rw-r--r--dpid/dpid.c32
-rw-r--r--dpid/dpid_common.c19
-rw-r--r--dpid/dpid_common.h4
3 files changed, 46 insertions, 9 deletions
diff --git a/dpid/dpid.c b/dpid/dpid.c
index 42b0413c..6a0bc511 100644
--- a/dpid/dpid.c
+++ b/dpid/dpid.c
@@ -513,6 +513,25 @@ int fill_services_list(struct dp *attlist, int numdpis, Dlist **services_list)
return (dList_length(*services_list));
}
+/*
+ * Return a socket file descriptor
+ * (useful to set socket options in a uniform way)
+ */
+static int make_socket_fd()
+{
+ int ret;
+
+ if ((ret = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
+ ERRMSG("make_socket_fd", "socket", errno);
+ }
+
+ /* set some buffering to increase the transfer's speed */
+ //setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF,
+ // &sock_buflen, (socklen_t)sizeof(sock_buflen));
+
+ return ret;
+}
+
/*! Bind a socket port on localhost. Try to be close to base_port.
* \Return
* \li listening socket file descriptor on success
@@ -522,19 +541,14 @@ int bind_socket_fd(int base_port, int *p_port)
{
int sock_fd, port;
struct sockaddr_in sin;
- //size_t sock_buflen = 8192;
int ok = 0, last_port = base_port + 50;
- if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
- ERRMSG("bind_socket_fd", "socket", errno);
+ if ((sock_fd = make_socket_fd()) == -1) {
return (-1); /* avoids nested ifs */
}
/* Set the socket FD to close on exec */
fcntl(sock_fd, F_SETFD, FD_CLOEXEC | fcntl(sock_fd, F_GETFD));
- /* set some buffering to increase the transfer's speed */
- //setsockopt(sock_fd, SOL_SOCKET, SO_SNDBUF,
- // &sock_buflen, (socklen_t)sizeof(sock_buflen));
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
@@ -579,8 +593,9 @@ int save_comm_keys(int srs_port)
MSG("save_comm_keys: open %s\n", dStrerror(errno));
} else {
snprintf(port_str, 16, "%d %s\n", srs_port, SharedKey);
- if (CKD_WRITE(fd, port_str) != -1)
+ if (CKD_WRITE(fd, port_str) != -1 && CKD_CLOSE(fd) != -1) {
ret = 1;
+ }
}
return ret;
@@ -734,10 +749,11 @@ void stop_active_dpis(struct dp *dpi_attr_list, int numdpis)
if (dpi_attr_list[i].pid == 1 || dpi_attr_list[i].filter)
continue;
- if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
+ if ((sock_fd = make_socket_fd()) == -1) {
ERRMSG("stop_active_dpis", "socket", errno);
continue;
}
+
sin.sin_port = htons(dpi_attr_list[i].port);
if (ckd_connect(sock_fd, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
ERRMSG("stop_active_dpis", "connect", errno);
diff --git a/dpid/dpid_common.c b/dpid/dpid_common.c
index cb4ef436..a903db95 100644
--- a/dpid/dpid_common.c
+++ b/dpid/dpid_common.c
@@ -52,3 +52,22 @@ ssize_t ckd_write(int fd, char *msg, char *file, int line)
}
return (ret);
}
+
+/*!
+ * Provides an error checked close() call.
+ * Call this via the CKD_CLOSE macro
+ * \return close return value
+ */
+ssize_t ckd_close(int fd, char *file, int line)
+{
+ ssize_t ret;
+
+ do {
+ ret = close(fd);
+ } while (ret == -1 && errno == EINTR);
+ if (ret == -1) {
+ MSG_ERR("%s:%d: close: %s\n", file, line, dStrerror(errno));
+ }
+ return (ret);
+}
+
diff --git a/dpid/dpid_common.h b/dpid/dpid_common.h
index 65b8bc89..ed886e19 100644
--- a/dpid/dpid_common.h
+++ b/dpid/dpid_common.h
@@ -31,9 +31,10 @@
/*!
- * Macro for calling the ckd_write function
+ * Macros for calling ckd_write and ckd_close functions
*/
#define CKD_WRITE(fd, msg) ckd_write(fd, msg, __FILE__, __LINE__)
+#define CKD_CLOSE(fd) ckd_close(fd, __FILE__, __LINE__)
/*! Error codes for dpid */
@@ -56,5 +57,6 @@ void errmsg(char *caller, char *called, int errornum, char *file, int line);
int no_dotfiles(const struct dirent *filedat);
ssize_t ckd_write(int fd, char *msg, char *file, int line);
+ssize_t ckd_close(int fd, char *file, int line);
#endif