1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
/**/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <pwd.h>
#include <sys/resource.h>
int main(int argc,char **argv) {
long l;
int mrenice,wrenice,newprio,eflag;
uid_t ruid;
char *ep;
struct passwd *pw;
mrenice=0;
if (argc < 3) {
fputs("usernice: too few args\n"
" usage: usernice <nicelevel> <command> <arguments>\n"
" usernice <nicelevel>p <pid> <pid> ...\n"
" usernice <nicelevel>u <username|uid> ...\n",
stderr);
exit(-1);
}
l= strtol(*++argv,&ep,10);
if (*ep == 'p' || *ep == 'u') { mrenice= *ep++; }
if (*ep) { fputs("usernice: priority not numeric or bad flags\n",stderr); exit(-1); }
if (l<-20 || l>20)
{ fputs("usernice: priority must be -20 .. 20\n",stderr); exit(-1); }
newprio= l;
if (mrenice) {
eflag=0;
while (*++argv) {
if (mrenice == 'p') {
wrenice= PRIO_PROCESS;
l= strtoul(*argv,&ep,10);
if (*ep) {
fprintf(stderr,"usernice: pid `%s' not numeric\n",*argv); eflag=2;
continue;
}
} else {
wrenice= PRIO_USER;
l= strtoul(*argv,&ep,10);
if (*ep) {
pw= getpwnam(*argv);
if (!pw) {
fprintf(stderr,"usernice: unknown user `%s'\n",*argv); eflag=2;
continue;
}
l= pw->pw_uid;
}
}
if (setpriority(wrenice,l,newprio)) {
perror(*argv); if (!eflag) eflag=1;
}
}
exit(eflag);
} else {
if (setpriority(PRIO_PROCESS,0,newprio))
{ perror("usernice: setpriority"); exit(-1); }
ruid= getuid(); if (ruid == (uid_t)-1) { perror("usernice: getuid"); exit(-1); }
if (setreuid(ruid,ruid)) { perror("usernice: setreuid"); exit(-1); }
execvp(argv[1],argv+1); perror("usernice: exec"); exit(-1);
}
}
|