/* 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: Krishna Ganugapati (krishnag@likewisesoftware.com)
* Sriram Nambakam (snambakam@likewisesoftware.com)
*
*/
#include "lsanss.h"
#include "externs.h"
#include
static const DWORD MAX_NUM_GROUPS = 500;
static LSA_ENUMGROUPS_STATE gEnumGroupsState = {0};
NSS_STATUS
_nss_lsass_setgrent(
void
)
{
NSS_STATUS status;
NSS_LOCK();
status = LsaNssCommonGroupSetgrent(&hLsaConnection,
&gEnumGroupsState);
NSS_UNLOCK();
return status;
}
NSS_STATUS
_nss_lsass_getgrent_r(
struct group* pResultGroup,
char * pszBuf,
size_t bufLen,
int* pErrorNumber
)
{
NSS_STATUS status;
NSS_LOCK();
status = LsaNssCommonGroupGetgrent(
&hLsaConnection,
&gEnumGroupsState,
pResultGroup,
pszBuf,
bufLen,
pErrorNumber);
NSS_UNLOCK();
return status;
}
NSS_STATUS
_nss_lsass_endgrent(
void
)
{
NSS_STATUS status;
NSS_LOCK();
status = LsaNssCommonGroupEndgrent(&hLsaConnection, &gEnumGroupsState);
NSS_UNLOCK();
return status;
}
NSS_STATUS
_nss_lsass_getgrgid_r(
gid_t gid,
struct group* pResultGroup,
char* pszBuf,
size_t bufLen,
int* pErrorNumber
)
{
NSS_STATUS status;
NSS_LOCK();
status = LsaNssCommonGroupGetgrgid(&hLsaConnection,
gid,
pResultGroup,
pszBuf,
bufLen,
pErrorNumber);
NSS_UNLOCK();
return status;
}
NSS_STATUS
_nss_lsass_getgrnam_r(
const char * pszGroupName,
struct group * pResultGroup,
char * pszBuf,
size_t bufLen,
int* pErrorNumber
)
{
NSS_STATUS status;
NSS_LOCK();
status = LsaNssCommonGroupGetgrnam(&hLsaConnection,
pszGroupName,
pResultGroup,
pszBuf,
bufLen,
pErrorNumber);
NSS_UNLOCK();
return status;
}
NSS_STATUS
_nss_lsass_initgroups_dyn(
PCSTR pszUserName,
gid_t groupGid,
long int* pResultsSize,
long int* pResultsCapacity,
gid_t** ppGidResults,
long int maxGroups,
int* pErrorNumber
)
{
int ret = NSS_STATUS_SUCCESS;
size_t resultsCapacity = (size_t) *pResultsCapacity;
size_t resultsExistingSize = (size_t) *pResultsSize;
size_t resultsSize = 0;
gid_t* pGidResults = *ppGidResults;
gid_t* pGidResultsNew = NULL;
NSS_LOCK();
ret = LsaNssCommonGroupGetGroupsByUserName(
&hLsaConnection,
pszUserName,
resultsExistingSize,
resultsCapacity,
&resultsSize,
pGidResults,
pErrorNumber);
if (ret != NSS_STATUS_SUCCESS)
goto error;
if (resultsSize > resultsCapacity)
{
/* More results were found than were stored, so
reallocate array and try again. */
pGidResultsNew = realloc(pGidResults, sizeof(*pGidResults) * resultsSize);
if (!pGidResultsNew)
{
*pErrorNumber = ENOMEM;
ret = NSS_STATUS_UNAVAIL;
goto error;
}
else
{
pGidResults = pGidResultsNew;
*ppGidResults = pGidResults;
}
/* The number of filled elements is whatever our old capacity was */
resultsExistingSize = resultsCapacity;
/* The new capacity is the number of available results */
resultsCapacity = resultsSize;
/* Try again */
ret = LsaNssCommonGroupGetGroupsByUserName(
&hLsaConnection,
pszUserName,
resultsExistingSize,
resultsCapacity,
&resultsSize,
pGidResults,
pErrorNumber);
}
if (ret == NSS_STATUS_SUCCESS)
{
*pResultsSize = (long int) resultsSize;
*pResultsCapacity = (long int) resultsCapacity;
}
error:
NSS_UNLOCK();
return ret;
}