nice.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include <limits.h>
  26. #include <errno.h>
  27. #include <unistd.h>
  28. #include <sys/time.h>
  29. #include <sys/resource.h>
  30. #include "busybox.h"
  31. static inline int int_add_no_wrap(int a, int b)
  32. {
  33. int s = a + b;
  34. if (b < 0) {
  35. if (s > a) s = INT_MIN;
  36. } else {
  37. if (s < a) s = INT_MAX;
  38. }
  39. return s;
  40. }
  41. int nice_main(int argc, char **argv)
  42. {
  43. static const char Xetpriority_msg[] = "cannot %cet priority";
  44. int old_priority, adjustment;
  45. errno = 0; /* Needed for getpriority error detection. */
  46. old_priority = getpriority(PRIO_PROCESS, 0);
  47. if (errno) {
  48. bb_perror_msg_and_die(Xetpriority_msg, 'g');
  49. }
  50. if (!*++argv) { /* No args, so (GNU) output current nice value. */
  51. bb_printf("%d\n", old_priority);
  52. bb_fflush_stdout_and_exit(EXIT_SUCCESS);
  53. }
  54. adjustment = 10; /* Set default adjustment. */
  55. if ((argv[0][0] == '-') && (argv[0][1] == 'n') && !argv[0][2]) { /* "-n" */
  56. if (argc < 4) { /* Missing priority and/or utility! */
  57. bb_show_usage();
  58. }
  59. adjustment = bb_xgetlarg(argv[1], 10, INT_MIN, INT_MAX);
  60. argv += 2;
  61. }
  62. { /* Set our priority. Handle integer wrapping for old + adjust. */
  63. int new_priority = int_add_no_wrap(old_priority, adjustment);
  64. if (setpriority(PRIO_PROCESS, 0, new_priority) < 0) {
  65. bb_perror_msg_and_die(Xetpriority_msg, 's');
  66. }
  67. }
  68. execvp(*argv, argv); /* Now exec the desired program. */
  69. /* The exec failed... */
  70. bb_default_error_retval = (errno == ENOENT) ? 127 : 126; /* SUSv3 */
  71. bb_perror_msg_and_die("%s", *argv);
  72. }