kopia lustrzana https://github.com/pabr/leansdr
leansdrcat: Add --block, --nonblock, --cbrN
rodzic
8bf35dd927
commit
22ed7b45bc
|
@ -9,19 +9,43 @@
|
|||
void fatal(const char *s) { perror(s); exit(1); }
|
||||
|
||||
void usage(const char *name, FILE *f, int c) {
|
||||
fprintf(f, "Usage: %s [--cbr bits_per_sec]\n", name);
|
||||
fprintf(f, "Forward from stdin to stdout at constant rate.\n");
|
||||
fprintf(f, "Usage: %s [options]\n", name);
|
||||
fprintf(f,
|
||||
"Forward from stdin to stdout at constant rate.\n"
|
||||
"\nOptions:\n"
|
||||
" --block Pause when stdout is busy (default: '#' on stderr)\n"
|
||||
" --nonblock Silently ignore when stdout is busy\n"
|
||||
" --cbr R Set rate in bits per second\n"
|
||||
" --cbr8 R Set rate in bytes per second\n"
|
||||
" --cbr16 R Set rate in 16-bit words per second\n"
|
||||
" --cbr32 R Set rate in 32-bit words per second\n"
|
||||
" --cbr64 R Set rate in 64-bit words per second\n"
|
||||
" -h Display this help message and exit\n"
|
||||
);
|
||||
exit(c);
|
||||
}
|
||||
|
||||
int main(int argc, const char *argv[]) {
|
||||
bool block=false, nonblock=false;
|
||||
int bytespersec = 2400000 * 2;
|
||||
|
||||
for ( int i=1; i<argc; ++i ) {
|
||||
if ( ! strcmp(argv[i], "-h") )
|
||||
usage(argv[0], stdout, 0);
|
||||
else if ( ! strcmp(argv[i], "--block") )
|
||||
block = true;
|
||||
else if ( ! strcmp(argv[i], "--nonblock") )
|
||||
nonblock = true;
|
||||
else if ( ! strcmp(argv[i], "--cbr") && i+1<argc )
|
||||
bytespersec = atoll(argv[++i]) / 8;
|
||||
else if ( ! strcmp(argv[i], "--cbr8") && i+1<argc )
|
||||
bytespersec = atoll(argv[++i]);
|
||||
else if ( ! strcmp(argv[i], "--cbr16") && i+1<argc )
|
||||
bytespersec = atoll(argv[++i]) * 2;
|
||||
else if ( ! strcmp(argv[i], "--cbr32") && i+1<argc )
|
||||
bytespersec = atoll(argv[++i]) * 4;
|
||||
else if ( ! strcmp(argv[i], "--cbr64") && i+1<argc )
|
||||
bytespersec = atoll(argv[++i]) * 8;
|
||||
else
|
||||
usage(argv[0], stderr, 1);
|
||||
}
|
||||
|
@ -31,9 +55,11 @@ int main(int argc, const char *argv[]) {
|
|||
if ( bytespersec < blocksize )
|
||||
blocksize = bytespersec;
|
||||
|
||||
long flags = fcntl(1, F_GETFL);
|
||||
flags |= O_NONBLOCK;
|
||||
if ( fcntl(1, F_SETFL, flags) ) fatal("fcntl(F_SETFL)");
|
||||
if ( ! block ) {
|
||||
long flags = fcntl(1, F_GETFL);
|
||||
flags |= O_NONBLOCK;
|
||||
if ( fcntl(1, F_SETFL, flags) ) fatal("fcntl(F_SETFL)");
|
||||
}
|
||||
|
||||
struct timeval tv0;
|
||||
if ( gettimeofday(&tv0, NULL) ) fatal("gettimeofday");
|
||||
|
@ -59,12 +85,22 @@ int main(int argc, const char *argv[]) {
|
|||
if ( nr < 0 ) fatal("read");
|
||||
if ( ! nr ) return 0;
|
||||
current += nr;
|
||||
ssize_t nw = write(1, buf, nr);
|
||||
if ( nw < 0 ) {
|
||||
if ( errno == EWOULDBLOCK ) fprintf(stderr, "#");
|
||||
else fatal("write");
|
||||
} else if ( ! nw ) fatal("write: EOF");
|
||||
else if ( nw < nr ) fprintf(stderr, "#");
|
||||
for ( unsigned char *p=buf; nr; ) {
|
||||
ssize_t nw = write(1, p, nr);
|
||||
if ( nw < 0 ) {
|
||||
if ( errno == EWOULDBLOCK ) {
|
||||
if ( ! nonblock ) fprintf(stderr, "#");
|
||||
nr = 0;
|
||||
} else
|
||||
fatal("write");
|
||||
} else if ( ! nw ) fatal("write: EOF");
|
||||
else {
|
||||
// Try again. If stdout is really busy we will get
|
||||
// EWOULDBLOCK eventually, unless --block was set.
|
||||
p += nw;
|
||||
nr -= nw;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue