Upload Tizen:Base source
[framework/base/util-linux-ng.git] / sys-utils / renice.c
1 /*
2  * Copyright (c) 1983, 1989, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33
34  /* 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL>
35   * - added Native Language Support
36   */
37
38 #include <sys/types.h>
39 #include <sys/time.h>
40 #include <sys/resource.h>
41
42 #include <stdio.h>
43 #include <pwd.h>
44 #include <stdlib.h>
45 #include <string.h>
46 #include <errno.h>
47 #include "nls.h"
48
49 int donice(int,int,int);
50
51 void usage(int rc)
52 {
53         printf( _("\nUsage:\n"
54                 " renice [-n] priority [-p|--pid] pid  [... pid]\n"
55                 " renice [-n] priority  -g|--pgrp pgrp [... pgrp]\n"
56                 " renice [-n] priority  -u|--user user [... user]\n"
57                 " renice -h | --help\n"
58                 " renice -v | --version\n\n"));
59
60         exit(rc);
61 }
62
63 /*
64  * Change the priority (nice) of processes
65  * or groups of processes which are already
66  * running.
67  */
68 int
69 main(int argc, char **argv)
70 {
71         int which = PRIO_PROCESS;
72         int who = 0, prio, errs = 0;
73         char *endptr = NULL;
74
75         setlocale(LC_ALL, "");
76         bindtextdomain(PACKAGE, LOCALEDIR);
77         textdomain(PACKAGE);
78
79         argc--;
80         argv++;
81
82         if (argc == 1) {
83                 if (strcmp(*argv, "-h") == 0 ||
84                     strcmp(*argv, "--help") == 0)
85                         usage(EXIT_SUCCESS);
86
87                 if (strcmp(*argv, "-v") == 0 ||
88                     strcmp(*argv, "--version") == 0) {
89                         printf(_("renice from %s\n"), PACKAGE_STRING);
90                         exit(EXIT_SUCCESS);
91                 }
92         }
93
94         if (argc < 2)
95                 usage(EXIT_FAILURE);
96
97         if (strcmp(*argv, "-n") == 0 || strcmp(*argv, "--priority") == 0) {
98                 argc--;
99                 argv++;
100         }
101
102         prio = strtol(*argv, &endptr, 10);
103         if (*endptr)
104                 usage(EXIT_FAILURE);
105
106         argc--;
107         argv++;
108
109         for (; argc > 0; argc--, argv++) {
110                 if (strcmp(*argv, "-g") == 0 || strcmp(*argv, "--pgrp") == 0) {
111                         which = PRIO_PGRP;
112                         continue;
113                 }
114                 if (strcmp(*argv, "-u") == 0 || strcmp(*argv, "--user") == 0) {
115                         which = PRIO_USER;
116                         continue;
117                 }
118                 if (strcmp(*argv, "-p") == 0 || strcmp(*argv, "--pid") == 0) {
119                         which = PRIO_PROCESS;
120                         continue;
121                 }
122                 if (which == PRIO_USER) {
123                         register struct passwd *pwd = getpwnam(*argv);
124
125                         if (pwd == NULL) {
126                                 fprintf(stderr, _("renice: %s: unknown user\n"),
127                                         *argv);
128                                 continue;
129                         }
130                         who = pwd->pw_uid;
131                 } else {
132                         who = strtol(*argv, &endptr, 10);
133                         if (who < 0 || *endptr) {
134                                 fprintf(stderr, _("renice: %s: bad value\n"),
135                                         *argv);
136                                 continue;
137                         }
138                 }
139                 errs += donice(which, who, prio);
140         }
141         return errs != 0 ? EXIT_FAILURE : EXIT_SUCCESS;
142 }
143
144 int
145 donice(int which, int who, int prio) {
146         int oldprio, newprio;
147
148         errno = 0;
149         oldprio = getpriority(which, who);
150         if (oldprio == -1 && errno) {
151                 fprintf(stderr, "renice: %d: ", who);
152                 perror(_("getpriority"));
153                 return 1;
154         }
155         if (setpriority(which, who, prio) < 0) {
156                 fprintf(stderr, "renice: %d: ", who);
157                 perror(_("setpriority"));
158                 return 1;
159         }
160         errno = 0;
161         newprio = getpriority(which, who);
162         if (newprio == -1 && errno) {
163                 fprintf(stderr, "renice: %d: ", who);
164                 perror(_("getpriority"));
165                 return 1;
166         }
167
168         printf(_("%d: old priority %d, new priority %d\n"),
169                who, oldprio, newprio);
170         return 0;
171 }