about summary refs log tree commit diff
path: root/cli/rate.c
diff options
context:
space:
mode:
authorMarq Schneider <queueRAM@gmail.com>2010-08-11 22:37:51 -0500
committerMarq Schneider <queueRAM@gmail.com>2010-08-11 22:37:51 -0500
commit64060294ab58dfd07a95a24a1500602421748da9 (patch)
treeec61cfce0fd1f4a7a8fa7c00168e38a1bd481ed3 /cli/rate.c
parent033b776ab28e616fd9217087a50252297394a4ca (diff)
downloadbtpd-64060294ab58dfd07a95a24a1500602421748da9.tar.gz
btpd-64060294ab58dfd07a95a24a1500602421748da9.zip
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
Diffstat (limited to 'cli/rate.c')
-rw-r--r--cli/rate.c80
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]);
+}
+