Remove db backend and provide support for utmpd backend.
[kopensolaris-gnu/glibc.git] / login / getutent_r.c
1 /* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@cygnus.com>
4    and Paul Janzen <pcj@primenet.com>, 1996.
5
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Library General Public License as
8    published by the Free Software Foundation; either version 2 of the
9    License, or (at your option) any later version.
10
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Library General Public License for more details.
15
16    You should have received a copy of the GNU Library General Public
17    License along with the GNU C Library; see the file COPYING.LIB.  If not,
18    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19    Boston, MA 02111-1307, USA.  */
20
21 #include <assert.h>
22 #if _LIBC
23 #include <libc-lock.h>
24 #else
25 #define __libc_lock_lock(lock)          ((void) 0)
26 #define __libc_lock_unlock(lock)        ((void) 0)
27 #define __libc_lock_define_initialized(CLASS,NAME)
28 #define weak_alias(name, aliasname) \
29   extern __typeof (name) aliasname __attribute__ ((weak, alias (#name))); 
30 #endif
31 #include <stdio.h>
32 #include <string.h>
33 #include <unistd.h>
34 #include <utmp.h>
35
36 #include "utmp-private.h"
37
38
39 /* The various backends we have.  */
40 static int setutent_unknown (int reset);
41 static int getutent_r_unknown (struct utmp *buffer, struct utmp **result);
42 static struct utmp *pututline_unknown (const struct utmp *data);
43 static void endutent_unknown (void);
44
45 /* Initial Jump table.  */
46 struct utfuncs __libc_utmp_unknown_functions =
47 {
48   setutent_unknown,
49   getutent_r_unknown,
50   NULL,
51   NULL,
52   pututline_unknown,
53   endutent_unknown,
54   NULL
55 };
56
57 /* Currently selected backend.  */
58 struct utfuncs *__libc_utmp_jump_table = &__libc_utmp_unknown_functions;
59
60 /* We need to protect the opening of the file.  */
61 __libc_lock_define_initialized (, __libc_utmp_lock)
62
63      
64 void
65 __setutent (void)
66 {
67   __libc_lock_lock (__libc_utmp_lock);
68
69   (void) (*__libc_utmp_jump_table->setutent) (1);
70
71   __libc_lock_unlock (__libc_utmp_lock);
72 }
73 weak_alias (__setutent, setutent)
74
75
76 static int
77 setutent_unknown (int reset)
78 {
79   /* We have to test whether it is still not decided which backend to use.  */
80   assert (__libc_utmp_jump_table == &__libc_utmp_unknown_functions);
81
82   /* See whether utmpd is running.  */
83   if ((*__libc_utmp_daemon_functions.setutent) (reset))
84     __libc_utmp_jump_table = &__libc_utmp_daemon_functions;
85   else
86     {
87       /* Use the normal file, but if the current file is _PATH_UTMP or
88          _PATH_WTMP and the corresponding extended file (with an extra
89          'x' added to the pathname) exists, we use the extended file,
90          because the original file is in a different format.  */
91       if (strcmp (__libc_utmp_file_name, _PATH_UTMP) == 0
92           && __access (_PATH_UTMP "x", F_OK) == 0)
93         __utmpname (_PATH_UTMP "x");
94       else if (strcmp (__libc_utmp_file_name, _PATH_WTMP) == 0
95                && __access (_PATH_WTMP "x", F_OK) == 0)
96         __utmpname (_PATH_WTMP "x");
97
98       (*__libc_utmp_file_functions.setutent) (reset);
99       __libc_utmp_jump_table = &__libc_utmp_file_functions;
100     }
101   
102   return 0;
103 }
104
105
106 void
107 __endutent (void)
108 {
109   __libc_lock_lock (__libc_utmp_lock);
110
111   (*__libc_utmp_jump_table->endutent) ();
112
113   __libc_lock_unlock (__libc_utmp_lock);
114 }
115 weak_alias (__endutent, endutent)
116
117
118 static void
119 endutent_unknown (void)
120 {
121   /* Huh, how do we came here?  Nothing to do.  */
122 }
123
124
125 int
126 __getutent_r (struct utmp *buffer, struct utmp **result)
127 {
128   int retval;
129
130   __libc_lock_lock (__libc_utmp_lock);
131
132   retval = (*__libc_utmp_jump_table->getutent_r) (buffer, result);
133
134   __libc_lock_unlock (__libc_utmp_lock);
135
136   return retval;
137 }
138 weak_alias (__getutent_r, getutent_r)
139
140
141 static int
142 getutent_r_unknown (struct utmp *buffer, struct utmp **result)
143 {
144   /* It is not yet initialized.  */
145   setutent_unknown (0);
146
147   return (*__libc_utmp_jump_table->getutent_r) (buffer, result);
148 }
149
150
151 struct utmp *
152 __pututline (const struct utmp *data)
153 {
154   struct utmp *buffer;
155
156   __libc_lock_lock (__libc_utmp_lock);
157
158   buffer = (*__libc_utmp_jump_table->pututline) (data);
159
160   __libc_lock_unlock (__libc_utmp_lock);
161
162   return buffer;
163 }
164 weak_alias (__pututline, pututline)
165
166
167 static struct utmp *
168 pututline_unknown (const struct utmp *data)
169 {
170   /* It is not yet initialized.  */
171   setutent_unknown (0);
172
173   return (*__libc_utmp_jump_table->pututline) (data);
174 }