Home | History | Annotate | Download | only in acct
      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