1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
static ssize_t
read_safe(int pfd, char *dest, ssize_t bytes)
{
ssize_t left = bytes;
ssize_t off = 0;
while (left > 0) {
ssize_t nr = read(pfd, &dest[off], left);
if (nr < 0) {
if (errno == EAGAIN ||
errno == EWOULDBLOCK ||
errno == EINTR)
continue;
return nr;
} else if (nr == 0) {
break;
}
off += nr;
left -= nr;
}
return off;
}
static ssize_t
write_safe(int pfd, char *dest, ssize_t bytes)
{
ssize_t left = bytes;
ssize_t off = 0;
while (left > 0) {
ssize_t nr = write(pfd, &dest[off], left);
if (nr < 0) {
if (errno == EAGAIN ||
errno == EWOULDBLOCK ||
errno == EINTR)
continue;
return nr;
} else if (nr == 0) {
break;
}
off += nr;
left -= nr;
}
return off;
}
int
main(int argc, char *argv[])
{
char buf[1024];
if (argc < 2) {
fprintf(stderr, "Not enough args\n");
exit(1);
}
/* read -n X and the just echo data read */
if (!strcmp(argv[1], "read") &&
!strcmp(argv[2], "-n")) {
ssize_t nr = (ssize_t)atoi(argv[3]);
if (nr <= 0) {
fprintf(stderr, "Wrong number of args\n");
exit(1);
}
if (nr >= (ssize_t)sizeof(buf)) {
fprintf(stderr, "Too many bytes to read\n");
exit(1);
}
ssize_t n = read_safe(STDIN_FILENO, buf, nr);
if (n != nr) {
fprintf(stderr, "Can't read from stdin\n");
exit(1);
}
n = write_safe(STDOUT_FILENO, buf, nr);
if (n != nr) {
fprintf(stderr, "Can't write to stdout\n");
exit(1);
}
exit(0);
}
/* just echo the data */
if (!strcmp(argv[1], "echo")) {
ssize_t nr = (ssize_t)strlen(argv[2]) + 1;
if (nr <= 0) {
fprintf(stderr, "Wrong number of bytes\n");
exit(1);
}
ssize_t n = write_safe(STDOUT_FILENO, argv[2], nr);
if (n != nr) {
fprintf(stderr, "Can't write to stdout\n");
exit(1);
}
exit(0);
}
/* just sleep forever */
if (!strcmp(argv[1], "loop")) {
for (;;)
sleep(10);
exit(0);
}
fprintf(stderr, "Unknown command passed\n");
return 1;
}
|