From 64060294ab58dfd07a95a24a1500602421748da9 Mon Sep 17 00:00:00 2001 From: Marq Schneider Date: Wed, 11 Aug 2010 22:37:51 -0500 Subject: Allow changing the upload and download rates at runtime. This adds a 'rate' command to modify the up and download rates on the fly. Closes GH-10 --- cli/btcli.c | 2 ++ cli/btcli.h | 2 ++ cli/rate.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 cli/rate.c (limited to 'cli') diff --git a/cli/btcli.c b/cli/btcli.c index bc1fb80..8d1aada 100644 --- a/cli/btcli.c +++ b/cli/btcli.c @@ -114,6 +114,7 @@ static struct { { "del", cmd_del, usage_del }, { "kill", cmd_kill, usage_kill }, { "list", cmd_list, usage_list }, + { "rate", cmd_rate, usage_rate }, { "start", cmd_start, usage_start }, { "stop", cmd_stop, usage_stop }, { "stat", cmd_stat, usage_stat } @@ -141,6 +142,7 @@ usage(void) "del\t- Remove torrents from btpd.\n" "kill\t- Shut down btpd.\n" "list\t- List torrents.\n" + "rate\t- Set up/download rate limits.\n" "start\t- Activate torrents.\n" "stat\t- Display stats for active torrents.\n" "stop\t- Deactivate torrents.\n" diff --git a/cli/btcli.h b/cli/btcli.h index 19d360a..d0e0a28 100644 --- a/cli/btcli.h +++ b/cli/btcli.h @@ -45,6 +45,8 @@ void usage_stat(void); void cmd_stat(int argc, char **argv); void usage_kill(void); void cmd_kill(int argc, char **argv); +void usage_rate(void); +void cmd_rate(int argc, char **argv); void usage_start(void); void cmd_start(int argc, char **argv); void usage_stop(void); 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 \n" + "\n" + "Arguments:\n" + " \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]); +} + -- cgit 1.4.1