collapseos/tools/pingpong.c

60 lines
1.6 KiB
C

#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;
}