mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-17 09:48:05 +11:00
57 lines
1.5 KiB
C
57 lines
1.5 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`.
|
||
|
*/
|
||
|
int main(int argc, char **argv)
|
||
|
{
|
||
|
if (argc != 3) {
|
||
|
fprintf(stderr, "Usage: ./pingpong device fname\n");
|
||
|
return 1;
|
||
|
}
|
||
|
FILE *fp = fopen(argv[2], "r");
|
||
|
if (!fp) {
|
||
|
fprintf(stderr, "Can't open %s.\n", argv[2]);
|
||
|
return 1;
|
||
|
}
|
||
|
int fd = open(argv[1], O_RDWR|O_NOCTTY|O_NONBLOCK);
|
||
|
printf("Press a key...\n");
|
||
|
getchar();
|
||
|
unsigned char c;
|
||
|
// empty the recv buffer
|
||
|
while (read(fd, &c, 1) == 1) usleep(1000);
|
||
|
int returncode = 0;
|
||
|
while (fread(&c, 1, 1, fp)) {
|
||
|
putchar('.');
|
||
|
fflush(stdout);
|
||
|
write(fd, &c, 1);
|
||
|
usleep(1000); // let it breathe
|
||
|
unsigned char c2;
|
||
|
while (read(fd, &c2, 1) != 1); // read echo
|
||
|
if (c != c2) {
|
||
|
// mismatch!
|
||
|
unsigned int pos = ftell(fp);
|
||
|
fprintf(stderr, "Mismatch at byte %d! %d != %d.\n", pos, c, c2);
|
||
|
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);
|
||
|
return returncode;
|
||
|
}
|
||
|
|
||
|
|