X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-utils.git;a=blobdiff_plain;f=cprogs%2Frwbuffer.c;h=10b86ca0d1ec8e2d268ab9fe68aef1e2465cef54;hp=f2ec48da0e5a00086b8884e8e1afc0de36f8d6d7;hb=812c3e1f13c35ab65d0eb4aafbaab0ac5d4ea8b8;hpb=9e194d5bb088d41e7aa29042090b94d23a4ecb79 diff --git a/cprogs/rwbuffer.c b/cprogs/rwbuffer.c index f2ec48d..10b86ca 100644 --- a/cprogs/rwbuffer.c +++ b/cprogs/rwbuffer.c @@ -39,7 +39,7 @@ unsigned char *buf, *wp, *rp; int used, seeneof, maxselfd; -size_t buffersize; +size_t buffersize= RWBUFFER_SIZE_MB_DEF*1024*1024; fd_set readfds; fd_set writefds; @@ -84,7 +84,7 @@ void startupcore(void) { void startup(const char *const *argv) { const char *arg; char *ep; - unsigned long opt_buffersize=RWBUFFER_SIZE_MB_DEF; + int shift=-1; assert(argv[0]); @@ -92,15 +92,22 @@ void startup(const char *const *argv) { if (!strcmp(arg,"--mlock")) { opt_mlock= 1; } else if (isdigit((unsigned char)arg[0])) { - opt_buffersize= strtoul(arg,&ep,0); - if (opt_buffersize > RWBUFFER_SIZE_MB_MAX) + buffersize= strtoul(arg,&ep,0); + if (ep[0] && ep[1]) usageerr("buffer size spec. invalid"); + switch (ep[0]) { + case 0: case 'm': shift= 20; break; + case 'k': shift= 10; break; + case 'b': shift= 0; break; + default: usageerr("buffer size unit unknown"); + } + if (buffersize > ((RWBUFFER_SIZE_MB_MAX << 20) >> shift)) usageerr("buffer size too big"); + buffersize <<= shift; } else { usageerr("invalid option"); } } - buffersize= opt_buffersize*1024*1024; startupcore(); nonblock(0,1); nonblock(1,1); }