source: MondoRescue/branches/3.3/mindi-busybox/miscutils/ionice.c@ 3647

Last change on this file since 3647 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

  • Property svn:eol-style set to native
File size: 2.4 KB
Line 
1/* vi: set sw=4 ts=4: */
2/*
3 * ionice implementation for busybox based on linux-utils-ng 2.14
4 *
5 * Copyright (C) 2008 by <u173034@informatik.uni-oldenburg.de>
6 *
7 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
8 */
9
10//usage:#define ionice_trivial_usage
11//usage: "[-c 1-3] [-n 0-7] [-p PID] [PROG]"
12//usage:#define ionice_full_usage "\n\n"
13//usage: "Change I/O priority and class\n"
14//usage: "\n -c Class. 1:realtime 2:best-effort 3:idle"
15//usage: "\n -n Priority"
16
17#include <sys/syscall.h>
18#include <asm/unistd.h>
19#include "libbb.h"
20
21static int ioprio_set(int which, int who, int ioprio)
22{
23 return syscall(SYS_ioprio_set, which, who, ioprio);
24}
25
26static int ioprio_get(int which, int who)
27{
28 return syscall(SYS_ioprio_get, which, who);
29}
30
31enum {
32 IOPRIO_WHO_PROCESS = 1,
33 IOPRIO_WHO_PGRP,
34 IOPRIO_WHO_USER
35};
36
37enum {
38 IOPRIO_CLASS_NONE,
39 IOPRIO_CLASS_RT,
40 IOPRIO_CLASS_BE,
41 IOPRIO_CLASS_IDLE
42};
43
44static const char to_prio[] ALIGN1 = "none\0realtime\0best-effort\0idle";
45
46#define IOPRIO_CLASS_SHIFT 13
47
48int ionice_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
49int ionice_main(int argc UNUSED_PARAM, char **argv)
50{
51 /* Defaults */
52 int ioclass = 0;
53 int pri = 0;
54 int pid = 0; /* affect own porcess */
55 int opt;
56 enum {
57 OPT_n = 1,
58 OPT_c = 2,
59 OPT_p = 4,
60 };
61
62 /* Numeric params */
63 opt_complementary = "n+:c+:p+";
64 /* '+': stop at first non-option */
65 opt = getopt32(argv, "+n:c:p:", &pri, &ioclass, &pid);
66 argv += optind;
67
68 if (opt & OPT_c) {
69 if (ioclass > 3)
70 bb_error_msg_and_die("bad class %d", ioclass);
71// Do we need this (compat?)?
72// if (ioclass == IOPRIO_CLASS_NONE)
73// ioclass = IOPRIO_CLASS_BE;
74// if (ioclass == IOPRIO_CLASS_IDLE) {
75// //if (opt & OPT_n)
76// // bb_error_msg("ignoring priority for idle class");
77// pri = 7;
78// }
79 }
80
81 if (!(opt & (OPT_n|OPT_c))) {
82 if (!(opt & OPT_p) && *argv)
83 pid = xatoi_positive(*argv);
84
85 pri = ioprio_get(IOPRIO_WHO_PROCESS, pid);
86 if (pri == -1)
87 bb_perror_msg_and_die("ioprio_%cet", 'g');
88
89 ioclass = (pri >> IOPRIO_CLASS_SHIFT) & 0x3;
90 pri &= 0xff;
91 printf((ioclass == IOPRIO_CLASS_IDLE) ? "%s\n" : "%s: prio %d\n",
92 nth_string(to_prio, ioclass), pri);
93 } else {
94//printf("pri=%d class=%d val=%x\n",
95//pri, ioclass, pri | (ioclass << IOPRIO_CLASS_SHIFT));
96 pri |= (ioclass << IOPRIO_CLASS_SHIFT);
97 if (ioprio_set(IOPRIO_WHO_PROCESS, pid, pri) == -1)
98 bb_perror_msg_and_die("ioprio_%cet", 's');
99 if (argv[0]) {
100 BB_EXECVP_or_die(argv);
101 }
102 }
103
104 return EXIT_SUCCESS;
105}
Note: See TracBrowser for help on using the repository browser.