Mercurial > hg > octave-kai > gnulib-hg
annotate lib/readutmp.c @ 1710:a6e95d15d8fb
Include stdio.h.
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Mon, 08 Feb 1999 03:32:06 +0000 |
parents | 57f00294f807 |
children | db73263fa4b3 |
rev | line source |
---|---|
981 | 1 /* GNU's read utmp module. |
1709 | 2 Copyright (C) 1992-1999 Free Software Foundation, Inc. |
981 | 3 |
4 This program is free software; you can redistribute it and/or modify | |
5 it under the terms of the GNU General Public License as published by | |
6 the Free Software Foundation; either version 2, or (at your option) | |
7 any later version. | |
8 | |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
14 You should have received a copy of the GNU General Public License | |
15 along with this program; if not, write to the Free Software Foundation, | |
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
17 | |
18 /* Written by jla; revised by djm */ | |
19 | |
20 #include <config.h> | |
21 | |
1710 | 22 #include <stdio.h> |
23 | |
981 | 24 #include <sys/stat.h> |
25 #if defined(STDC_HEADERS) || defined(HAVE_STRING_H) | |
26 # include <string.h> | |
27 #else | |
28 # include <strings.h> | |
29 #endif /* STDC_HEADERS || HAVE_STRING_H */ | |
30 | |
31 #include "readutmp.h" | |
32 | |
33 char *xmalloc (); | |
34 | |
35 /* Copy UT->ut_name into storage obtained from malloc. Then remove any | |
36 trailing spaces from the copy, NUL terminate it, and return the copy. */ | |
37 | |
38 char * | |
1362
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
39 extract_trimmed_name (const STRUCT_UTMP *ut) |
981 | 40 { |
41 char *p, *trimmed_name; | |
42 | |
43 trimmed_name = xmalloc (sizeof (ut->ut_name) + 1); | |
44 strncpy (trimmed_name, ut->ut_name, sizeof (ut->ut_name)); | |
45 /* Append a trailing space character. Some systems pad names shorter than | |
46 the maximum with spaces, others pad with NULs. Remove any spaces. */ | |
47 trimmed_name[sizeof (ut->ut_name)] = ' '; | |
48 p = strchr (trimmed_name, ' '); | |
49 if (p != NULL) | |
50 *p = '\0'; | |
51 return trimmed_name; | |
52 } | |
53 | |
982
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
54 /* Read the utmp file FILENAME into *UTMP_BUF, set *N_ENTRIES to the |
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
55 number of entries read, and return zero. If there is any error, |
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
56 return non-zero and don't modify the parameters. */ |
981 | 57 |
1709 | 58 /* FIXME: use `#if HAVE_UTMPNAME' instead... */ |
59 #if 0 | |
1362
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
60 |
981 | 61 int |
1362
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
62 read_utmp (const char *filename, int *n_entries, STRUCT_UTMP **utmp_buf) |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
63 { |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
64 int count_utmp = 0; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
65 int n_read; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
66 STRUCT_UTMP *u; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
67 STRUCT_UTMP *uptr; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
68 STRUCT_UTMP *utmp_contents; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
69 |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
70 if (utmpname (filename)) |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
71 { |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
72 return 1; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
73 } |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
74 |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
75 /* FIXME: going through the list twice is wasteful. */ |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
76 |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
77 /* count the entries in utmp */ |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
78 setutent (); |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
79 while ((u = getutent ()) != NULL) |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
80 ++count_utmp; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
81 |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
82 if (count_utmp == 0) |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
83 return 0; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
84 |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
85 utmp_contents = (STRUCT_UTMP *) xmalloc (count_utmp * sizeof (STRUCT_UTMP)); |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
86 |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
87 /* read the entries in utmp */ |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
88 |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
89 /* FIXME: can this fail? */ |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
90 setutent (); |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
91 |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
92 n_read = 0; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
93 uptr = utmp_contents; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
94 while ((u = getutent ()) != NULL) |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
95 { |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
96 ++n_read; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
97 if (n_read > count_utmp) |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
98 { |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
99 STRUCT_UTMP *old_utmp_contents = utmp_contents; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
100 ++count_utmp; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
101 utmp_contents = (STRUCT_UTMP *) xrealloc (utmp_contents, |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
102 (count_utmp |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
103 * sizeof (STRUCT_UTMP))); |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
104 uptr = utmp_contents + (uptr - old_utmp_contents); |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
105 } |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
106 *uptr = *u; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
107 ++uptr; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
108 } |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
109 |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
110 if (n_read != count_utmp) |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
111 utmp_contents = (STRUCT_UTMP *) xrealloc (utmp_contents, |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
112 n_read * sizeof (STRUCT_UTMP)); |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
113 |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
114 /* FIXME: can this fail? */ |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
115 endutent (); |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
116 |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
117 *n_entries = n_read; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
118 *utmp_buf = utmp_contents; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
119 |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
120 return 0; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
121 } |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
122 |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
123 #else |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
124 |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
125 int |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
126 read_utmp (const char *filename, int *n_entries, STRUCT_UTMP **utmp_buf) |
981 | 127 { |
128 FILE *utmp; | |
129 struct stat file_stats; | |
130 size_t n_read; | |
131 size_t size; | |
982
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
132 STRUCT_UTMP *buf; |
981 | 133 |
134 utmp = fopen (filename, "r"); | |
135 if (utmp == NULL) | |
982
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
136 return 1; |
981 | 137 |
138 fstat (fileno (utmp), &file_stats); | |
139 size = file_stats.st_size; | |
140 if (size > 0) | |
982
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
141 buf = (STRUCT_UTMP *) xmalloc (size); |
981 | 142 else |
143 { | |
144 fclose (utmp); | |
982
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
145 return 1; |
981 | 146 } |
147 | |
148 /* Use < instead of != in case the utmp just grew. */ | |
982
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
149 n_read = fread (buf, 1, size, utmp); |
981 | 150 if (ferror (utmp) || fclose (utmp) == EOF |
151 || n_read < size) | |
982
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
152 return 1; |
981 | 153 |
982
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
154 *n_entries = size / sizeof (STRUCT_UTMP); |
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
155 *utmp_buf = buf; |
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
156 |
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
157 return 0; |
981 | 158 } |
1362
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
159 |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
160 #endif /* HAVE_UTMPNAME */ |