|
- #include <stdlib.h>
- #include <stdio.h>
- #include <fcntl.h>
- #include <unistd.h>
-
- #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;
- }
-
|