Files
git/unix-socket.c
Johannes Schindelin f04ee9c28e Support NO_UNIX_SOCKETS
The year is 2011AD. Desktop computers are entirely occupied by
POSIX-conforming operating systems. Well, not entirely...! One small
operating system of indomitable APIs still holds out against the invaders,
their POSIX functions and datatypes... and their Unix sockets.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2011-08-06 15:04:54 +02:00

73 lines
1.3 KiB
C

#include "cache.h"
#include "unix-socket.h"
#ifdef NO_UNIX_SOCKETS
int unix_stream_connect(const char *path)
{
errno = ENOSYS;
return -1;
}
int unix_stream_listen(const char *path)
{
errno = ENOSYS;
return -1;
}
#else
static int unix_stream_socket(void)
{
int fd = socket(AF_UNIX, SOCK_STREAM, 0);
if (fd < 0)
die_errno("unable to create socket");
return fd;
}
static void unix_sockaddr_init(struct sockaddr_un *sa, const char *path)
{
int size = strlen(path) + 1;
if (size > sizeof(sa->sun_path))
die("socket path is too long to fit in sockaddr");
memset(sa, 0, sizeof(*sa));
sa->sun_family = AF_UNIX;
memcpy(sa->sun_path, path, size);
}
int unix_stream_connect(const char *path)
{
int fd;
struct sockaddr_un sa;
unix_sockaddr_init(&sa, path);
fd = unix_stream_socket();
if (connect(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
close(fd);
return -1;
}
return fd;
}
int unix_stream_listen(const char *path)
{
int fd;
struct sockaddr_un sa;
unix_sockaddr_init(&sa, path);
fd = unix_stream_socket();
if (bind(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
unlink(path);
if (bind(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
close(fd);
return -1;
}
}
if (listen(fd, 5) < 0) {
close(fd);
return -1;
}
return fd;
}
#endif