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-2c511609c4d92ee4e3e603d449c13579d1ea641a.tar.gz
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
help
mv is used to move or rename files or directories.
+config CONFIG_NICE
+ bool "nice"
+ default n
+ help
+ nice runs a program with modified scheduling priority.
+
config CONFIG_OD
bool "od"
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
COREUTILS-$(CONFIG_MKFIFO) += mkfifo.o
COREUTILS-$(CONFIG_MKNOD) += mknod.o
COREUTILS-$(CONFIG_MV) += mv.o
+COREUTILS-$(CONFIG_NICE) += nice.o
COREUTILS-$(CONFIG_OD) += od.o
COREUTILS-$(CONFIG_PRINTF) += printf.o
COREUTILS-$(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 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * nice implementation for busybox
+ *
+ * Copyright (C) 2005 Manuel Novoa III <mjn3@codepoet.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include "busybox.h"
+
+static inline int int_add_no_wrap(int a, int b)
+{
+ int s = a + b;
+
+ if (b < 0) {
+ if (s > a) s = INT_MIN;
+ } else {
+ if (s < a) s = INT_MAX;
+ }
+
+ return s;
+}
+
+int nice_main(int argc, char **argv)
+{
+ static const char Xetpriority_msg[] = "cannot %cet priority";
+
+ int old_priority, adjustment;
+
+ errno = 0; /* Needed for getpriority error detection. */
+ old_priority = getpriority(PRIO_PROCESS, 0);
+ if (errno) {
+ bb_perror_msg_and_die(Xetpriority_msg, 'g');
+ }
+
+ if (!*++argv) { /* No args, so (GNU) output current nice value. */
+ bb_printf("%d\n", old_priority);
+ bb_fflush_stdout_and_exit(EXIT_SUCCESS);
+ }
+
+ adjustment = 10; /* Set default adjustment. */
+
+ if ((argv[0][0] == '-') && (argv[0][1] == 'n') && !argv[0][2]) { /* "-n" */
+ if (argc < 4) { /* Missing priority and/or utility! */
+ bb_show_usage();
+ }
+ adjustment = bb_xgetlarg(argv[1], 10, INT_MIN, INT_MAX);
+ argv += 2;
+ }
+
+ { /* Set our priority. Handle integer wrapping for old + adjust. */
+ int new_priority = int_add_no_wrap(old_priority, adjustment);
+
+ if (setpriority(PRIO_PROCESS, 0, new_priority) < 0) {
+ bb_perror_msg_and_die(Xetpriority_msg, 's');
+ }
+ }
+
+ execvp(*argv, argv); /* Now exec the desired program. */
+
+ /* The exec failed... */
+ bb_default_error_retval = (errno == ENOENT) ? 127 : 126; /* SUSv3 */
+ bb_perror_msg_and_die("%s", *argv);
+}