#include #include #include #include #include "common.h" /* Sends the contents of `fname` to `device`, expecting every sent byte to be * echoed back verbatim. Compare every echoed byte with the one sent and bail * out if a mismatch is detected. When the whole file is sent, push a null char * to indicate EOF to the receiving end. * * It is recommended that you send contents that has gone through `ttysafe`. * * If "delayus" is specified, this will be the delay we wait between the moment * we write the "ping" and the moment where we fetch the "pong". */ int main(int argc, char **argv) { int delayus = 1000; if (argc == 4) { delayus = atoi(argv[3]); } else if (argc != 3) { fprintf(stderr, "Usage: ./pingpong device fname [delayus] \n"); return 1; } FILE *fp = fopen(argv[2], "r"); if (!fp) { fprintf(stderr, "Can't open %s.\n", argv[2]); return 1; } int fd = ttyopen(argv[1]); unsigned char c; int returncode = 0; while (fread(&c, 1, 1, fp)) { putchar('.'); fflush(stdout); write(fd, &c, 1); usleep(delayus); // let it breathe if (!mexpect(fd, c)) { // mismatch! unsigned int pos = ftell(fp); fprintf(stderr, "Mismatch at byte %d!\n", pos); returncode = 1; break; } } // To close the receiving loop on the other side, we send a straight null c = 0; write(fd, &c, 1); printf("Done!\n"); fclose(fp); if (fd > 0) { close(fd); } return returncode; }