#include "socket.h"
#include <unistd.h>
#include <sys/fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int util_server_socket_local(
short *port) {
int socket_fd = socket(
AF_INET,
SOCK_STREAM,
0);
if(socket_fd <
0) {
return -1;
}
short socket_port =
0;
if(port) {
socket_port = *port;
}
struct sockaddr_in addr;
addr.sin_family =
AF_INET;
addr.sin_addr.s_addr = htonl(
INADDR_LOOPBACK);
addr.sin_port = htons(socket_port);
if(bind(socket_fd, (
struct sockaddr*)&addr,
sizeof(addr))) {
close(socket_fd);
return -1;
}
socklen_t len =
sizeof(addr);
if(getsockname(socket_fd, (
struct sockaddr *)&addr, &len) <
0) {
close(socket_fd);
return -1;
}
if(port) {
*port = ntohs(addr.sin_port);
}
return socket_fd;
}
int util_socket_connect_local(
short port) {
int fd = socket(
AF_INET,
SOCK_STREAM,
0);
if(fd <
0) {
return -1;
}
struct sockaddr_in addr;
addr.sin_family =
AF_INET;
addr.sin_addr.s_addr = htonl(
INADDR_LOOPBACK);
addr.sin_port = htons(port);
if(connect(fd, (
struct sockaddr*)&addr,
sizeof(addr))) {
close(fd);
return -1;
}
return fd;
}
int util_socketpair(
int fds[
2]) {
if (socketpair(
AF_UNIX,
SOCK_STREAM,
0, fds)) {
fds[
0] =
-1;
fds[
1] =
-1;
return -1;
}
return 0;
}
int util_socket_setnonblock(
int fd,
int nonblock) {
int flags;
if ((flags = fcntl(fd,
F_GETFL,
0)) ==
-1) {
flags =
0;
}
if(nonblock) {
flags |=
O_NONBLOCK;
}
else {
flags &= ~
O_NONBLOCK;
}
if (fcntl(fd,
F_SETFL, flags) !=
0) {
return 1;
}
return 0;
}