1#include <stdio.h>
2#include <stdlib.h>
3#include <unistd.h>
4#include <errno.h>
5
6#include <cutils/iosched_policy.h>
7
8static char *classes[] = {"none", "rt", "be", "idle", NULL};
9
10int ionice_main(int argc, char *argv[])
11{
12    IoSchedClass clazz = IoSchedClass_NONE;
13    int ioprio = 0;
14    int pid;
15
16    if(argc != 2 && argc != 4) {
17        fprintf(stderr, "usage: ionice <pid> [none|rt|be|idle] [prio]\n");
18        return 1;
19    }
20
21    if (!(pid = atoi(argv[1]))) {
22        fprintf(stderr, "Invalid pid specified\n");
23        return 1;
24    }
25
26    if (argc == 2) {
27        if (android_get_ioprio(pid, &clazz, &ioprio)) {
28            fprintf(stderr, "Failed to read priority (%s)\n", strerror(errno));
29            return 1;
30        }
31        fprintf(stdout, "Pid %d, class %s (%d), prio %d\n", pid, classes[clazz], clazz, ioprio);
32        return 0;
33    }
34
35    if (!strcmp(argv[2], "none")) {
36        clazz = IoSchedClass_NONE;
37    } else if (!strcmp(argv[2], "rt")) {
38        clazz = IoSchedClass_RT;
39    } else if (!strcmp(argv[2], "be")) {
40        clazz = IoSchedClass_BE;
41    } else if (!strcmp(argv[2], "idle")) {
42        clazz = IoSchedClass_IDLE;
43    } else {
44        fprintf(stderr, "Unsupported class '%s'\n", argv[2]);
45        return 1;
46    }
47
48    ioprio = atoi(argv[3]);
49
50    printf("Setting pid %d i/o class to %d, prio %d\n", pid, clazz, ioprio);
51    if (android_set_ioprio(pid, clazz, ioprio)) {
52        fprintf(stderr, "Failed to set priority (%s)\n", strerror(errno));
53        return 1;
54    }
55
56    return 0;
57}
58