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_LOCAL;
33 addr.sun_path[0] = '\0';
34 len = strlen(name) + 1 + sizeof(sa_family_t);
35 strncpy(&addr.sun_path[1], name, len);
37 fd = socket(AF_LOCAL, SOCK_STREAM, 0);
42 if (connect(fd, (struct sockaddr *)&addr, len) == -1) {
51 * create a unix domain socket and start listening on it
52 * return a file descriptor open on the socket
54 int ux_socket_listen(const char *name)
57 struct sockaddr_un addr;
59 fd = socket(AF_LOCAL, SOCK_STREAM, 0);
60 if (fd == -1) return -1;
62 memset(&addr, 0, sizeof(addr));
63 addr.sun_family = AF_LOCAL;
64 addr.sun_path[0] = '\0';
65 len = strlen(name) + 1 + sizeof(sa_family_t);
66 strncpy(&addr.sun_path[1], name, len);
68 if (bind(fd, (struct sockaddr *)&addr, len) == -1) {
73 if (listen(fd, 10) == -1) {
82 * keep writing until it's all sent
84 size_t write_all(int fd, const void *buf, size_t len)
89 ssize_t n = write(fd, buf, len);
91 if ((errno == EINTR) || (errno == EAGAIN))
97 buf = n + (char *)buf;
105 * keep reading until its all read
107 size_t read_all(int fd, void *buf, size_t len)
117 ret = poll(&pfd, 1, 1000);
121 } else if (ret < 0) {
125 } else if (!pfd.revents & POLLIN)
127 n = read(fd, buf, len);
129 if ((errno == EINTR) || (errno == EAGAIN))
135 buf = n + (char *)buf;
143 * send a packet in length prefix format
145 int send_packet(int fd, const char *buf, size_t len)
152 sigaddset(&set, SIGPIPE);
153 pthread_sigmask(SIG_BLOCK, &set, &old);
155 if (write_all(fd, &len, sizeof(len)) != sizeof(len))
157 if (!ret && write_all(fd, buf, len) != len)
160 /* And unblock it again */
161 pthread_sigmask(SIG_SETMASK, &old, NULL);
167 * receive a packet in length prefix format
169 int recv_packet(int fd, char **buf, size_t *len)
171 if (read_all(fd, len, sizeof(*len)) != sizeof(*len)) {
180 (*buf) = MALLOC(*len);
183 if (read_all(fd, *buf, *len) != *len) {