1 /*
2 * CDDL HEADER START
3 *
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.
8 *
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.
13 *
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]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
27 /* All Rights Reserved */
28
29 #pragma ident "%Z%%M% %I% %E% SMI"
30
31 #include <stdio.h>
32 #include <sys/types.h>
33 #include <sys/param.h>
34 #include "acctdef.h"
35 #include <utmpx.h>
36 #include <locale.h>
37 #include <stdlib.h>
38
39 struct utmpx Ut;
40 static char time_buf[50];
41
42 static int inp(FILE *, struct utmpx *);
43
44 int
main(int c,char ** v)45 main(int c, char **v)
46 {
47
48 int iflg, cflg;
49
50 (void) setlocale(LC_ALL, "");
51
52 iflg = cflg = 0;
53
54 while (--c > 0) {
55 if (**++v == '-')
56 while (*++*v)
57 switch (**v) {
58 case 'c':
59 cflg++;
60 continue;
61 case 'i':
62 iflg++;
63 continue;
64 }
65 }
66
67 for (;;) {
68 if (iflg) {
69 if (inp(stdin, &Ut) == EOF)
70 break;
71 } else {
72 if (fread(&Ut, sizeof (Ut), 1, stdin) != 1)
73 break;
74 }
75 if (cflg)
76 fwrite(&Ut, sizeof (Ut), 1, stdout);
77 else {
78 cftime(time_buf, DATE_FMT, &Ut.ut_xtime);
79 printf("%-*.*s %-4.4s %-*.*s %9d %2hd "
80 "%4.4ho %4.4ho %ld %ld %d %hd %-.*s %s",
81 NSZ,
82 NSZ,
83 Ut.ut_name,
84 Ut.ut_id,
85 LINESZ,
86 LINESZ,
87 Ut.ut_line,
88 Ut.ut_pid,
89 Ut.ut_type,
90 Ut.ut_exit.e_termination,
91 Ut.ut_exit.e_exit,
92 Ut.ut_xtime,
93 Ut.ut_tv.tv_usec,
94 Ut.ut_session,
95 Ut.ut_syslen,
96 Ut.ut_syslen,
97 Ut.ut_host,
98 time_buf);
99 }
100 }
101 exit(0);
102 }
103
104 static int
inp(FILE * file,struct utmpx * u)105 inp(FILE *file, struct utmpx *u)
106 {
107
108 char buf[BUFSIZ];
109 char *p;
110 int i;
111
112 if (fgets((p = buf), BUFSIZ, file) == NULL)
113 return (EOF);
114
115 for (i = 0; i < NSZ; i++) /* Allow a space in name field */
116 u->ut_name[i] = *p++;
117 for (i = NSZ-1; i >= 0; i--) {
118 if (u->ut_name[i] == ' ')
119 u->ut_name[i] = '\0';
120 else
121 break;
122 }
123 p++;
124
125 for (i = 0; i < 4; i++)
126 if ((u->ut_id[i] = *p++) == ' ')
127 u->ut_id[i] = '\0';
128 p++;
129
130 for (i = 0; i < LINESZ; i++) /* Allow a space in line field */
131 u->ut_line[i] = *p++;
132 for (i = LINESZ-1; i >= 0; i--) {
133 if (u->ut_line[i] == ' ')
134 u->ut_line[i] = '\0';
135 else
136 break;
137 }
138
139 sscanf(p, "%d %hd %ho %ho %ld %ld %d %hd",
140 &u->ut_pid,
141 &u->ut_type,
142 &u->ut_exit.e_termination,
143 &u->ut_exit.e_exit,
144 &u->ut_xtime,
145 &u->ut_tv.tv_usec,
146 &u->ut_session,
147 &u->ut_syslen);
148
149 if (u->ut_syslen > 1)
150 sscanf(p, "%*d %*hd %*ho %*ho %*ld %*ld %*d %*hd %s",
151 u->ut_host);
152 else
153 u->ut_host[0] = '\0';
154
155 return (1);
156 }
157