885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose Unix SMB/CIFS implementation.
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose Winbind client API - SSSD version
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose Copyright (C) Sumit Bose <sbose@redhat.com> 2014
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose This library is free software; you can redistribute it and/or
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose modify it under the terms of the GNU Lesser General Public
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose License as published by the Free Software Foundation; either
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose version 3 of the License, or (at your option) any later version.
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose This library is distributed in the hope that it will be useful,
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose but WITHOUT ANY WARRANTY; without even the implied warranty of
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose Library General Public License for more details.
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose You should have received a copy of the GNU Lesser General Public License
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose along with this program. If not, see <http://www.gnu.org/licenses/>.
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose/* Required Headers */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose#define DEFAULT_BUFSIZE (2 * DEFAULT_BUFSIZE_HALF)
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose enum nss_status (*getpwnam_r)(const char *name, struct passwd *result,
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose enum nss_status (*getpwuid_r)(uid_t uid, struct passwd *result,
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose enum nss_status (*getpwent_r)(struct passwd *result,
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose enum nss_status (*getgrnam_r)(const char *name, struct group *result,
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose enum nss_status (*getgrgid_r)(gid_t gid, struct group *result,
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose enum nss_status (*getgrent_r)(struct group *result,
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose enum nss_status (*initgroups_dyn)(const char *user, gid_t group,
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose return false;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ctx->dl_handle = dlopen("libnss_sss.so.2", RTLD_NOW);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ctx->getpwnam_r = dlsym(ctx->dl_handle, "_nss_sss_getpwnam_r");
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ctx->getpwuid_r = dlsym(ctx->dl_handle, "_nss_sss_getpwuid_r");
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ctx->setpwent = dlsym(ctx->dl_handle, "_nss_sss_setpwent");
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ctx->getpwent_r = dlsym(ctx->dl_handle, "_nss_sss_getpwent_r");
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ctx->endpwent = dlsym(ctx->dl_handle, "_nss_sss_endpwent");
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ctx->getgrnam_r = dlsym(ctx->dl_handle, "_nss_sss_getgrnam_r");
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ctx->getgrgid_r = dlsym(ctx->dl_handle, "_nss_sss_getgrgid_r");
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ctx->setgrent = dlsym(ctx->dl_handle, "_nss_sss_setgrent");
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ctx->getgrent_r = dlsym(ctx->dl_handle, "_nss_sss_getgrent_r");
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ctx->endgrent = dlsym(ctx->dl_handle, "_nss_sss_endgrent");
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ctx->initgroups_dyn = dlsym(ctx->dl_handle, "_nss_sss_initgroups_dyn");
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose return true;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose return false;
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bosestatic wbcErr copy_pwd(struct passwd *in, struct passwd **out)
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose pw = (struct passwd *)wbcAllocateMemory(1, sizeof(struct passwd),
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose/* Fill in a struct passwd* for a domain user based on username */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosewbcErr wbcGetpwnam(const char *name, struct passwd **pwd)
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose status = ctx->getpwnam_r(name, &lpwd, buffer, buflen, &nss_errno);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose/* Fill in a struct passwd* for a domain user based on uid */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosewbcErr wbcGetpwuid(uid_t uid, struct passwd **pwd)
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose status = ctx->getpwuid_r(uid, &lpwd, buffer, buflen, &nss_errno);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose/* Fill in a struct passwd* for a domain user based on sid */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosewbcErr wbcGetpwsid(struct wbcDomainSid *sid, struct passwd **pwd)
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose /* if the array was partly created this can be NULL */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bosestatic wbcErr copy_grp(struct group *in, struct group **out)
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose gr = (struct group *)wbcAllocateMemory(1, sizeof(struct group),
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose for (members = 0; in->gr_mem[members] != NULL; members++);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose gr->gr_mem = (char **)calloc(members+1, sizeof(char *));
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose for (c = 0; c < members; c++) {
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose/* Fill in a struct passwd* for a domain user based on username */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosewbcErr wbcGetgrnam(const char *name, struct group **grp)
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose status = ctx->getgrnam_r(name, &lgrp, buffer, buflen, &nss_errno);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose } while (status == NSS_STATUS_TRYAGAIN && nss_errno == ERANGE \
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose/* Fill in a struct passwd* for a domain user based on uid */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose status = ctx->getgrgid_r(gid, &lgrp, buffer, buflen, &nss_errno);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose } while (status == NSS_STATUS_TRYAGAIN && nss_errno == ERANGE \
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose/* Reset the passwd iterator */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose/* Close the passwd iterator */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose/* Return the next struct passwd* entry from the pwent iterator */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose status = ctx->getpwent_r(&lpwd, buffer, buflen, &nss_errno);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose/* Reset the group iterator */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose/* Close the group iterator */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose/* Return the next struct group* entry from the pwent iterator */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose status = ctx->getgrent_r(&lgrp, buffer, buflen, &nss_errno);
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose } while (status == NSS_STATUS_TRYAGAIN && nss_errno == ERANGE \
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose/* Return the next struct group* entry from the pwent iterator */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose /* Not used anywhere */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose/* Return the unix group array belonging to the given user */
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose /* nss modules may skip the primary group when we pass it in so always
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose * add it in advance */