diff options
author | Blake Jones <Blake.Jones@Sun.COM> | 2009-12-02 13:50:23 -0800 |
---|---|---|
committer | Blake Jones <Blake.Jones@Sun.COM> | 2009-12-02 13:50:23 -0800 |
commit | ac23bf836b7aa423b14eafd726f921e705676f80 (patch) | |
tree | 80bd6fdcb936bb733f988bfd4b3696372d3e8b78 /usr/src | |
parent | e64d0ff97a1fb57a6e93e6d31ea549511c90b318 (diff) | |
download | illumos-joyent-ac23bf836b7aa423b14eafd726f921e705676f80.tar.gz |
6905146 SDCpriocntl should be more graceful about doing nothing
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/cmd/priocntl/sdcpriocntl.c | 89 |
1 files changed, 76 insertions, 13 deletions
diff --git a/usr/src/cmd/priocntl/sdcpriocntl.c b/usr/src/cmd/priocntl/sdcpriocntl.c index 23a5ea1c1e..0f805177b1 100644 --- a/usr/src/cmd/priocntl/sdcpriocntl.c +++ b/usr/src/cmd/priocntl/sdcpriocntl.c @@ -27,47 +27,110 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <libgen.h> #include <sys/param.h> #include <sys/priocntl.h> #include <sys/types.h> #include "priocntl.h" -static char usage[] = "usage: priocntl -l\n"; +static char usage[] = +"usage: priocntl -l\n\ + priocntl -d [-i idtype] [idlist]\n"; +/* + * A whole lot of to-do for a scheduling class that can't actually be + * configured or used by user processes. + */ int main(int argc, char *argv[]) { - int lflag = 0; - int c; + int dflag, eflag, iflag, lflag, sflag; + int c; + char cmdpath[MAXPATHLEN]; + char basenm[BASENMSZ]; - while ((c = getopt(argc, argv, "lc:")) != -1) { - switch (c) { + (void) strlcpy(cmdpath, argv[0], MAXPATHLEN); + (void) strlcpy(basenm, basename(argv[0]), BASENMSZ); - case 'l': - lflag++; - break; + dflag = eflag = iflag = lflag = sflag = 0; + while ((c = getopt(argc, argv, "c:dei:ls")) != -1) { + switch (c) { case 'c': if (strcmp(optarg, "SDC") != 0) fatalerr("error: %s executed for %s class, " "%s is actually sub-command for %s class\n", - argv[0], optarg, argv[0], "SDC"); + cmdpath, optarg, cmdpath, "SDC"); + break; + + case 'd': + dflag++; + break; + + case 'e': + eflag++; + break; + + case 'i': + iflag++; /* optarg is parsed, but ignored */ + break; - fatalerr("error: no scheduling-class specific options" - " for SDC\n"); + case 'l': + lflag++; + break; + + case 's': + sflag++; break; case '?': fatalerr(usage); + /*NOTREACHED*/ + default: break; } } - if (!lflag) + if (sflag && eflag) { + fatalerr(usage); + } + if (sflag || eflag) { + fatalerr( + "priocntl: \"-%c\" may not be used with the %s class\n", + (sflag ? 's' : 'e'), "SDC"); + } + + if ((!dflag && !lflag) || (dflag && lflag)) { fatalerr(usage); + } + + if (dflag) { + pid_t *pidlist; + size_t numread, i; + + /* + * No scheduling-class-specific information to print, + * but we read the pidlist to avoid generating a SIGPIPE + * in the main priocntl process. Once we've read it, + * we might as well print it. + */ + if ((pidlist = read_pidlist(&numread, stdin)) == NULL) { + fatalerr("%s: Can't read pidlist.\n", basenm); + } else if (numread == 0) { + fatalerr("%s: No pids on input.\n", basenm); + } else { + (void) printf("SYSTEM DUTY-CYCLE PROCESSES:\n"); + (void) printf("%7s\n", "PID"); + for (i = 0; i < numread; i++) { + (void) printf("%7ld\n", pidlist[i]); + } + } + free_pidlist(pidlist); + } else { + (void) printf("SDC (System Duty-Cycle Class)\n"); + } - (void) printf("SDC\t(System Duty-Cycle Class)\n"); return (0); } |