blind-tee.c - blind - suckless command-line video editing utility
(HTM) git clone git://git.suckless.org/blind
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
blind-tee.c (985B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include "common.h"
3
4 USAGE("[file ...]")
5
6 int
7 main(int argc, char *argv[])
8 {
9 char buf[PIPE_BUF];
10 int *fds = alloca((size_t)argc * sizeof(*fds));
11 size_t i, n = 0, done;
12 ssize_t r, w, *ps;
13
14 UNOFLAGS(0);
15
16 signal(SIGPIPE, SIG_IGN);
17
18 fds[n++] = STDOUT_FILENO;
19 while (argc--)
20 fds[n++] = eopen(*argv++, O_WRONLY | O_CREAT | O_TRUNC, 0666);
21
22 ps = alloca(n * sizeof(*ps));
23
24 while (n) {
25 memset(ps, 0, n * sizeof(*ps));
26 r = read(STDIN_FILENO, buf, sizeof(buf));
27 if (r < 0)
28 eprintf("read <stdin>:");
29 if (!r)
30 break;
31 for (done = 0; done < n;) {
32 for (i = 0; i < n; i++) {
33 if (ps[i] == r)
34 continue;
35 w = write(fds[i], buf + ps[i], (size_t)(r - ps[i]));
36 if (w < 0) {
37 close(fds[i]);
38 n--;
39 memmove(fds + i, fds + i + 1, (n - i) * sizeof(*fds));
40 memmove(ps + i, ps + i + 1, (n - i) * sizeof(*ps));
41 }
42 ps[i] += w;
43 if (ps[i] == r)
44 done++;
45 }
46 }
47 }
48
49 return 0;
50 }