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