Update Standards-Version
[manu/libnss-mysql-bg.git] / src / mysql-grp.c
1 /* Copyright (C) 2002 Ben Goodwin
2    This file is part of the nss-mysql library.
3   
4    The nss-mysql library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU General Public License as published
6    by the Free Software Foundation; either version 2 of the License, or
7    (at your option) any later version.
8   
9    The nss-mysql library 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    You should have received a copy of the GNU General Public License
14    along with the nss-mysql library; if not, write to the Free Software
15    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16  */
17
18 static const char rcsid[] =
19     "$Id: mysql-grp.c,v 1.15 2004/11/13 16:25:26 cinergi Exp $ ";
20
21 #include "lookup.h"
22 #include <grp.h>
23
24 extern conf_t conf;
25
26 MYSQL_RES *mresult_grent = NULL;
27
28 /*
29  * getgrnam
30  */
31 NSS_STATUS
32 #ifdef HAVE_NSS_H
33 _nss_mysql_getgrnam_r (const char *name, struct group *result, char *buffer,
34                        size_t buflen, int *errnop)
35 #elif defined(HAVE_NSS_COMMON_H)
36 _nss_mysql_getgrnam_r (nss_backend_t *be, void *args)
37 #endif
38 {
39   DN ("_nss_mysql_getgrnam_r")
40   int retVal;
41   MYSQL_RES *mresult = NULL;
42
43   DENTER
44   LOCK;
45 #ifdef HAVE_NSS_H
46   retVal = _nss_mysql_lookup (BYNAME, name, 0, conf.sql.query.getgrnam,
47                               nfalse, result, buffer, buflen, errnop,
48                               _nss_mysql_load_group, &mresult, FUNCNAME);
49 #elif defined(HAVE_NSS_COMMON_H)
50   retVal = _nss_mysql_lookup (BYNAME, NSS_ARGS(args)->key.name,
51                               0, conf.sql.query.getgrnam,
52                               nfalse, NSS_ARGS(args)->buf.result,
53                               NSS_ARGS(args)->buf.buffer,
54                               NSS_ARGS(args)->buf.buflen,
55                               &NSS_ARGS(args)->erange,
56                               _nss_mysql_load_group, &mresult, FUNCNAME);
57   if (retVal == NSS_SUCCESS)
58     NSS_ARGS(args)->returnval = NSS_ARGS(args)->buf.result;
59 #endif
60   UNLOCK;
61   DSRETURN (retVal)
62 }
63
64 /*
65  * getgrgid
66  */
67 NSS_STATUS
68 #ifdef HAVE_NSS_H
69 _nss_mysql_getgrgid_r (uid_t uid, struct group *result, char *buffer,
70                        size_t buflen, int *errnop)
71 #elif defined(HAVE_NSS_COMMON_H)
72 _nss_mysql_getgrgid_r (nss_backend_t *be, void *args)
73 #endif
74 {
75   DN ("_nss_mysql_getgrgid_r")
76   int retVal;
77   MYSQL_RES *mresult = NULL;
78
79   DENTER
80   LOCK;
81 #ifdef HAVE_NSS_H
82   retVal = _nss_mysql_lookup (BYNUM, NULL, uid, conf.sql.query.getgrgid,
83                               nfalse, result, buffer, buflen, errnop,
84                               _nss_mysql_load_group, &mresult, FUNCNAME);
85 #else
86   retVal = _nss_mysql_lookup (BYNUM, NULL, NSS_ARGS(args)->key.uid,
87                               conf.sql.query.getgrgid, nfalse,
88                               NSS_ARGS(args)->buf.result,
89                               NSS_ARGS(args)->buf.buffer,
90                               NSS_ARGS(args)->buf.buflen,
91                               &NSS_ARGS(args)->erange,
92                               _nss_mysql_load_group, &mresult, FUNCNAME);
93   if (retVal == NSS_SUCCESS)
94     NSS_ARGS(args)->returnval = NSS_ARGS(args)->buf.result;
95 #endif
96   UNLOCK;
97   DSRETURN (retVal)
98 }
99
100 /*
101  * endgrent
102  */
103 ENDENT(grent)
104
105 /*
106  * setgrent
107  */
108 SETENT(grent)
109
110 /*
111  * getgrent
112  */
113 NSS_STATUS
114 #ifdef HAVE_NSS_H
115 _nss_mysql_getgrent_r (struct group *result, char *buffer, size_t buflen,
116                        int *errnop)
117 #elif defined(HAVE_NSS_COMMON_H)
118 _nss_mysql_getgrent_r (nss_backend_t *be, void *args)
119 #endif
120 {
121   DN ("_nss_mysql_getgrent_r")
122   int retVal;
123
124   DENTER
125   LOCK;
126 #ifdef HAVE_NSS_H
127   retVal = _nss_mysql_lookup (BYNONE, NULL, 0, conf.sql.query.getgrent,
128                               nfalse, result, buffer, buflen, errnop,
129                               _nss_mysql_load_group, &mresult_grent, FUNCNAME);
130 #else
131   retVal = _nss_mysql_lookup (BYNONE, NULL, 0, conf.sql.query.getgrent,
132                               nfalse, NSS_ARGS(args)->buf.result,
133                               NSS_ARGS(args)->buf.buffer,
134                               NSS_ARGS(args)->buf.buflen,
135                               &NSS_ARGS(args)->erange,
136                               _nss_mysql_load_group, &mresult_grent, FUNCNAME);
137   if (retVal == NSS_SUCCESS)
138     NSS_ARGS(args)->returnval = NSS_ARGS(args)->buf.result;
139 #endif
140   UNLOCK;
141   DSRETURN (retVal)
142 }
143
144 /*
145  * initgroups/getgrmem
146  */
147 #ifdef HAVE_NSS_H
148 NSS_STATUS
149 _nss_mysql_initgroups_dyn (const char *user, gid_t group, long int *start,
150                            long int *size, gid_t **groupsp, long int limit,
151                            int *errnop)
152 {
153   DN ("_nss_mysql_initgroups_dyn")
154 #endif
155 #ifdef HAVE_NSS_COMMON_H
156 NSS_STATUS
157 _nss_mysql_getgrmem (nss_backend_t *be, void *args)
158 {
159   DN ("_nss_mysql_getgrmem")
160 #endif
161   int retVal;
162   MYSQL_RES *mresult = NULL;
163   group_info_t gi;
164
165   DENTER
166 #ifdef HAVE_NSS_H
167   gi.start = start;
168   gi.size = size;
169   gi.limit = limit;
170   gi.groupsp = groupsp;
171   gi.group = (long int) group;
172 #elif defined(HAVE_NSS_COMMON_H)
173   gi.start = (long int *)&((struct nss_groupsbymem *)args)->numgids;
174   gi.limit = ((struct nss_groupsbymem *)args)->maxgids;
175   gi.size = &gi.limit;
176   gi.groupsp = &(((struct nss_groupsbymem *)args)->gid_array);
177   gi.group = -1;
178 #endif
179
180   LOCK;
181 #ifdef HAVE_NSS_H
182   retVal = _nss_mysql_lookup (BYNAME, user, 0, conf.sql.query.gidsbymem,
183                               nfalse, &gi, NULL, 0, errnop,
184                               _nss_mysql_load_gidsbymem, &mresult,
185                               "initgroups");
186 #else
187   retVal = _nss_mysql_lookup (BYNAME,
188                               ((struct nss_groupsbymem *)args)->username,
189                               0, conf.sql.query.gidsbymem, nfalse, &gi, NULL,
190                               0, NULL, _nss_mysql_load_gidsbymem, &mresult,
191                               "initgroups");
192 #endif
193   UNLOCK;
194   if (retVal != NSS_SUCCESS)
195     DSRETURN (retVal)
196
197 #ifdef HAVE_NSS_COMMON_H
198   DSRETURN (NSS_NOTFOUND)
199 #else
200   DSRETURN (NSS_SUCCESS)
201 #endif
202 }
203
204 #ifdef HAVE_NSS_COMMON_H
205 static nss_backend_op_t group_ops[] = {
206     _nss_mysql_default_destr,       /* NSS_DBOP_DESTRUCTOR */
207     _nss_mysql_endgrent,            /* NSS_DBOP_ENDENT */
208     _nss_mysql_setgrent,            /* NSS_DBOP_SETENT */
209     _nss_mysql_getgrent_r,          /* NSS_DBOP_GETENT */
210     _nss_mysql_getgrnam_r,          /* NSS_DBOP_GROUP_BYNAME */
211     _nss_mysql_getgrgid_r,          /* NSS_DBOP_GROUP_BYGID */
212     _nss_mysql_getgrmem             /* NSS_DBOP_GROUP_BYMEMBER */
213 };
214
215 CONSTR(group)
216 #endif