Changeset 1770 in MondoRescue for branches/stable/mindi-busybox/coreutils/nice.c
- Timestamp:
- Nov 6, 2007, 11:01:53 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/stable/mindi-busybox/coreutils/nice.c
r821 r1770 5 5 * Copyright (C) 2005 Manuel Novoa III <mjn3@codepoet.org> 6 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 * 7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. 21 8 */ 22 9 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 10 #include <sys/resource.h> 30 #include " busybox.h"11 #include "libbb.h" 31 12 32 static inline int int_add_no_wrap(int a, int b) 33 { 34 int s = a + b; 35 36 if (b < 0) { 37 if (s > a) s = INT_MIN; 38 } else { 39 if (s < a) s = INT_MAX; 40 } 41 42 return s; 43 } 44 13 int nice_main(int argc, char **argv); 45 14 int nice_main(int argc, char **argv) 46 15 { 47 static const char Xetpriority_msg[] = "cannot %cet priority";48 49 16 int old_priority, adjustment; 50 17 51 errno = 0; /* Needed for getpriority error detection. */52 18 old_priority = getpriority(PRIO_PROCESS, 0); 53 if (errno) {54 bb_perror_msg_and_die(Xetpriority_msg, 'g');55 }56 19 57 20 if (!*++argv) { /* No args, so (GNU) output current nice value. */ 58 bb_printf("%d\n", old_priority);59 bb_fflush_stdout_and_exit(EXIT_SUCCESS);21 printf("%d\n", old_priority); 22 fflush_stdout_and_exit(EXIT_SUCCESS); 60 23 } 61 24 62 25 adjustment = 10; /* Set default adjustment. */ 63 26 64 if ((argv[0][0] == '-') && (argv[0][1] == 'n') && !argv[0][2]) { /* "-n" */ 27 if (argv[0][0] == '-') { 28 if (argv[0][1] == 'n') { /* -n */ 29 if (argv[0][2]) { /* -nNNNN (w/o space) */ 30 argv[0] += 2; argv--; argc++; 31 } 32 } else { /* -NNN (NNN may be negative) == -n NNN */ 33 argv[0] += 1; argv--; argc++; 34 } 65 35 if (argc < 4) { /* Missing priority and/or utility! */ 66 36 bb_show_usage(); 67 37 } 68 adjustment = bb_xgetlarg(argv[1], 10, INT_MIN, INT_MAX);38 adjustment = xatoi_range(argv[1], INT_MIN/2, INT_MAX/2); 69 39 argv += 2; 70 40 } 71 41 72 { /* Set our priority. Handle integer wrapping for old + adjust.*/73 int new_priority = int_add_no_wrap(old_priority, adjustment);42 { /* Set our priority. */ 43 int prio = old_priority + adjustment; 74 44 75 if (setpriority(PRIO_PROCESS, 0, new_priority) < 0) {76 bb_perror_msg_and_die( Xetpriority_msg, 's');45 if (setpriority(PRIO_PROCESS, 0, prio) < 0) { 46 bb_perror_msg_and_die("setpriority(%d)", prio); 77 47 } 78 48 } 79 49 80 execvp(*argv, argv); /* Now exec the desired program. */50 BB_EXECVP(*argv, argv); /* Now exec the desired program. */ 81 51 82 52 /* The exec failed... */ 83 bb_default_error_retval = (errno == ENOENT) ? 127 : 126; /* SUSv3 */53 xfunc_error_retval = (errno == ENOENT) ? 127 : 126; /* SUSv3 */ 84 54 bb_perror_msg_and_die("%s", *argv); 85 55 }
Note:
See TracChangeset
for help on using the changeset viewer.