| #include "cache.h" |
| #include "unix-socket.h" |
| |
| 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(); |
| |
| 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; |
| } |