+.config/yt-dlp.conf
[nethome.git] / src / streamfer.C
1 #include "streamfer.h"
2 #include <unistd.h>
3
4 static void vwarning(const char *msg,va_list ap) {
5   int err=vfprintf(stderr,msg,ap);
6   assert(err>0);
7   fputc('\n',stderr);
8 }
9
10 void warning(const char *msg,...) {
11   va_list ap;
12   va_start(ap,msg);
13   vwarning(msg,ap);
14   va_end(ap);
15 }
16
17 void fatal(const char *msg,...) {
18   va_list ap;
19   va_start(ap,msg);
20   vwarning(msg,ap);
21   va_end(ap);
22   exit(EXIT_FAILURE);
23 }
24
25 uint64_t transfer(int from_fd,const char *from_fn,int to_fd,const char *to_fn) {
26   size_t total(0);
27   uint8_t buffer[0x10000];
28   size_t buffer_filled(0);
29   for (;;) {
30     if (buffer_filled==0) {
31       ssize_t got(read(from_fd,buffer+buffer_filled,sizeof(buffer)-buffer_filled));
32       if (got==-1)
33         fatal("Error reading %s: %m",from_fn);
34       if (got==0)
35         return total;
36       buffer_filled=got;
37       assert(buffer_filled<=sizeof(buffer));
38     }
39     size_t buffer_written(0);
40     while (buffer_written<buffer_filled) {
41       ssize_t got(write(to_fd,buffer+buffer_written,buffer_filled-buffer_written));
42       if (got==-1)
43         fatal("Error writing %s: %m",to_fn);
44       assert(got>0);
45       buffer_written+=got;
46       assert(buffer_written<=buffer_filled);
47     }
48     total+=buffer_filled;
49     buffer_filled=0;
50   }
51 }