about summary refs log tree commit diff
path: root/cli/rate.c
blob: 6e0a1bca26070c8dad9108fe507175296efee44f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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]);
}