]>
Commit | Line | Data |
---|---|---|
b8fe19fa RM |
1 | /* Copyright (C) 1996 Free Software Foundation, Inc. |
2 | This file is part of the GNU C Library. | |
3 | Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. | |
4 | ||
5 | The GNU C Library is free software; you can redistribute it and/or | |
6 | modify it under the terms of the GNU Library General Public License as | |
7 | published by the Free Software Foundation; either version 2 of the | |
8 | License, or (at your option) any later version. | |
9 | ||
10 | The GNU C Library is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | Library General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU Library General Public | |
16 | License along with the GNU C Library; see the file COPYING.LIB. If | |
17 | not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
18 | Boston, MA 02111-1307, USA. */ | |
19 | ||
20 | #include <errno.h> | |
0200214b | 21 | #include <string.h> |
b8fe19fa RM |
22 | #include <unistd.h> |
23 | #include <utmp.h> | |
24 | ||
25 | ||
26 | /* For implementing this function we don't use the getutent_r function | |
27 | because we can avoid the reposition on every new entry this way. */ | |
28 | int | |
23396375 UD |
29 | __getutline_r (const struct utmp *line, struct utmp **utmp, |
30 | struct utmp_data *utmp_data) | |
b8fe19fa RM |
31 | { |
32 | /* Open utmp file if not already done. */ | |
33 | if (utmp_data->ut_fd == -1) | |
34 | { | |
23396375 | 35 | __setutent_r (utmp_data); |
b8fe19fa RM |
36 | if (utmp_data->ut_fd == -1) |
37 | return -1; | |
38 | } | |
39 | ||
40 | /* Position file correctly. */ | |
41 | if (lseek (utmp_data->ut_fd, utmp_data->loc_utmp, SEEK_SET) == -1) | |
42 | return -1; | |
43 | ||
0200214b | 44 | while (1) |
b8fe19fa RM |
45 | { |
46 | /* Read the next entry. */ | |
47 | if (read (utmp_data->ut_fd, &utmp_data->ubuf, sizeof (struct utmp)) | |
48 | != sizeof (struct utmp)) | |
49 | { | |
eb6c8480 | 50 | utmp_data->loc_utmp = 0; /* Mark UTMP_DATA->ubuf invalid. */ |
c4029823 | 51 | __set_errno (ESRCH); |
b8fe19fa RM |
52 | return -1; |
53 | } | |
54 | ||
55 | /* Update position pointer. */ | |
56 | utmp_data->loc_utmp += sizeof (struct utmp); | |
0200214b | 57 | |
49b98627 | 58 | if ( |
0200214b | 59 | #if _HAVE_UT_TYPE - 0 |
49b98627 RM |
60 | (utmp_data->ubuf.ut_type == USER_PROCESS |
61 | || utmp_data->ubuf.ut_type == LOGIN_PROCESS) | |
62 | && | |
0200214b | 63 | #endif |
49b98627 RM |
64 | ! strncmp (line->ut_line, utmp_data->ubuf.ut_line, |
65 | sizeof line->ut_line)) | |
66 | /* Stop if we found a user or login entry. */ | |
67 | break; | |
b8fe19fa | 68 | } |
b8fe19fa RM |
69 | |
70 | *utmp = &utmp_data->ubuf; | |
71 | ||
72 | return 0; | |
73 | } | |
23396375 | 74 | weak_alias (__getutline_r, getutline_r) |