diff options
Diffstat (limited to 'cli/rate.c')
| -rw-r--r-- | cli/rate.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/cli/rate.c b/cli/rate.c new file mode 100644 index 0000000..6e0a1bc --- /dev/null +++ b/cli/rate.c @@ -0,0 +1,80 @@ +#include "btcli.h" + +void +usage_rate(void) +{ + printf( + "Set upload and download rate.\n" + "\n" + "Usage: rate <up> <down>\n" + "\n" + "Arguments:\n" + "<up> <down>\n" + "\tThe up/down rate in KB/s\n" + "\n" + ); + exit(1); +} + +static struct option start_opts [] = { + { "help", no_argument, NULL, 'H' }, + {NULL, 0, NULL, 0} +}; + +static unsigned +parse_rate(char *rate) +{ + unsigned out; + char *end; + + out = strtol(rate, &end, 10); + if (end == rate) + usage_rate(); + + if ((end[0] != '\0') && (end[1] != '\0')) + usage_rate(); + + switch(end[0]) { + case 'g': + case 'G': + out <<= 30; + break; + case 'm': + case 'M': + out <<= 20; + break; + case '\0': /* default is 'k' */ + case 'k': + case 'K': + out <<= 10; + break; + case 'b': + case 'B': + break; + default: + usage_rate(); + } + return out; +} + +void +cmd_rate(int argc, char **argv) +{ + int ch; + unsigned up, down; + + while ((ch = getopt_long(argc, argv, "", start_opts, NULL)) != -1) + usage_rate(); + argc -= optind; + argv += optind; + + if (argc < 2) + usage_rate(); + + up = parse_rate(argv[0]); + down = parse_rate(argv[1]); + + btpd_connect(); + handle_ipc_res(btpd_rate(ipc, up, down), "rate", argv[1]); +} + |