blind-to-named.c - blind - suckless command-line video editing utility | |
git clone git://git.suckless.org/blind | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
blind-to-named.c (1722B) | |
--- | |
1 /* See LICENSE file for copyright and license details. */ | |
2 #include "common.h" | |
3 | |
4 USAGE("[-a] path") | |
5 | |
6 static void | |
7 esend_fd(int sock, int fd) | |
8 { | |
9 char buf[1]; | |
10 struct iovec iov; | |
11 struct msghdr msg; | |
12 struct cmsghdr *cmsg; | |
13 char cms[CMSG_SPACE(sizeof(fd))]; | |
14 | |
15 buf[0] = 0; | |
16 iov.iov_base = buf; | |
17 iov.iov_len = 1; | |
18 | |
19 memset(&msg, 0, sizeof(msg)); | |
20 msg.msg_iov = &iov; | |
21 msg.msg_iovlen = 1; | |
22 msg.msg_control = (caddr_t)cms; | |
23 msg.msg_controllen = CMSG_LEN(sizeof(fd)); | |
24 | |
25 cmsg = CMSG_FIRSTHDR(&msg); | |
26 cmsg->cmsg_len = CMSG_LEN(sizeof(fd)); | |
27 cmsg->cmsg_level = SOL_SOCKET; | |
28 cmsg->cmsg_type = SCM_RIGHTS; | |
29 memcpy(CMSG_DATA(cmsg), &fd, sizeof(fd)); | |
30 | |
31 if (sendmsg(sock, &msg, 0) != (ssize_t)iov.iov_len) | |
32 eprintf("sendmsg:"); | |
33 } | |
34 | |
35 int | |
36 main(int argc, char *argv[]) | |
37 { | |
38 struct sockaddr_un addr; | |
39 int abstract = 0; | |
40 int serverfd, connfd; | |
41 | |
42 ARGBEGIN { | |
43 case 'a': | |
44 abstract = 1; | |
45 break; | |
46 default: | |
47 usage(); | |
48 } ARGEND; | |
49 if (argc != 1) | |
50 usage(); | |
51 | |
52 memset(&addr, 0, sizeof(addr)); | |
53 addr.sun_family = AF_UNIX; | |
54 if (strlen(argv[0]) + (size_t)(1 + abstract) > sizeof(addr.sun_p… | |
55 errno = ENAMETOOLONG; | |
56 eprintf("%s:", argv[0]); | |
57 } | |
58 strcpy(addr.sun_path + abstract, argv[0]); | |
59 | |
60 serverfd = socket(PF_UNIX, SOCK_SEQPACKET, 0); | |
61 if (serverfd < 0) | |
62 eprintf("socket PF_UNIX SOCK_SEQPACKET:"); | |
63 | |
64 if (bind(serverfd, (const struct sockaddr *)&addr, (size_t)sizeo… | |
65 eprintf("bind %s%s%s:", | |
66 abstract ? "<abstract:" : "", | |
67 addr.sun_path + abstract, | |
68 abstract ? ">" : ""); | |
69 | |
70 if (listen(serverfd, 1) < 0) | |
71 eprintf("listen:"); | |
72 | |
73 connfd = accept(serverfd, NULL, NULL); | |
74 if (connfd < 0) | |
75 eprintf("accept:"); | |
76 | |
77 if (*addr.sun_path) | |
78 unlink(addr.sun_path); | |
79 close(serverfd); | |
80 | |
81 esend_fd(connfd, STDIN_FILENO); | |
82 close(connfd); | |
83 return 0; | |
84 } |