@global rockup, mkrock; { @local recons; recons = []; @defloc usleep(n) { select([], [], [], [ n/1000000, n%1000000]); } @define rockup() { foreach(@lambda(f){f();}, recons); } @define mkrock(fd) { @local maxtries; maxtries = 10; @defloc reconnect() { @local n; n = 0; while(n++ < maxtries){ fd = tcpopen(getpeername(fd)); if(fd != nil) return nil; usleep(3000000); } } // @defloc r(len) // { // @local b, e; // b = read(fd, len); // if(b != nil) // return b; // e = errno(); // if(e[0] == 0) // return nil; // reconnect(); // return r(len); // } // // @defloc w(buf) // { // @local e; // write(fd, buf); // e = errno(); // if(e[0] == 0) // return nil; // printf("errno was %a\n", e); // reconnect(); // return w(buf); // } // @defloc r(len) { return fread(fd, len); } @defloc w(buf) { return write(fd, buf); } @defloc c() { delete(recons, reconnect); close(fd); } append(recons, reconnect); return mkfd(r, w, c, "rock"); } }