nsswitch/winbind_nss_netbsd.c

説明を見る。
00001 /*
00002    Unix SMB/CIFS implementation.
00003 
00004    NetBSD loadable authentication module, providing identification
00005    routines against Samba winbind/Windows NT Domain
00006 
00007    Copyright (C) Luke Mewburn 2004-2005
00008 
00009    This library is free software; you can redistribute it and/or
00010    modify it under the terms of the GNU Library General Public
00011    License as published by the Free Software Foundation; either
00012    version 2 of the License, or (at your option) any later version.
00013 
00014    This library is distributed in the hope that it will be useful,
00015    but WITHOUT ANY WARRANTY; without even the implied warranty of
00016    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017    Library General Public License for more details.
00018 
00019    You should have received a copy of the GNU Library General Public
00020    License along with this library; if not, write to the
00021    Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00022    Boston, MA  02111-1307, USA.
00023 */
00024 
00025 #include <sys/param.h>
00026 
00027 #include "winbind_client.h"
00028 
00029 #include <stdarg.h>
00030 #include <syslog.h>
00031 
00032         /* dynamic nsswitch with "new" getpw* nsdispatch API available */
00033 #if defined(NSS_MODULE_INTERFACE_VERSION) && defined(HAVE_GETPWENT_R)
00034 
00035 /*
00036         group functions
00037         ---------------
00038 */
00039 
00040 static struct group     _winbind_group;
00041 static char             _winbind_groupbuf[1024];
00042 
00043 int
00044 netbsdwinbind_endgrent(void *nsrv, void *nscb, va_list ap)
00045 {
00046         int     rv;
00047 
00048         rv = _nss_winbind_endgrent();
00049         return rv;
00050 }
00051 
00052 int
00053 netbsdwinbind_setgrent(void *nsrv, void *nscb, va_list ap)
00054 {
00055         int     rv;
00056 
00057         rv = _nss_winbind_setgrent();
00058         return rv;
00059 }
00060 
00061 int
00062 netbsdwinbind_getgrent(void *nsrv, void *nscb, va_list ap)
00063 {
00064         struct group   **retval = va_arg(ap, struct group **);
00065 
00066         int     rv, rerrno;
00067 
00068         *retval = NULL;
00069         rv = _nss_winbind_getgrent_r(&_winbind_group,
00070             _winbind_groupbuf, sizeof(_winbind_groupbuf), &rerrno);
00071         if (rv == NS_SUCCESS)
00072                 *retval = &_winbind_group;
00073         return rv;
00074 }
00075 
00076 int
00077 netbsdwinbind_getgrent_r(void *nsrv, void *nscb, va_list ap)
00078 {
00079         int             *retval = va_arg(ap, int *);
00080         struct group    *grp    = va_arg(ap, struct group *);
00081         char            *buffer = va_arg(ap, char *);
00082         size_t           buflen = va_arg(ap, size_t);
00083         struct group   **result = va_arg(ap, struct group **);
00084 
00085         int     rv, rerrno;
00086 
00087         *result = NULL;
00088         rerrno = 0;
00089 
00090         rv = _nss_winbind_getgrent_r(grp, buffer, buflen, rerrno);
00091         if (rv == NS_SUCCESS)
00092                 *result = grp;
00093         else
00094                 *retval = rerrno;
00095         return rv;
00096 }
00097 
00098 int
00099 netbsdwinbind_getgrgid(void *nsrv, void *nscb, va_list ap)
00100 {
00101         struct group   **retval = va_arg(ap, struct group **);
00102         gid_t            gid    = va_arg(ap, gid_t);
00103 
00104         int     rv, rerrno;
00105 
00106         *retval = NULL;
00107         rv = _nss_winbind_getgrgid_r(gid, &_winbind_group,
00108             _winbind_groupbuf, sizeof(_winbind_groupbuf), &rerrno);
00109         if (rv == NS_SUCCESS)
00110                 *retval = &_winbind_group;
00111         return rv;
00112 }
00113 
00114 int
00115 netbsdwinbind_getgrgid_r(void *nsrv, void *nscb, va_list ap)
00116 {
00117         int             *retval = va_arg(ap, int *);
00118         gid_t            gid    = va_arg(ap, gid_t);
00119         struct group    *grp    = va_arg(ap, struct group *);
00120         char            *buffer = va_arg(ap, char *);
00121         size_t           buflen = va_arg(ap, size_t);
00122         struct group   **result = va_arg(ap, struct group **);
00123 
00124         int     rv, rerrno;
00125 
00126         *result = NULL;
00127         rerrno = 0;
00128 
00129         rv = _nss_winbind_getgrgid_r(gid, grp, buffer, buflen, &rerrno);
00130         if (rv == NS_SUCCESS)
00131                 *result = grp;
00132         else
00133                 *retval = rerrno;
00134         return rv;
00135 }
00136 
00137 int
00138 netbsdwinbind_getgrnam(void *nsrv, void *nscb, va_list ap)
00139 {
00140         struct group   **retval = va_arg(ap, struct group **);
00141         const char      *name   = va_arg(ap, const char *);
00142 
00143         int     rv, rerrno;
00144 
00145         *retval = NULL;
00146         rv = _nss_winbind_getgrnam_r(name, &_winbind_group,
00147             _winbind_groupbuf, sizeof(_winbind_groupbuf), &rerrno);
00148         if (rv == NS_SUCCESS)
00149                 *retval = &_winbind_group;
00150         return rv;
00151 }
00152 
00153 int
00154 netbsdwinbind_getgrnam_r(void *nsrv, void *nscb, va_list ap)
00155 {
00156         int             *retval = va_arg(ap, int *);
00157         const char      *name   = va_arg(ap, const char *);
00158         struct group    *grp    = va_arg(ap, struct group *);
00159         char            *buffer = va_arg(ap, char *);
00160         size_t           buflen = va_arg(ap, size_t);
00161         struct group   **result = va_arg(ap, struct group **);
00162 
00163         int     rv, rerrno;
00164 
00165         *result = NULL;
00166         rerrno = 0;
00167 
00168         rv = _nss_winbind_getgrnam_r(name, grp, buffer, buflen, &rerrno);
00169         if (rv == NS_SUCCESS)
00170                 *result = grp;
00171         else
00172                 *retval = rerrno;
00173         return rv;
00174 }
00175 
00176 int
00177 netbsdwinbind_getgroupmembership(void *nsrv, void *nscb, va_list ap)
00178 {
00179         int             *result = va_arg(ap, int *);
00180         const char      *uname  = va_arg(ap, const char *);
00181         gid_t            agroup = va_arg(ap, gid_t);
00182         gid_t           *groups = va_arg(ap, gid_t *);
00183         int              maxgrp = va_arg(ap, int);
00184         int             *groupc = va_arg(ap, int *);
00185 
00186         struct winbindd_request request;
00187         struct winbindd_response response;
00188         gid_t   *wblistv;
00189         int     wblistc, i, isdup, dupc;
00190 
00191         ZERO_STRUCT(request);
00192         ZERO_STRUCT(response);
00193         strncpy(request.data.username, uname,
00194                                 sizeof(request.data.username) - 1);
00195         i = winbindd_request_response(WINBINDD_GETGROUPS, &request, &response);
00196         if (i != NSS_STATUS_SUCCESS)
00197                 return NS_NOTFOUND;
00198         wblistv = (gid_t *)response.extra_data.data;
00199         wblistc = response.data.num_entries;
00200 
00201         for (i = 0; i < wblistc; i++) {                 /* add winbind gids */
00202                 isdup = 0;                              /* skip duplicates */
00203                 for (dupc = 0; dupc < MIN(maxgrp, *groupc); dupc++) {
00204                         if (groups[dupc] == wblistv[i]) {
00205                                 isdup = 1;
00206                                 break;
00207                         }
00208                 }
00209                 if (isdup)
00210                         continue;
00211                 if (*groupc < maxgrp)                   /* add this gid */
00212                         groups[*groupc] = wblistv[i];
00213                 else
00214                         *result = -1;
00215                 (*groupc)++;
00216         }
00217         SAFE_FREE(wblistv);
00218         return NS_NOTFOUND;
00219 }
00220 
00221 
00222 /*
00223         passwd functions
00224         ----------------
00225 */
00226 
00227 static struct passwd    _winbind_passwd;
00228 static char             _winbind_passwdbuf[1024];
00229 
00230 int
00231 netbsdwinbind_endpwent(void *nsrv, void *nscb, va_list ap)
00232 {
00233         int     rv;
00234 
00235         rv = _nss_winbind_endpwent();
00236         return rv;
00237 }
00238 
00239 int
00240 netbsdwinbind_setpwent(void *nsrv, void *nscb, va_list ap)
00241 {
00242         int     rv;
00243 
00244         rv = _nss_winbind_setpwent();
00245         return rv;
00246 }
00247 
00248 int
00249 netbsdwinbind_getpwent(void *nsrv, void *nscb, va_list ap)
00250 {
00251         struct passwd  **retval = va_arg(ap, struct passwd **);
00252 
00253         int     rv, rerrno;
00254 
00255         *retval = NULL;
00256 
00257         rv = _nss_winbind_getpwent_r(&_winbind_passwd,
00258             _winbind_passwdbuf, sizeof(_winbind_passwdbuf), &rerrno);
00259         if (rv == NS_SUCCESS)
00260                 *retval = &_winbind_passwd;
00261         return rv;
00262 }
00263 
00264 int
00265 netbsdwinbind_getpwent_r(void *nsrv, void *nscb, va_list ap)
00266 {
00267         int             *retval = va_arg(ap, int *);
00268         struct passwd   *pw     = va_arg(ap, struct passwd *);
00269         char            *buffer = va_arg(ap, char *);
00270         size_t           buflen = va_arg(ap, size_t);
00271         struct passwd  **result = va_arg(ap, struct passwd **);
00272 
00273         int     rv, rerrno;
00274 
00275         *result = NULL;
00276         rerrno = 0;
00277 
00278         rv = _nss_winbind_getpwent_r(pw, buffer, buflen, rerrno);
00279         if (rv == NS_SUCCESS)
00280                 *result = pw;
00281         else
00282                 *retval = rerrno;
00283         return rv;
00284 }
00285 
00286 int
00287 netbsdwinbind_getpwnam(void *nsrv, void *nscb, va_list ap)
00288 {
00289         struct passwd  **retval = va_arg(ap, struct passwd **);
00290         const char      *name   = va_arg(ap, const char *);
00291 
00292         int     rv, rerrno;
00293 
00294         *retval = NULL;
00295         rv = _nss_winbind_getpwnam_r(name, &_winbind_passwd,
00296             _winbind_passwdbuf, sizeof(_winbind_passwdbuf), &rerrno);
00297         if (rv == NS_SUCCESS)
00298                 *retval = &_winbind_passwd;
00299         return rv;
00300 }
00301 
00302 int
00303 netbsdwinbind_getpwnam_r(void *nsrv, void *nscb, va_list ap)
00304 {
00305         int             *retval = va_arg(ap, int *);
00306         const char      *name   = va_arg(ap, const char *);
00307         struct passwd   *pw     = va_arg(ap, struct passwd *);
00308         char            *buffer = va_arg(ap, char *);
00309         size_t           buflen = va_arg(ap, size_t);
00310         struct passwd  **result = va_arg(ap, struct passwd **);
00311 
00312         int     rv, rerrno;
00313 
00314         *result = NULL;
00315         rerrno = 0;
00316 
00317         rv = _nss_winbind_getpwnam_r(name, pw, buffer, buflen, &rerrno);
00318         if (rv == NS_SUCCESS)
00319                 *result = pw;
00320         else
00321                 *retval = rerrno;
00322         return rv;
00323 }
00324 
00325 int
00326 netbsdwinbind_getpwuid(void *nsrv, void *nscb, va_list ap)
00327 {
00328         struct passwd  **retval = va_arg(ap, struct passwd **);
00329         uid_t            uid    = va_arg(ap, uid_t);
00330 
00331         int     rv, rerrno;
00332 
00333         *retval = NULL;
00334         rv = _nss_winbind_getpwuid_r(uid, &_winbind_passwd,
00335             _winbind_passwdbuf, sizeof(_winbind_passwdbuf), &rerrno);
00336         if (rv == NS_SUCCESS)
00337                 *retval = &_winbind_passwd;
00338         return rv;
00339 }
00340 
00341 int
00342 netbsdwinbind_getpwuid_r(void *nsrv, void *nscb, va_list ap)
00343 {
00344         int             *retval = va_arg(ap, int *);
00345         uid_t            uid    = va_arg(ap, uid_t);
00346         struct passwd   *pw     = va_arg(ap, struct passwd *);
00347         char            *buffer = va_arg(ap, char *);
00348         size_t           buflen = va_arg(ap, size_t);
00349         struct passwd  **result = va_arg(ap, struct passwd **);
00350 
00351         int     rv, rerrno;
00352 
00353         *result = NULL;
00354         rerrno = 0;
00355 
00356         rv = _nss_winbind_getpwuid_r(uid, pw, buffer, buflen, &rerrno);
00357         if (rv == NS_SUCCESS)
00358                 *result = pw;
00359         else
00360                 *retval = rerrno;
00361         return rv;
00362 }
00363 
00364 
00365 /*
00366         nsswitch module setup
00367         ---------------------
00368 */
00369 
00370 
00371 static ns_mtab winbind_methods[] = {
00372 
00373 { NSDB_GROUP, "endgrent",       netbsdwinbind_endgrent,         NULL },
00374 { NSDB_GROUP, "getgrent",       netbsdwinbind_getgrent,         NULL },
00375 { NSDB_GROUP, "getgrent_r",     netbsdwinbind_getgrent_r,       NULL },
00376 { NSDB_GROUP, "getgrgid",       netbsdwinbind_getgrgid,         NULL },
00377 { NSDB_GROUP, "getgrgid_r",     netbsdwinbind_getgrgid_r,       NULL },
00378 { NSDB_GROUP, "getgrnam",       netbsdwinbind_getgrnam,         NULL },
00379 { NSDB_GROUP, "getgrnam_r",     netbsdwinbind_getgrnam_r,       NULL },
00380 { NSDB_GROUP, "setgrent",       netbsdwinbind_setgrent,         NULL },
00381 { NSDB_GROUP, "setgroupent",    netbsdwinbind_setgrent,         NULL },
00382 { NSDB_GROUP, "getgroupmembership", netbsdwinbind_getgroupmembership, NULL },
00383 
00384 { NSDB_PASSWD, "endpwent",      netbsdwinbind_endpwent,         NULL },
00385 { NSDB_PASSWD, "getpwent",      netbsdwinbind_getpwent,         NULL },
00386 { NSDB_PASSWD, "getpwent_r",    netbsdwinbind_getpwent_r,       NULL },
00387 { NSDB_PASSWD, "getpwnam",      netbsdwinbind_getpwnam,         NULL },
00388 { NSDB_PASSWD, "getpwnam_r",    netbsdwinbind_getpwnam_r,       NULL },
00389 { NSDB_PASSWD, "getpwuid",      netbsdwinbind_getpwuid,         NULL },
00390 { NSDB_PASSWD, "getpwuid_r",    netbsdwinbind_getpwuid_r,       NULL },
00391 { NSDB_PASSWD, "setpassent",    netbsdwinbind_setpwent,         NULL },
00392 { NSDB_PASSWD, "setpwent",      netbsdwinbind_setpwent,         NULL },
00393 
00394 };
00395 
00396 ns_mtab *
00397 nss_module_register(const char *source, unsigned int *mtabsize,
00398     nss_module_unregister_fn *unreg)
00399 {
00400         *mtabsize = sizeof(winbind_methods)/sizeof(winbind_methods[0]);
00401         *unreg = NULL;
00402         return (winbind_methods);
00403 }
00404 
00405 #endif /* NSS_MODULE_INTERFACE_VERSION && HAVE_GETPWENT_R */

Sambaに対してSat Aug 29 21:23:09 2009に生成されました。  doxygen 1.4.7