#include "streamfer.h" #include static void vwarning(const char *msg,va_list ap) { int err=vfprintf(stderr,msg,ap); assert(err>0); fputc('\n',stderr); } void warning(const char *msg,...) { va_list ap; va_start(ap,msg); vwarning(msg,ap); va_end(ap); } void fatal(const char *msg,...) { va_list ap; va_start(ap,msg); vwarning(msg,ap); va_end(ap); exit(EXIT_FAILURE); } uint64_t transfer(int from_fd,const char *from_fn,int to_fd,const char *to_fn) { size_t total(0); uint8_t buffer[0x10000]; size_t buffer_filled(0); for (;;) { if (buffer_filled==0) { ssize_t got(read(from_fd,buffer+buffer_filled,sizeof(buffer)-buffer_filled)); if (got==-1) fatal("Error reading %s: %m",from_fn); if (got==0) return total; buffer_filled=got; assert(buffer_filled<=sizeof(buffer)); } size_t buffer_written(0); while (buffer_written0); buffer_written+=got; assert(buffer_written<=buffer_filled); } total+=buffer_filled; buffer_filled=0; } }