rtprio.c revision 50479
1/*
2 * Copyright (c) 1994 David Greenman
3 * Copyright (c) 1994 Henrik Vestergaard Draboel (hvd@terry.ping.dk)
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 * 3. All advertising materials mentioning features or use of this software
15 *    must display the following acknowledgement:
16 *	This product includes software developed by Henrik Vestergaard Draboel.
17 *	This product includes software developed by David Greenman.
18 * 4. Neither the names of the authors nor the names of contributors
19 *    may be used to endorse or promote products derived from this software
20 *    without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 */
34
35#ifndef lint
36static const char rcsid[] =
37  "$FreeBSD: head/usr.sbin/rtprio/rtprio.c 50479 1999-08-28 01:35:59Z peter $";
38#endif /* not lint */
39
40#include <sys/param.h>
41#include <sys/rtprio.h>
42#include <sys/errno.h>
43
44#include <ctype.h>
45#include <err.h>
46#include <stdio.h>
47#include <stdlib.h>
48#include <string.h>
49#include <unistd.h>
50
51static void usage();
52
53int
54main(argc, argv)
55	int     argc;
56	char  **argv;
57{
58	char   *p;
59	int     proc = 0;
60	struct rtprio rtp;
61
62	/* find basename */
63	if ((p = rindex(argv[0], '/')) == NULL)
64		p = argv[0];
65	else
66		++p;
67
68	if (!strcmp(p, "rtprio"))
69		rtp.type = RTP_PRIO_REALTIME;
70	else if (!strcmp(p, "idprio"))
71		rtp.type = RTP_PRIO_IDLE;
72
73	switch (argc) {
74	case 2:
75		proc = abs(atoi(argv[1]));	/* Should check if numeric
76						 * arg! */
77		/* FALLTHROUGH */
78	case 1:
79		if (rtprio(RTP_LOOKUP, proc, &rtp) != 0)
80			err(1, "%s", argv[0]);
81		printf("%s: ", p);
82		switch (rtp.type) {
83		case RTP_PRIO_REALTIME:
84		case RTP_PRIO_FIFO:
85			printf("realtime priority %d\n", rtp.prio);
86			break;
87		case RTP_PRIO_NORMAL:
88			printf("normal priority\n");
89			break;
90		case RTP_PRIO_IDLE:
91			printf("idle priority %d\n", rtp.prio);
92			break;
93		default:
94			printf("invalid priority type %d\n", rtp.type);
95			break;
96		}
97		exit(0);
98	default:
99		if (argv[1][0] == '-' || isdigit(argv[1][0])) {
100			if (argv[1][0] == '-') {
101				if (strcmp(argv[1], "-t") == 0) {
102					rtp.type = RTP_PRIO_NORMAL;
103					rtp.prio = 0;
104				} else {
105					usage();
106					break;
107				}
108			} else {
109				rtp.prio = atoi(argv[1]);
110			}
111		} else {
112			usage();
113			break;
114		}
115
116		if (argv[2][0] == '-')
117			proc = -atoi(argv[2]);
118
119		if (rtprio(RTP_SET, proc, &rtp) != 0)
120			err(1, "%s", argv[0]);
121
122		if (proc == 0) {
123			execvp(argv[2], &argv[2]);
124			err(1, "%s", argv[2]);
125		}
126	}
127	exit (1);
128}
129
130static void
131usage()
132{
133	(void) fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n",
134		"usage: [id|rt]prio",
135		"       [id|rt]prio [-]pid",
136		"       [id|rt]prio priority command [args]",
137		"       [id|rt]prio priority -pid",
138		"       [id|rt]prio -t command [args]",
139		"       [id|rt]prio -t -pid");
140	exit(1);
141}
142