Commit 80194503 authored by Juliusz Chroboczek's avatar Juliusz Chroboczek

Implement tcp_server_socket.

parent 0b4cbdf8
...@@ -24,7 +24,9 @@ THE SOFTWARE. ...@@ -24,7 +24,9 @@ THE SOFTWARE.
#include <fcntl.h> #include <fcntl.h>
#include <string.h> #include <string.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <errno.h> #include <errno.h>
...@@ -152,3 +154,51 @@ babel_send(int s, ...@@ -152,3 +154,51 @@ babel_send(int s,
} }
return rc; return rc;
} }
int
tcp_server_socket(int port, int local)
{
struct sockaddr_in6 sin6;
int s, rc, saved_errno;
int one = 1;
s = socket(PF_INET6, SOCK_STREAM, 0);
if(s < 0)
return -1;
rc = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
if(rc < 0)
goto fail;
rc = fcntl(s, F_GETFL, 0);
if(rc < 0)
goto fail;
rc = fcntl(s, F_SETFL, (rc | O_NONBLOCK));
if(rc < 0)
goto fail;
memset(&sin6, 0, sizeof(sin6));
sin6.sin6_family = AF_INET6;
sin6.sin6_port = htons(port);
if(local) {
rc = inet_pton(AF_INET6, "::1", &sin6.sin6_addr);
if(rc < 0)
goto fail;
}
rc = bind(s, (struct sockaddr*)&sin6, sizeof(sin6));
if(rc < 0)
goto fail;
rc = listen(s, 2);
if(rc < 0)
goto fail;
return s;
fail:
saved_errno = errno;
close(s);
errno = saved_errno;
return -1;
}
...@@ -25,3 +25,4 @@ int babel_recv(int s, void *buf, int buflen, struct sockaddr *sin, int slen); ...@@ -25,3 +25,4 @@ int babel_recv(int s, void *buf, int buflen, struct sockaddr *sin, int slen);
int babel_send(int s, int babel_send(int s,
const void *buf1, int buflen1, const void *buf2, int buflen2, const void *buf1, int buflen1, const void *buf2, int buflen2,
const struct sockaddr *sin, int slen); const struct sockaddr *sin, int slen);
int tcp_server_socket(int port, int local);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment