Mercurial > hg > octave-lojdl > gnulib-hg
annotate lib/readutmp.c @ 2942:c5e4ce044bd7
fix typo: s/fseek0/fseeko/
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Sun, 29 Oct 2000 17:19:51 +0000 |
parents | 41c51e2e9170 |
children | 72422d1e9181 |
rev | line source |
---|---|
981 | 1 /* GNU's read utmp module. |
2227
509768b4e550
(extract_trimmed_name): Use UT_USER instead of hard-coding
Jim Meyering <jim@meyering.net>
parents:
1830
diff
changeset
|
2 Copyright (C) 1992-2000 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 | |
2402
41c51e2e9170
Include sys/types.h before sys/stat.h.
Jim Meyering <jim@meyering.net>
parents:
2246
diff
changeset
|
24 #include <sys/types.h> |
981 | 25 #include <sys/stat.h> |
26 #if defined(STDC_HEADERS) || defined(HAVE_STRING_H) | |
27 # include <string.h> | |
28 #else | |
29 # include <strings.h> | |
30 #endif /* STDC_HEADERS || HAVE_STRING_H */ | |
31 | |
32 #include "readutmp.h" | |
33 | |
34 char *xmalloc (); | |
1718
db73263fa4b3
(read_utmp) [HAVE_UTMPNAME]: Rewrite.
Jim Meyering <jim@meyering.net>
parents:
1710
diff
changeset
|
35 char *realloc (); |
981 | 36 |
37 /* Copy UT->ut_name into storage obtained from malloc. Then remove any | |
38 trailing spaces from the copy, NUL terminate it, and return the copy. */ | |
39 | |
40 char * | |
1362
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
41 extract_trimmed_name (const STRUCT_UTMP *ut) |
981 | 42 { |
43 char *p, *trimmed_name; | |
44 | |
2227
509768b4e550
(extract_trimmed_name): Use UT_USER instead of hard-coding
Jim Meyering <jim@meyering.net>
parents:
1830
diff
changeset
|
45 trimmed_name = xmalloc (sizeof (UT_USER (ut)) + 1); |
509768b4e550
(extract_trimmed_name): Use UT_USER instead of hard-coding
Jim Meyering <jim@meyering.net>
parents:
1830
diff
changeset
|
46 strncpy (trimmed_name, UT_USER (ut), sizeof (UT_USER (ut))); |
981 | 47 /* Append a trailing space character. Some systems pad names shorter than |
48 the maximum with spaces, others pad with NULs. Remove any spaces. */ | |
2227
509768b4e550
(extract_trimmed_name): Use UT_USER instead of hard-coding
Jim Meyering <jim@meyering.net>
parents:
1830
diff
changeset
|
49 trimmed_name[sizeof (UT_USER (ut))] = ' '; |
981 | 50 p = strchr (trimmed_name, ' '); |
51 if (p != NULL) | |
52 *p = '\0'; | |
53 return trimmed_name; | |
54 } | |
55 | |
1718
db73263fa4b3
(read_utmp) [HAVE_UTMPNAME]: Rewrite.
Jim Meyering <jim@meyering.net>
parents:
1710
diff
changeset
|
56 /* Read the utmp entries corresponding to file FILENAME into freshly- |
db73263fa4b3
(read_utmp) [HAVE_UTMPNAME]: Rewrite.
Jim Meyering <jim@meyering.net>
parents:
1710
diff
changeset
|
57 malloc'd storage, set *UTMP_BUF to that pointer, set *N_ENTRIES to |
db73263fa4b3
(read_utmp) [HAVE_UTMPNAME]: Rewrite.
Jim Meyering <jim@meyering.net>
parents:
1710
diff
changeset
|
58 the number of entries, and return zero. If there is any error, |
982
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
59 return non-zero and don't modify the parameters. */ |
981 | 60 |
2246
7805669f5f18
(read_utmp): Guard with `#ifdef UTMP_NAME_FUNCTION',
Jim Meyering <jim@meyering.net>
parents:
2227
diff
changeset
|
61 #ifdef UTMP_NAME_FUNCTION |
1362
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
62 |
981 | 63 int |
1362
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
64 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
|
65 { |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
66 int n_read; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
67 STRUCT_UTMP *u; |
1718
db73263fa4b3
(read_utmp) [HAVE_UTMPNAME]: Rewrite.
Jim Meyering <jim@meyering.net>
parents:
1710
diff
changeset
|
68 STRUCT_UTMP *utmp = NULL; |
1362
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
69 |
1823
93ecfb08bb9c
(read_utmp): Ignore the return value from utmpname.
Jim Meyering <jim@meyering.net>
parents:
1718
diff
changeset
|
70 /* Ignore the return value for now. |
93ecfb08bb9c
(read_utmp): Ignore the return value from utmpname.
Jim Meyering <jim@meyering.net>
parents:
1718
diff
changeset
|
71 Solaris' utmpname returns 1 upon success -- which is contrary |
93ecfb08bb9c
(read_utmp): Ignore the return value from utmpname.
Jim Meyering <jim@meyering.net>
parents:
1718
diff
changeset
|
72 to what the GNU libc version does. In addition, older GNU libc |
93ecfb08bb9c
(read_utmp): Ignore the return value from utmpname.
Jim Meyering <jim@meyering.net>
parents:
1718
diff
changeset
|
73 versions are actually void. */ |
1830
8139ee8d995b
(read_utmp): Use the new definitions.
Jim Meyering <jim@meyering.net>
parents:
1823
diff
changeset
|
74 UTMP_NAME_FUNCTION (filename); |
1362
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
75 |
1830
8139ee8d995b
(read_utmp): Use the new definitions.
Jim Meyering <jim@meyering.net>
parents:
1823
diff
changeset
|
76 SET_UTMP_ENT (); |
1362
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
77 |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
78 n_read = 0; |
1830
8139ee8d995b
(read_utmp): Use the new definitions.
Jim Meyering <jim@meyering.net>
parents:
1823
diff
changeset
|
79 while ((u = GET_UTMP_ENT ()) != NULL) |
1362
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
80 { |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
81 ++n_read; |
1718
db73263fa4b3
(read_utmp) [HAVE_UTMPNAME]: Rewrite.
Jim Meyering <jim@meyering.net>
parents:
1710
diff
changeset
|
82 utmp = (STRUCT_UTMP *) realloc (utmp, n_read * sizeof (STRUCT_UTMP)); |
db73263fa4b3
(read_utmp) [HAVE_UTMPNAME]: Rewrite.
Jim Meyering <jim@meyering.net>
parents:
1710
diff
changeset
|
83 if (utmp == NULL) |
db73263fa4b3
(read_utmp) [HAVE_UTMPNAME]: Rewrite.
Jim Meyering <jim@meyering.net>
parents:
1710
diff
changeset
|
84 return 1; |
db73263fa4b3
(read_utmp) [HAVE_UTMPNAME]: Rewrite.
Jim Meyering <jim@meyering.net>
parents:
1710
diff
changeset
|
85 utmp[n_read - 1] = *u; |
1362
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 |
1830
8139ee8d995b
(read_utmp): Use the new definitions.
Jim Meyering <jim@meyering.net>
parents:
1823
diff
changeset
|
88 END_UTMP_ENT (); |
1362
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
89 |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
90 *n_entries = n_read; |
1718
db73263fa4b3
(read_utmp) [HAVE_UTMPNAME]: Rewrite.
Jim Meyering <jim@meyering.net>
parents:
1710
diff
changeset
|
91 *utmp_buf = utmp; |
1362
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
92 |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
93 return 0; |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
94 } |
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 #else |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
97 |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
98 int |
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
99 read_utmp (const char *filename, int *n_entries, STRUCT_UTMP **utmp_buf) |
981 | 100 { |
101 FILE *utmp; | |
102 struct stat file_stats; | |
103 size_t n_read; | |
104 size_t size; | |
982
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
105 STRUCT_UTMP *buf; |
981 | 106 |
107 utmp = fopen (filename, "r"); | |
108 if (utmp == NULL) | |
982
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
109 return 1; |
981 | 110 |
111 fstat (fileno (utmp), &file_stats); | |
112 size = file_stats.st_size; | |
113 if (size > 0) | |
982
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
114 buf = (STRUCT_UTMP *) xmalloc (size); |
981 | 115 else |
116 { | |
117 fclose (utmp); | |
982
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
118 return 1; |
981 | 119 } |
120 | |
121 /* 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
|
122 n_read = fread (buf, 1, size, utmp); |
981 | 123 if (ferror (utmp) || fclose (utmp) == EOF |
124 || n_read < size) | |
982
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
125 return 1; |
981 | 126 |
982
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
127 *n_entries = size / sizeof (STRUCT_UTMP); |
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
128 *utmp_buf = buf; |
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
129 |
ea65b688ec7b
(read_utmp): Take new params: count and buffer.
Jim Meyering <jim@meyering.net>
parents:
981
diff
changeset
|
130 return 0; |
981 | 131 } |
1362
e5c4dcf21602
(read_utmp): Add variant for systems that have the utmpname function.
Jim Meyering <jim@meyering.net>
parents:
984
diff
changeset
|
132 |
2402
41c51e2e9170
Include sys/types.h before sys/stat.h.
Jim Meyering <jim@meyering.net>
parents:
2246
diff
changeset
|
133 #endif |