9 #include <sys/socket.h>
15 connect to a unix domain socket
17 int ux_socket_connect(const char *name)
20 struct sockaddr_un addr;
22 memset(&addr, 0, sizeof(addr));
23 addr.sun_family = AF_UNIX;
24 strncpy(addr.sun_path, name, sizeof(addr.sun_path));
26 fd = socket(AF_UNIX, SOCK_DGRAM, 0);
31 if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
41 create a unix domain socket and bind it
42 return a file descriptor open on the socket
44 static int ux_socket_bind(const char *name)
47 struct sockaddr_un addr;
49 /* get rid of any old socket */
52 fd = socket(AF_UNIX, SOCK_DGRAM, 0);
53 if (fd == -1) return -1;
55 memset(&addr, 0, sizeof(addr));
56 addr.sun_family = AF_UNIX;
57 strncpy(addr.sun_path, name, sizeof(addr.sun_path));
59 if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
68 void *x_malloc(size_t size)
73 fprintf(stderr,"Out of memory for size %d\n", (int)size);
79 void *x_realloc(void *ptr, size_t size)
82 ret = realloc(ptr, size);
84 fprintf(stderr,"Out of memory for size %d\n", (int)size);
91 keep writing until its all sent
93 int write_all(int fd, const void *buf, size_t len)
97 int n = write(fd, buf, len);
98 if (n <= 0) return total;
99 buf = n + (char *)buf;
110 const char *fname = "ux_dgram.dat";
114 struct sockaddr_un from;
115 socklen_t fromlen=sizeof(from);
117 fd = ux_socket_bind(fname);
119 fd2 = ux_socket_connect(fname);
121 dprintf(fd2, "Hello world\n");
123 memset(&from, 0, sizeof(from));
125 s = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr *)&from, &fromlen);
126 printf("Received %d bytes from '%s' family=%d\n", s,
127 from.sun_path, from.sun_family);
129 r = connect(fd, (struct sockaddr *)&from, sizeof(from));
130 printf("connect gave %d\n", r);
132 s = sendto(fd, buf, s, 0, (struct sockaddr *)&from, sizeof(from));
133 printf("Sent %d bytes\n", s);