]>
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 | __getutid_r (const struct utmp *id, struct utmp **utmp, |
30 | struct utmp_data *utmp_data) | |
b8fe19fa | 31 | { |
0200214b RM |
32 | #if (_HAVE_UT_ID - 0) && (_HAVE_UT_TYPE - 0) |
33 | /* Test whether ID has any of the legal types. */ | |
34 | if (id->ut_type != RUN_LVL && id->ut_type != BOOT_TIME | |
35 | && id->ut_type != OLD_TIME && id->ut_type != NEW_TIME | |
36 | && id->ut_type != INIT_PROCESS && id->ut_type != LOGIN_PROCESS | |
37 | && id->ut_type != USER_PROCESS && id->ut_type != DEAD_PROCESS) | |
38 | /* No, using '<' and '>' for the test is not possible. */ | |
39 | { | |
40 | errno = EINVAL; | |
41 | return -1; | |
42 | } | |
43 | ||
b8fe19fa RM |
44 | /* Open utmp file if not already done. */ |
45 | if (utmp_data->ut_fd == -1) | |
46 | { | |
47 | setutent_r (utmp_data); | |
48 | if (utmp_data->ut_fd == -1) | |
49 | return -1; | |
50 | } | |
51 | ||
52 | /* Position file correctly. */ | |
53 | if (lseek (utmp_data->ut_fd, utmp_data->loc_utmp, SEEK_SET) == -1) | |
54 | return -1; | |
55 | ||
49b98627 RM |
56 | if (id->ut_type == RUN_LVL || id->ut_type == BOOT_TIME |
57 | || id->ut_type == OLD_TIME || id->ut_type == NEW_TIME) | |
b8fe19fa | 58 | { |
49b98627 RM |
59 | /* Search for next entry with type RUN_LVL, BOOT_TIME, |
60 | OLD_TIME, or NEW_TIME. */ | |
61 | ||
62 | while (1) | |
b8fe19fa | 63 | { |
49b98627 RM |
64 | /* Read the next entry. */ |
65 | if (read (utmp_data->ut_fd, &utmp_data->ubuf, sizeof (struct utmp)) | |
66 | != sizeof (struct utmp)) | |
67 | { | |
d4eaba51 | 68 | utmp_data->loc_utmp = 0; /* Mark loc_utmp invalid. */ |
49b98627 RM |
69 | errno = ESRCH; |
70 | return -1; | |
71 | } | |
72 | ||
73 | /* Update position pointer. */ | |
74 | utmp_data->loc_utmp += sizeof (struct utmp); | |
75 | ||
76 | if (id->ut_type == utmp_data->ubuf.ut_type) | |
77 | break; | |
b8fe19fa | 78 | } |
49b98627 RM |
79 | } |
80 | else | |
81 | { | |
82 | /* Search for the next entry with the specified ID and with type | |
83 | INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS, or DEAD_PROCESS. */ | |
b8fe19fa | 84 | |
49b98627 RM |
85 | while (1) |
86 | { | |
87 | /* Read the next entry. */ | |
88 | if (read (utmp_data->ut_fd, &utmp_data->ubuf, sizeof (struct utmp)) | |
89 | != sizeof (struct utmp)) | |
90 | { | |
d4eaba51 | 91 | utmp_data->loc_utmp = 0; /* Mark loc_utmp invalid. */ |
49b98627 RM |
92 | errno = ESRCH; |
93 | return -1; | |
94 | } | |
95 | ||
96 | /* Update position pointer. */ | |
97 | utmp_data->loc_utmp += sizeof (struct utmp); | |
98 | ||
99 | if (( utmp_data->ubuf.ut_type == INIT_PROCESS | |
100 | || utmp_data->ubuf.ut_type == LOGIN_PROCESS | |
101 | || utmp_data->ubuf.ut_type == USER_PROCESS | |
102 | || utmp_data->ubuf.ut_type == DEAD_PROCESS) | |
103 | && (strncmp (utmp_data->ubuf.ut_id, id->ut_id, sizeof id->ut_id) | |
104 | == 0)) | |
105 | break; | |
106 | } | |
b8fe19fa | 107 | } |
b8fe19fa RM |
108 | |
109 | *utmp = &utmp_data->ubuf; | |
110 | ||
111 | return 0; | |
0200214b RM |
112 | #else /* !_HAVE_UT_ID && !_HAVE_UT_TYPE */ |
113 | errno = ENOSYS; | |
114 | return -1; | |
115 | #endif | |
b8fe19fa | 116 | } |
23396375 | 117 | weak_alias (__getutid_r, getutid_r) |