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 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 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