~chrisccoulson/dpkg/ssd-ionice

« back to all changes in this revision

Viewing changes to utils/start-stop-daemon.c

  • Committer: chrisccoulson at googlemail
  • Date: 2009-01-13 17:39:50 UTC
  • Revision ID: chrisccoulson@googlemail.com-20090113173950-4r22ui46hz7euyc6
Initial support for setting IO scheduler class in start-stop-daemon

Show diffs side-by-side

added added

removed removed

Lines of Context:
103
103
#include <error.h>
104
104
#endif
105
105
 
 
106
#include <sys/syscall.h>
 
107
 
106
108
static int testmode = 0;
107
109
static int quietmode = 0;
108
110
static int exitnodo = 1;
126
128
static char what_stop[1024];
127
129
static const char *progname = "";
128
130
static int nicelevel = 0;
 
131
static int ioprio = 0;
129
132
static int umask_value = -1;
130
133
 
 
134
enum {
 
135
        IOPRIO_WHO_PROCESS = 1,
 
136
        IOPRIO_WHO_PGRP,
 
137
        IOPRIO_WHO_USER,
 
138
};
 
139
 
131
140
static struct stat exec_stat;
132
141
#if defined(OSHURD)
133
142
static struct proc_stat_list *procset = NULL;
168
177
#if defined(OSLinux) || defined(OShpux)
169
178
static int pid_is_exec(pid_t pid, const struct stat *esb);
170
179
#endif
 
180
static inline int ioprio_set(int which, int who, int ioprio);
171
181
 
172
182
 
173
183
static void fatal(const char *format, ...)
308
318
"  -r|--chroot <directory>       chroot to <directory> before starting\n"
309
319
"  -d|--chdir <directory>        change to <directory> (default is /)\n"
310
320
"  -N|--nicelevel <incr>         add incr to the process's nice level\n"
 
321
"  -I|--ioprio <ioprio>          Set the process's IO priority\n"
311
322
"  -k|--umask <mask>             change the umask to <mask> before starting\n"
312
323
"  -b|--background               force the process to detach\n"
313
324
"  -m|--make-pidfile             create the pidfile before starting\n"
534
545
 
535
546
        for (;;) {
536
547
                c = getopt_long(argc, argv,
537
 
                                "HKSVa:n:op:qr:s:tu:vx:c:N:k:bmR:g:d:",
 
548
                                "HKSVa:n:op:qr:s:tu:vx:c:N:I:k:bmR:g:d:",
538
549
                                longopts, NULL);
539
550
                if (c == -1)
540
551
                        break;
597
608
                case 'N':  /* --nice */
598
609
                        nicelevel = atoi(optarg);
599
610
                        break;
 
611
                case 'I':
 
612
                        ioprio = atoi(optarg);
 
613
                        break;
600
614
                case 'k':  /* --umask <mask> */
601
615
                        umask_str = optarg;
602
616
                        break;
1221
1235
        }
1222
1236
}
1223
1237
 
 
1238
static inline int
 
1239
ioprio_set (int which, int who, int ioprio)
 
1240
{
 
1241
        return syscall(SYS_ioprio_set, which, who, ioprio);
 
1242
}
 
1243
 
1224
1244
int
1225
1245
main(int argc, char **argv)
1226
1246
{
1334
1354
                        fatal("Unable to alter nice level by %i: %s",
1335
1355
                              nicelevel, strerror(errno));
1336
1356
        }
 
1357
        if (ioprio) {
 
1358
                errno = 0;
 
1359
                if ((ioprio_set(IOPRIO_WHO_PROCESS, getpid(), ioprio << 13) == -1) && (errno != 0))
 
1360
                        fatal("Unable to alter IO priority to %i: %s",
 
1361
                                  ioprio, strerror(errno));
 
1362
        }
1337
1363
        if (umask_value >= 0)
1338
1364
                umask(umask_value);
1339
1365
        if (mpidfile && pidfile != NULL) {