#include #include #include #include #include #include char b[4096]; ssize_t r, w; size_t i; #define A(x, l, e) if ((x) < 0) if (errno == EAGAIN) goto l; else goto e; if (!(x)) goto e; else int main(int f, char **v) { if (f) goto E; if (!*v) goto F; if ((f = open(*v, O_RDONLY)) < 0) err(1, "open(`%s')", *v); R: r = read(f, b, sizeof(b)); A(r, R, E); W: w = write(1, b, r); A(w, W, R); r -= (i = w); while (i < r+w) b[i-w] = b[i]; goto W; E: f && close(f); main(0, ++v); F: ; }