#define NET_ERRORS \
- PARA_ERROR(SOCKET, "socket error"), \
PARA_ERROR(CONNECT, "connect error"), \
- PARA_ERROR(SETSOCKOPT, "failed to set socket options"), \
- PARA_ERROR(BIND, "bind error"), \
PARA_ERROR(NAME_TOO_LONG, "name too long for struct sockaddr_un"), \
PARA_ERROR(CHMOD, "failed to set socket mode"), \
PARA_ERROR(SENDMSG, "sendmsg() failed"), \
PARA_ERROR(RECVMSG, "recvmsg() failed"), \
PARA_ERROR(SCM_CREDENTIALS, "did not receive SCM credentials"), \
- PARA_ERROR(LISTEN, "listen error"), \
PARA_ERROR(RECV_PATTERN, "did not receive expected pattern"), \
*
* \param domain The communication domain that selects the protocol family.
*
- * \return The socket fd on success, -E_SOCKET on errors.
- *
* Create an IPv4 socket for sequenced, reliable, two-way, connection-based
* byte streams.
*
+ * \return The socket fd on success, negative on errors.
+ *
* \sa socket(2).
*/
int get_stream_socket(int domain)
{
- int socket_fd;
+ int fd = socket(domain, SOCK_STREAM, 0);
- if ((socket_fd = socket(domain, SOCK_STREAM, 0)) == -1)
- return -E_SOCKET;
- return socket_fd;
+ if (fd < 0)
+ return -ERRNO_TO_PARA_ERROR(errno);
+ return fd;
}
/**
return new_fd < 0? -ERRNO_TO_PARA_ERROR(errno) : new_fd;
}
-static int setserversockopts(int socket_fd)
-{
- int yes = 1;
-
- if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &yes,
- sizeof(int)) == -1)
- return -E_SETSOCKOPT;
- return 1;
-}
-
/**
* prepare a structure for \p AF_UNIX socket addresses
*
ret = init_unix_addr(unix_addr, name);
if (ret < 0)
return ret;
- fd = socket(PF_UNIX, SOCK_STREAM, 0);
- if (fd < 0)
- return -E_SOCKET;
- ret = -E_BIND;
- if (bind(fd, (struct sockaddr *) unix_addr, UNIX_PATH_MAX) < 0)
+ ret = socket(PF_UNIX, SOCK_STREAM, 0);
+ if (ret < 0)
+ return -ERRNO_TO_PARA_ERROR(errno);
+ fd = ret;
+ ret = bind(fd, (struct sockaddr *) unix_addr, UNIX_PATH_MAX);
+ if (ret < 0) {
+ ret = -ERRNO_TO_PARA_ERROR(errno);
goto err;
+ }
ret = -E_CHMOD;
if (chmod(name, mode) < 0)
goto err;
#define BACKLOG 10
/**
- * create a socket, bind it and listen
+ * Create a tcp socket, bind it and listen on the given port.
*
- * \param port the tcp port to listen on
+ * \param Port the tcp port to listen on.
*
- * \return The file descriptor of the created socket, negative
- * on errors.
+ * \return The file descriptor of the created socket, negative on errors.
*
* \sa get_stream_socket()
* \sa setsockopt(2)
* \sa bind(2)
* \sa listen(2)
*/
-int init_tcp_socket(int port)
+int tcp_listen(int port)
{
struct sockaddr_in my_addr;
int fd, ret = get_stream_socket(AF_INET);
if (ret < 0)
return ret;
fd = ret;
- ret = setserversockopts(fd);
- if (ret < 0)
+ ret = 1;
+ ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &ret, sizeof(int));
+ if (ret < 0) {
+ ret = -ERRNO_TO_PARA_ERROR(errno);
goto err;
+ }
init_sockaddr(&my_addr, port, NULL);
- ret = -E_BIND;
- if (bind(fd, (struct sockaddr *)&my_addr,
- sizeof(struct sockaddr)) == -1) {
- PARA_CRIT_LOG("bind error: %s\n", strerror(errno));
+ ret = bind(fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
+ if (ret < 0) {
+ ret = -ERRNO_TO_PARA_ERROR(errno);
goto err;
}
- ret = -E_LISTEN;
- if (listen(fd, BACKLOG) == -1)
+ ret = listen(fd, BACKLOG);
+ if (ret < 0) {
+ ret = -ERRNO_TO_PARA_ERROR(errno);
goto err;
+ }
PARA_INFO_LOG("listening on port %d, fd %d\n", port, fd);
return fd;
err: