First Commit
[librecmc/package-feed.git] / utils / sockread / src / main.c
1
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <errno.h>
5 #include <stddef.h>
6 #include <unistd.h>
7 #include <sys/socket.h>
8 #include <sys/un.h>
9
10 int main(int argc, char *argv[]) {
11         char buf[1024];
12         ssize_t r;
13
14         if (argc != 2) {
15                 fprintf(stderr, "Write to and read from a Unix domain socket.\n\nUsage: %s <socket>\n", argv[0]);
16                 return 1;
17         }
18
19         size_t addrlen = strlen(argv[1]);
20
21         /* Allocate enough space for arbitrary-length paths */
22         char addrbuf[offsetof(struct sockaddr_un, sun_path) + addrlen + 1];
23         memset(addrbuf, 0, sizeof(addrbuf));
24
25         struct sockaddr_un *addr = (struct sockaddr_un *)addrbuf;
26         addr->sun_family = AF_UNIX;
27         memcpy(addr->sun_path, argv[1], addrlen+1);
28
29         int fd = socket(AF_UNIX, SOCK_STREAM, 0);
30         if (fd < 0) {
31                 fprintf(stderr, "Failed to create socket: %s\n", strerror(errno));
32                 return 1;
33         }
34
35         if (connect(fd, (struct sockaddr*)addr, sizeof(addrbuf)) < 0) {
36                 fprintf(stderr, "Can't connect to `%s': %s\n", argv[1], strerror(errno));
37                 return 1;
38         }
39
40         /* Check if stdin refers to a terminal */
41         if (!isatty(fileno(stdin))) {
42                 /* Read from stdin and write to socket */
43                 while (0 < (r = fread(buf, 1, sizeof(buf), stdin))) {
44                         send(fd, buf, r, 0);
45                 }
46         }
47
48         /* Read from socket and write to stdout */
49         while (1) {
50                 r = recv(fd, buf, sizeof(buf), 0);
51                 if (r < 0) {
52                         fprintf(stderr, "read: %s\n", strerror(errno));
53                         return 1;
54                 }
55
56                 if (r == 0)
57                         return 0;
58
59                 fwrite(buf, r, 1, stdout);
60         }
61
62         return 0;
63 }