8322 nl: misleading-indentation
[unleashed/tickless.git] / usr / src / cmd / wracct / wracct.c
blob0715ccf86afb5aecf3a8f98b591a54cf34ef6f76
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
20 * CDDL HEADER END
23 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 #pragma ident "%Z%%M% %I% %E% SMI"
30 * wracct - write system accounting records
33 #include <sys/types.h>
34 #include <sys/procset.h>
35 #include <exacct.h>
36 #include <stdio.h>
37 #include <stdlib.h>
38 #include <libintl.h>
39 #include <strings.h>
40 #include <errno.h>
42 #define CMDNAME "wracct"
43 #define USAGE \
44 gettext("Usage: wracct -i id_list [-t partial | interval ] " \
45 "{process | task}\n")
46 #define OPTIONS_STRING "i:t:"
48 static void
49 usage(void)
51 (void) fprintf(stderr, USAGE);
52 exit(2);
55 static long
56 Atol(char *p)
58 long l;
59 char *q;
60 errno = 0;
61 l = strtol(p, &q, 10);
62 if (errno != 0 || q == p || l < 0 || *q != '\0') {
63 (void) fprintf(stderr, gettext("%s: illegal argument -- %s\n"),
64 CMDNAME, p);
65 exit(2);
66 /*NOTREACHED*/
67 } else {
68 return (l);
72 int
73 main(int argc, char *argv[])
75 idtype_t ent_flag = -1;
76 int rec_flag = EW_PARTIAL;
77 id_t id = -1;
78 char *id_sequence = NULL;
79 char *idlp = NULL;
80 int c, r;
82 while ((c = getopt(argc, argv, OPTIONS_STRING)) != EOF) {
83 switch (c) {
84 case 't':
85 if (strcmp(optarg, "partial") == 0) {
86 rec_flag = EW_PARTIAL;
87 } else if (strcmp(optarg, "interval") == 0) {
88 rec_flag = EW_INTERVAL;
89 } else {
90 (void) fprintf(stderr,
91 gettext("%s: wrong record type\n"),
92 CMDNAME);
93 usage();
95 break;
96 case 'i':
97 id_sequence = strdup(optarg);
98 break;
99 case '?':
100 default:
101 usage();
102 break;
106 if (optind >= argc) {
107 usage();
110 if (strcmp(argv[optind], "task") == 0) {
111 ent_flag = P_TASKID;
112 } else if (strcmp(argv[optind], "process") == 0 ||
113 strcmp(argv[optind], "proc") == 0) {
114 ent_flag = P_PID;
115 } else {
116 usage();
119 if (ent_flag == P_PID && rec_flag == EW_INTERVAL) {
120 (void) fprintf(stderr,
121 gettext("%s: interval process records not supported\n"),
122 CMDNAME);
123 exit(2);
126 if (id_sequence == NULL) {
127 (void) fprintf(stderr,
128 gettext("%s: please use -i option to specify ids\n"),
129 CMDNAME);
130 exit(2);
133 for (idlp = strtok(id_sequence, ", \t\n"); idlp != NULL;
134 idlp = strtok(NULL, ", \t\n")) {
135 id = Atol(idlp);
136 if (wracct(ent_flag, id, rec_flag) < 0) {
137 r = errno;
138 (void) fprintf(stderr,
139 "%s: operation failed on %s %d: %s\n",
140 CMDNAME, (ent_flag == P_TASKID) ? "taskid" : "pid",
141 (int)id, strerror(r));
142 exit(1);
146 return (0);