[go: up one dir, main page]

File: dump-utmp.c

package info (click to toggle)
acct 6.3.5-17
  • links: PTS
  • area: main
  • in suites: potato
  • size: 812 kB
  • ctags: 563
  • sloc: ansic: 5,690; sh: 556; cpp: 287; makefile: 175; perl: 18
file content (126 lines) | stat: -rw-r--r-- 2,242 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/* dump-utmp.c
 *
 * print a utmp file in human-readable format. */

#include "config.h"

#include <stdio.h>

#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif

#include "common.h"
#include "utmp_rd.h"
#include "getopt.h"


char *program_name;
int debugging_enabled = 0;	/* no -- we don't care about bad
				   records or the file-reading
				   algorithms. */

void main PARAMS((int argc, char *argv[]));

static
void
give_usage (void)
{
  printf ("Usage: %s [-hrR] [-n <recs>] <files>\n\
       [--num <recs>] [--raw] [--reverse] [--help]\n",
	  program_name);
  print_wtmp_file_location ();
}


void
main (int argc, char *argv[])
{
  int c;
  int backwards_flag = 0;	/* nonzero means read from the end */
  long num_lines_to_print = -1;	/* -1 means all */
  int raw = 0;

  program_name = argv[0];

  while (1)
    {
      int option_index = 0;
      
      static struct option long_options[] = {
	{ "reverse", no_argument, NULL, 1 },
	{ "help", no_argument, NULL, 2 },
	{ "num", required_argument, NULL, 3 },
	{ "raw", no_argument, NULL, 4 },
	{ 0, 0, 0, 0 },
      };

      c = getopt_long (argc, argv, "rhn:R", long_options, &option_index);

      if (c == EOF)
	break;

      switch (c)
	{
	case 'r':
	case 1:
	  backwards_flag = 1;
	  break;
	case 'h':
	case 2:
	  give_usage ();
	  exit (1);
	  break;
	case 'n':
	case 3:
	  num_lines_to_print = atol (optarg);
	  if (num_lines_to_print < 1)
	    fatal ("number of lines to print must be positive and non-zero");
	  break;
	case 'R':
	case 4:
	  raw = 1;
	  break;
	}
    }

  if (optind >= argc)
    {
      /* User didn't pass any filenames -- give them the usage
         message. */
      give_usage ();
      exit (1);
    }
  
  /* Init the file reader */

  utmp_init (backwards_flag);

  /* Add all files that we want to dump. */

  while (optind < argc)
    add_utmp_file (argv[optind++]);

  /* Dump the records. */

  {
    struct utmp *rec;
    while ((rec = utmp_get_entry ()) != NULL)
      {
	if (raw)
	  fwrite (rec, sizeof (struct utmp), 1, stdout);
	else
	  print_utmp_record (rec, stdout);

	if (num_lines_to_print > -1)
	  {
	    num_lines_to_print--;
	    if (num_lines_to_print == 0)    /* max lines printed */
	      exit (0);
	  }
      }
  }

  exit (0);
}