aboutsummaryrefslogtreecommitdiff
path: root/coreutils
diff options
context:
space:
mode:
authorManuel Novoa III <mjn3@codepoet.org>2005-02-13 20:14:05 +0000
committerManuel Novoa III <mjn3@codepoet.org>2005-02-13 20:14:05 +0000
commit2c511609c4d92ee4e3e603d449c13579d1ea641a (patch)
treed57c8dd9efa4c30cd01290f878cae688ae792cc0 /coreutils
parentd2fe81706c9d65dd1580c85338036cc403364fae (diff)
downloadbusybox-w32-2c511609c4d92ee4e3e603d449c13579d1ea641a.tar.gz
busybox-w32-2c511609c4d92ee4e3e603d449c13579d1ea641a.tar.bz2
busybox-w32-2c511609c4d92ee4e3e603d449c13579d1ea641a.zip
Add 'nice' and replace 'renice' with a new implementation.
Diffstat (limited to 'coreutils')
-rw-r--r--coreutils/Config.in6
-rw-r--r--coreutils/Makefile.in1
-rw-r--r--coreutils/nice.c86
3 files changed, 93 insertions, 0 deletions
diff --git a/coreutils/Config.in b/coreutils/Config.in
index 4aff5ce69..a299506e6 100644
--- a/coreutils/Config.in
+++ b/coreutils/Config.in
@@ -329,6 +329,12 @@ config CONFIG_MV
329 help 329 help
330 mv is used to move or rename files or directories. 330 mv is used to move or rename files or directories.
331 331
332config CONFIG_NICE
333 bool "nice"
334 default n
335 help
336 nice runs a program with modified scheduling priority.
337
332config CONFIG_OD 338config CONFIG_OD
333 bool "od" 339 bool "od"
334 default n 340 default n
diff --git a/coreutils/Makefile.in b/coreutils/Makefile.in
index aacb813b3..63823657f 100644
--- a/coreutils/Makefile.in
+++ b/coreutils/Makefile.in
@@ -58,6 +58,7 @@ COREUTILS-$(CONFIG_MKDIR) += mkdir.o
58COREUTILS-$(CONFIG_MKFIFO) += mkfifo.o 58COREUTILS-$(CONFIG_MKFIFO) += mkfifo.o
59COREUTILS-$(CONFIG_MKNOD) += mknod.o 59COREUTILS-$(CONFIG_MKNOD) += mknod.o
60COREUTILS-$(CONFIG_MV) += mv.o 60COREUTILS-$(CONFIG_MV) += mv.o
61COREUTILS-$(CONFIG_NICE) += nice.o
61COREUTILS-$(CONFIG_OD) += od.o 62COREUTILS-$(CONFIG_OD) += od.o
62COREUTILS-$(CONFIG_PRINTF) += printf.o 63COREUTILS-$(CONFIG_PRINTF) += printf.o
63COREUTILS-$(CONFIG_PWD) += pwd.o 64COREUTILS-$(CONFIG_PWD) += pwd.o
diff --git a/coreutils/nice.c b/coreutils/nice.c
new file mode 100644
index 000000000..b66f9d82d
--- /dev/null
+++ b/coreutils/nice.c
@@ -0,0 +1,86 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * nice implementation for busybox
4 *
5 * Copyright (C) 2005 Manuel Novoa III <mjn3@codepoet.org>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 *
21 */
22
23#include <stdio.h>
24#include <stdlib.h>
25#include <string.h>
26#include <limits.h>
27#include <errno.h>
28#include <unistd.h>
29#include <sys/time.h>
30#include <sys/resource.h>
31#include "busybox.h"
32
33static inline int int_add_no_wrap(int a, int b)
34{
35 int s = a + b;
36
37 if (b < 0) {
38 if (s > a) s = INT_MIN;
39 } else {
40 if (s < a) s = INT_MAX;
41 }
42
43 return s;
44}
45
46int nice_main(int argc, char **argv)
47{
48 static const char Xetpriority_msg[] = "cannot %cet priority";
49
50 int old_priority, adjustment;
51
52 errno = 0; /* Needed for getpriority error detection. */
53 old_priority = getpriority(PRIO_PROCESS, 0);
54 if (errno) {
55 bb_perror_msg_and_die(Xetpriority_msg, 'g');
56 }
57
58 if (!*++argv) { /* No args, so (GNU) output current nice value. */
59 bb_printf("%d\n", old_priority);
60 bb_fflush_stdout_and_exit(EXIT_SUCCESS);
61 }
62
63 adjustment = 10; /* Set default adjustment. */
64
65 if ((argv[0][0] == '-') && (argv[0][1] == 'n') && !argv[0][2]) { /* "-n" */
66 if (argc < 4) { /* Missing priority and/or utility! */
67 bb_show_usage();
68 }
69 adjustment = bb_xgetlarg(argv[1], 10, INT_MIN, INT_MAX);
70 argv += 2;
71 }
72
73 { /* Set our priority. Handle integer wrapping for old + adjust. */
74 int new_priority = int_add_no_wrap(old_priority, adjustment);
75
76 if (setpriority(PRIO_PROCESS, 0, new_priority) < 0) {
77 bb_perror_msg_and_die(Xetpriority_msg, 's');
78 }
79 }
80
81 execvp(*argv, argv); /* Now exec the desired program. */
82
83 /* The exec failed... */
84 bb_default_error_retval = (errno == ENOENT) ? 127 : 126; /* SUSv3 */
85 bb_perror_msg_and_die("%s", *argv);
86}