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;
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;
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)
112 ssize_t n = read(fd, buf, len);
114 if ((errno == EINTR) || (errno == EAGAIN))
120 buf = n + (char *)buf;
128 * send a packet in length prefix format
130 int send_packet(int fd, const char *buf, size_t len)
137 sigaddset(&set, SIGPIPE);
138 pthread_sigmask(SIG_BLOCK, &set, &old);
140 if (write_all(fd, &len, sizeof(len)) != sizeof(len))
142 if (!ret && write_all(fd, buf, len) != len)
145 /* And unblock it again */
146 pthread_sigmask(SIG_SETMASK, &old, NULL);
152 * receive a packet in length prefix format
154 int recv_packet(int fd, char **buf, size_t *len)
156 if (read_all(fd, len, sizeof(*len)) != sizeof(*len)) {
165 (*buf) = MALLOC(*len);
168 if (read_all(fd, *buf, *len) != *len) {