/* Editor Settings: expandtabs and use 4 spaces for indentation * ex: set softtabstop=4 tabstop=8 expandtab shiftwidth=4: * * -*- mode: c, c-basic-offset: 4 -*- */ /* * Copyright Likewise Software 2004-2008 * All rights reserved. * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the license, or (at * your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser * General Public License for more details. You should have received a copy * of the GNU Lesser General Public License along with this program. If * not, see . * * LIKEWISE SOFTWARE MAKES THIS SOFTWARE AVAILABLE UNDER OTHER LICENSING * TERMS AS WELL. IF YOU HAVE ENTERED INTO A SEPARATE LICENSE AGREEMENT * WITH LIKEWISE SOFTWARE, THEN YOU MAY ELECT TO USE THE SOFTWARE UNDER THE * TERMS OF THAT SOFTWARE LICENSE AGREEMENT INSTEAD OF THE TERMS OF THE GNU * LESSER GENERAL PUBLIC LICENSE, NOTWITHSTANDING THE ABOVE NOTICE. IF YOU * HAVE QUESTIONS, OR WISH TO REQUEST A COPY OF THE ALTERNATE LICENSING * TERMS OFFERED BY LIKEWISE SOFTWARE, PLEASE CONTACT LIKEWISE SOFTWARE AT * license@likewisesoftware.com */ /* * Copyright (C) Likewise Software. All rights reserved. * * Module Name: * * nss-group.c * * Abstract: * * Name Server Switch (Likewise LSASS) * * Handle NSS Group Information * * Authors: Brian Koropoff (bkoropoff@likewisesoftware.com) * */ #include "lsanss.h" #include "nss-netgrp.h" #include "externs.h" #include #define MAX_NUM_ARTEFACTS 500 NSS_STATUS buffer_alloc(char** buffer, size_t* buflen, size_t needed, char** chunk, int *errnop) { size_t needed_aligned = ((needed / sizeof(size_t)) + 1) * sizeof(size_t); if (needed_aligned > *buflen) { *errnop = ENOMEM; return NSS_STATUS_UNAVAIL; } else { *chunk = *buffer; *buffer += needed_aligned; *buflen -= needed_aligned; return NSS_STATUS_SUCCESS; } } NSS_STATUS _nss_lsass_setnetgrent ( char *group, struct __netgrent *result ) { NSS_STATUS ret = NSS_STATUS_SUCCESS; PSTR pszValue = NULL; NSS_LOCK(); ret = LsaNssCommonNetgroupFindByName( &hLsaConnection, group, &pszValue); BAIL_ON_NSS_ERROR(ret); result->data = pszValue; result->data_size = strlen(pszValue); result->cursor = result->data; result->first = 1; error: NSS_UNLOCK(); return ret; } NSS_STATUS _nss_lsass_endnetgrent (struct __netgrent * result) { LW_SAFE_FREE_MEMORY(result->data); return NSS_STATUS_SUCCESS; } static NSS_STATUS nss_lsass_parse_entry( struct __netgrent* result, char** buffer, size_t* buflen, int* errnop) { NSS_STATUS ret = NSS_STATUS_SUCCESS; LSA_NSS_NETGROUP_ENTRY_TYPE type; char* host = NULL; char* user = NULL; char* domain = NULL; char* group = NULL; ret = LsaNssCommonNetgroupParse( &result->cursor, &type, &host, &user, &domain, &group); BAIL_ON_NSS_ERROR(ret); switch (type) { case LSA_NSS_NETGROUP_ENTRY_TRIPLE: result->type = triple_val; memset(&result->val.triple, 0, sizeof(result->val.triple)); /* Copy the values into the provided buffer */ if (host) { ret = buffer_alloc(buffer, buflen, strlen(host) + 1, (char**) &result->val.triple.host, errnop); BAIL_ON_NSS_ERROR(ret); strcpy(*((char**)&result->val.triple.host), host); } if (user) { ret = buffer_alloc(buffer, buflen, strlen(user) + 1, (char**) &result->val.triple.user, errnop); BAIL_ON_NSS_ERROR(ret); strcpy(*((char**)&result->val.triple.user), user); } if (domain) { ret = buffer_alloc(buffer, buflen, strlen(domain) + 1, (char**) &result->val.triple.domain, errnop); BAIL_ON_NSS_ERROR(ret); strcpy(*((char**)&result->val.triple.domain), domain); } break; case LSA_NSS_NETGROUP_ENTRY_GROUP: result->type = group_val; /* Copy the group into the provided buffer */ ret = buffer_alloc(buffer, buflen, strlen(group) + 1, (char**) &result->val.group, errnop); BAIL_ON_NSS_ERROR(ret); strcpy(*((char**)&result->val.group), group); break; case LSA_NSS_NETGROUP_ENTRY_END: /* End of entries, return the appropriate status code */ ret = result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN; BAIL_ON_NSS_ERROR(ret); break; } result->first = 0; error: return ret; } NSS_STATUS _nss_lsass_getnetgrent_r (struct __netgrent *result, char *buffer, size_t buflen, int *errnop) { NSS_STATUS status = NSS_STATUS_SUCCESS; status = nss_lsass_parse_entry( result, &buffer, &buflen, errnop); BAIL_ON_NSS_ERROR(status); error: return status; }