Changeset 1770 in MondoRescue for branches/stable/mindi-busybox/procps/renice.c
- Timestamp:
- Nov 6, 2007, 11:01:53 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/stable/mindi-busybox/procps/renice.c
r821 r1770 20 20 */ 21 21 22 #include "busybox.h" 23 #include <stdio.h> 24 #include <stdlib.h> 25 #include <string.h> 26 #include <limits.h> 27 #include <errno.h> 28 #include <unistd.h> 22 #include "libbb.h" 29 23 #include <sys/resource.h> 30 24 31 #if (PRIO_PROCESS < CHAR_MIN) || (PRIO_PROCESS > CHAR_MAX) 32 #error Assumption violated : PRIO_PROCESS value 33 #endif 34 #if (PRIO_PGRP < CHAR_MIN) || (PRIO_PGRP > CHAR_MAX) 35 #error Assumption violated : PRIO_PGRP value 36 #endif 37 #if (PRIO_USER < CHAR_MIN) || (PRIO_USER > CHAR_MAX) 38 #error Assumption violated : PRIO_USER value 39 #endif 25 void BUG_bad_PRIO_PROCESS(void); 26 void BUG_bad_PRIO_PGRP(void); 27 void BUG_bad_PRIO_USER(void); 40 28 41 static inline int int_add_no_wrap(int a, int b) 42 { 43 int s = a + b; 44 45 if (b < 0) { 46 if (s > a) s = INT_MIN; 47 } else { 48 if (s < a) s = INT_MAX; 49 } 50 51 return s; 52 } 53 29 int renice_main(int argc, char **argv); 54 30 int renice_main(int argc, char **argv) 55 31 { 56 static const char Xetpriority_msg[] = "%d :%cetpriority";32 static const char Xetpriority_msg[] ALIGN1 = "%cetpriority"; 57 33 58 34 int retval = EXIT_SUCCESS; … … 60 36 int use_relative = 0; 61 37 int adjustment, new_priority; 62 id_t who; 38 unsigned who; 39 char *arg; 63 40 64 ++argv; 41 /* Yes, they are not #defines in glibc 2.4! #if won't work */ 42 if (PRIO_PROCESS < CHAR_MIN || PRIO_PROCESS > CHAR_MAX) 43 BUG_bad_PRIO_PROCESS(); 44 if (PRIO_PGRP < CHAR_MIN || PRIO_PGRP > CHAR_MAX) 45 BUG_bad_PRIO_PGRP(); 46 if (PRIO_USER < CHAR_MIN || PRIO_USER > CHAR_MAX) 47 BUG_bad_PRIO_USER(); 48 49 arg = *++argv; 65 50 66 51 /* Check if we are using a relative adjustment. */ 67 if (arg v[0] && (argv[0][0] == '-') && (argv[0][1] == 'n') && !argv[0][2]) {52 if (arg && arg[0] == '-' && arg[1] == 'n') { 68 53 use_relative = 1; 69 ++argv; 54 if (!arg[2]) 55 arg = *++argv; 56 else 57 arg += 2; 70 58 } 71 59 72 if (! *argv) { /* No args? Then show usage. */60 if (!arg) { /* No args? Then show usage. */ 73 61 bb_show_usage(); 74 62 } 75 63 76 64 /* Get the priority adjustment (absolute or relative). */ 77 adjustment = bb_xgetlarg(*argv, 10, INT_MIN, INT_MAX);65 adjustment = xatoi_range(arg, INT_MIN/2, INT_MAX/2); 78 66 79 while ( *++argv) {67 while ((arg = *++argv) != NULL) { 80 68 /* Check for a mode switch. */ 81 if ((argv[0][0] == '-') && argv[0][1] && !argv[0][2]) { 82 static const char opts[] 83 = { 'p', 'g', 'u', 0, PRIO_PROCESS, PRIO_PGRP, PRIO_USER }; 84 const char *p; 85 if ((p = strchr(opts, argv[0][1]))) { 69 if (arg[0] == '-' && arg[1]) { 70 static const char opts[] ALIGN1 = { 71 'p', 'g', 'u', 0, PRIO_PROCESS, PRIO_PGRP, PRIO_USER 72 }; 73 const char *p = strchr(opts, arg[1]); 74 if (p) { 86 75 which = p[4]; 87 continue; 76 if (!arg[2]) 77 continue; 78 arg += 2; 88 79 } 89 80 } … … 92 83 if (which == PRIO_USER) { 93 84 struct passwd *p; 94 if (!(p = getpwnam(*argv))) { 95 bb_error_msg("unknown user: %s", *argv); 85 p = getpwnam(arg); 86 if (!p) { 87 bb_error_msg("unknown user: %s", arg); 96 88 goto HAD_ERROR; 97 89 } 98 90 who = p->pw_uid; 99 91 } else { 100 char *e; 101 errno = 0; 102 who = strtoul(*argv, &e, 10); 103 if (*e || (*argv == e) || errno) { 104 bb_error_msg("bad value: %s", *argv); 92 who = bb_strtou(arg, NULL, 10); 93 if (errno) { 94 bb_error_msg("bad value: %s", arg); 105 95 goto HAD_ERROR; 106 96 } … … 114 104 old_priority = getpriority(which, who); 115 105 if (errno) { 116 bb_perror_msg(Xetpriority_msg, who,'g');106 bb_perror_msg(Xetpriority_msg, 'g'); 117 107 goto HAD_ERROR; 118 108 } 119 109 120 new_priority = int_add_no_wrap(old_priority, adjustment);110 new_priority = old_priority + adjustment; 121 111 } else { 122 112 new_priority = adjustment; … … 127 117 } 128 118 129 bb_perror_msg(Xetpriority_msg, who,'s');130 119 bb_perror_msg(Xetpriority_msg, 's'); 120 HAD_ERROR: 131 121 retval = EXIT_FAILURE; 132 122 }
Note:
See TracChangeset
for help on using the changeset viewer.