2 * Original author : tridge@samba.org, January 2002
4 * Copyright (c) 2005 Christophe Varoqui
5 * Copyright (c) 2005 Alasdair Kergon, Redhat
12 #include <sys/ioctl.h>
13 #include <sys/types.h>
14 #include <sys/socket.h>
24 * connect to a unix domain socket
26 int ux_socket_connect(const char *name)
29 struct sockaddr_un addr;
31 memset(&addr, 0, sizeof(addr));
32 addr.sun_family = AF_UNIX;
33 strncpy(addr.sun_path, name, sizeof(addr.sun_path));
35 fd = socket(AF_UNIX, SOCK_STREAM, 0);
40 if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
49 * create a unix domain socket and start listening on it
50 * return a file descriptor open on the socket
52 int ux_socket_listen(const char *name)
55 struct sockaddr_un addr;
57 /* get rid of any old socket */
60 fd = socket(AF_UNIX, SOCK_STREAM, 0);
61 if (fd == -1) return -1;
63 memset(&addr, 0, sizeof(addr));
64 addr.sun_family = AF_UNIX;
65 strncpy(addr.sun_path, name, sizeof(addr.sun_path));
67 if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
72 if (listen(fd, 10) == -1) {
81 * keep writing until it's all sent
83 size_t write_all(int fd, const void *buf, size_t len)
88 ssize_t n = write(fd, buf, len);
90 if ((errno == EINTR) || (errno == EAGAIN))
96 buf = n + (char *)buf;
104 * keep reading until its all read
106 size_t read_all(int fd, void *buf, size_t len)
111 ssize_t n = read(fd, buf, len);
113 if ((errno == EINTR) || (errno == EAGAIN))
119 buf = n + (char *)buf;
127 * send a packet in length prefix format
129 int send_packet(int fd, const char *buf, size_t len)
136 sigaddset(&set, SIGPIPE);
137 pthread_sigmask(SIG_BLOCK, &set, &old);
139 if (write_all(fd, &len, sizeof(len)) != sizeof(len))
141 if (!ret && write_all(fd, buf, len) != len)
144 /* And unblock it again */
145 pthread_sigmask(SIG_SETMASK, &old, NULL);
151 * receive a packet in length prefix format
153 int recv_packet(int fd, char **buf, size_t *len)
155 if (read_all(fd, len, sizeof(*len)) != sizeof(*len)) return -1;
156 (*buf) = MALLOC(*len);
157 if (read_all(fd, *buf, *len) != *len) {