Ejemplo n.º 1
0
NSS_STATUS
_nss_lsass_endgrent(
    void
    )
{
    NSS_STATUS status;

    NSS_LOCK();

    status = LsaNssCommonGroupEndgrent(&lsaConnection, &gEnumGroupsState);

    NSS_UNLOCK();

    return status;
}
Ejemplo n.º 2
0
NSS_STATUS
_nss_lsass_setpwent(
    void
    )
{
    NSS_STATUS status;

    NSS_LOCK();

    status = LsaNssCommonPasswdSetpwent(&lsaConnection,
                                        &gEnumUsersState);

    NSS_UNLOCK();

    return status;
}
Ejemplo n.º 3
0
NSS_STATUS
LsaNssSolarisGroupGetgroupsbymember(
    nss_backend_t* pBackend,
    void* pArgs
)
{
    struct nss_groupsbymem* pGroupsByMem = (struct nss_groupsbymem*) pArgs;
    PCSTR                   pszUserName = pGroupsByMem->username;
    int*                    pResultsSize = &pGroupsByMem->numgids;
    int*                    pResultsCapacity = &pGroupsByMem->maxgids;
    gid_t*                  pGidResults = pGroupsByMem->gid_array;
    int                     err = 0;
    int*                    pErrorNumber = &err;
    int                     ret = NSS_STATUS_SUCCESS;
    PLSA_NSS_GROUP_BACKEND    pLsaBackend = (PLSA_NSS_GROUP_BACKEND) pBackend;

    size_t myResultsSize = *pResultsSize;
    size_t myResultsCapacity = *pResultsCapacity;

    NSS_LOCK();

    ret = LsaNssCommonGroupGetGroupsByUserName(
              &pLsaBackend->lsaConnection,
              pszUserName,
              myResultsSize,
              myResultsCapacity,
              &myResultsSize,
              pGidResults,
              pErrorNumber);

    NSS_UNLOCK();

    if (ret == NSS_STATUS_SUCCESS)
    {
        if (myResultsSize > myResultsCapacity)
            myResultsSize = myResultsCapacity;

        *pResultsSize = (int) myResultsSize;
    }

    return ret;
}
Ejemplo n.º 4
0
static
NSS_STATUS
LsaNssSolarisGroupSetgrent(
    nss_backend_t* pBackend,
    void* pArgs
)
{
    NSS_STATUS status;
    PLSA_NSS_GROUP_BACKEND    pLsaBackend = (PLSA_NSS_GROUP_BACKEND) pBackend;
    PLSA_ENUMGROUPS_STATE     pEnumGroupsState = &pLsaBackend->enumGroupsState;

    NSS_LOCK();

    status = LsaNssCommonGroupSetgrent(
                 &pLsaBackend->lsaConnection,
                 pEnumGroupsState);
    NSS_UNLOCK();

    return status;
}
Ejemplo n.º 5
0
NSS_STATUS
_nss_lsass_getgrent_r(
    struct group*  pResultGroup,
    char *         pszBuf,
    size_t         bufLen,
    int*           pErrorNumber
    )
{
    NSS_STATUS status;

    NSS_LOCK();

    status = LsaNssCommonGroupGetgrent(
        &lsaConnection,
        &gEnumGroupsState,
        pResultGroup,
        pszBuf,
        bufLen,
        pErrorNumber);

    NSS_UNLOCK();

    return status;
}
Ejemplo n.º 6
0
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(&lsaConnection,
                                       pszGroupName,
                                       pResultGroup,
                                       pszBuf,
                                       bufLen,
                                       pErrorNumber);

    NSS_UNLOCK();

    return status;
}
Ejemplo n.º 7
0
NSS_STATUS
_nss_lsass_getpwent_r(
    struct passwd * pResultUser,
    char *          pszBuf,
    size_t          bufLen,
    int *           pErrorNumber
    )
{
    NSS_STATUS status;

    NSS_LOCK();

    status = LsaNssCommonPasswdGetpwent(
        &lsaConnection,
        &gEnumUsersState,
        pResultUser,
        pszBuf,
        bufLen,
        pErrorNumber);

    NSS_UNLOCK();

    return status;
}
Ejemplo n.º 8
0
NSS_STATUS
_nss_lsass_getpwuid_r(
    uid_t           uid,
    struct passwd * pResultUser,
    char *          pszBuf,
    size_t          bufLen,
    int *           pErrorNumber
    )
{
    NSS_STATUS status;

    NSS_LOCK();

    status = LsaNssCommonPasswdGetpwuid(&lsaConnection,
                                        uid,
                                        pResultUser,
                                        pszBuf,
                                        bufLen,
                                        pErrorNumber);

    NSS_UNLOCK();

    return status;
}
Ejemplo n.º 9
0
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(
        &lsaConnection,
        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(
            &lsaConnection,
            pszUserName,
            resultsExistingSize,
            resultsCapacity,
            &resultsSize,
            pGidResults,
            pErrorNumber);
    }

    if (ret == NSS_STATUS_SUCCESS)
    {
        *pResultsSize = (long int) resultsSize;
        *pResultsCapacity = (long int) resultsCapacity;
    }

error:

    NSS_UNLOCK();

    return ret;
}
Ejemplo n.º 10
0
NSS_STATUS
LsaNssSolarisGroupGetgrnam(
    nss_backend_t* pBackend,
    void* pArgs
)
{
    nss_XbyY_args_t*          pXbyYArgs = (nss_XbyY_args_t*) pArgs;
    const char *              pszGroupName = pXbyYArgs->key.name;
    struct group *            pResultGroup = (struct group*) pXbyYArgs->buf.result;
    char *                    pszBuf = pXbyYArgs->buf.buffer;
    size_t                    bufLen = pXbyYArgs->buf.buflen;
    int                       err = 0;
    int*                      pErrorNumber = &err;
    int                       ret = NSS_STATUS_SUCCESS;
    PLSA_NSS_GROUP_BACKEND    pLsaBackend = (PLSA_NSS_GROUP_BACKEND) pBackend;

    NSS_LOCK();

    ret = LsaNssCommonGroupGetgrnam(
              &pLsaBackend->lsaConnection,
              pszGroupName,
              pResultGroup,
              pszBuf,
              bufLen,
              pErrorNumber);

    NSS_UNLOCK();

    if (ret == NSS_STATUS_SUCCESS)
    {
        if (pResultGroup)
        {
            pXbyYArgs->returnval = pXbyYArgs->buf.result;
        }
        else
        {
            pXbyYArgs->returnval = pszBuf;
#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN
            pXbyYArgs->returnlen = strlen(pszBuf);
#else
            /* The pXbyYArgs->buf.result was NULL indicating this is NSS2/NSCD
             * Cast the nss_XbyY_args_t to a NSS2 compatible version.
             * NOTE: This is only required if we build on Solaris 8
             */
            ((nss_XbyY_nss2_args_t *)pXbyYArgs)->returnlen = strlen(pszBuf);
#endif
        }
    }
    else if (ret == NSS_STATUS_TRYAGAIN  && err == ERANGE)
    {
        pXbyYArgs->erange = 1;
        /* Solaris 8 will call again with the same buffer size if tryagain
         * is returned.
         */
        ret = NSS_STATUS_UNAVAIL;
    }
    else if (ret == NSS_STATUS_UNAVAIL && err == ECONNREFUSED)
    {
        /* Librestart on Solaris does not like it when getpwnam_r returns
         * ECONNREFUSED. So instead, we'll treat this case like the user
         * was not found (0 for errno but NULL for result).
         */
        errno = 0;
    }
    else
    {
        errno = err;
    }

    return ret;
}
Ejemplo n.º 11
0
static
NSS_STATUS
LsaNssSolarisGroupGetgrent(
    nss_backend_t* pBackend,
    void* pArgs
)
{
    PLSA_NSS_GROUP_BACKEND    pLsaBackend = (PLSA_NSS_GROUP_BACKEND) pBackend;
    PLSA_ENUMGROUPS_STATE     pEnumGroupsState = &pLsaBackend->enumGroupsState;
    nss_XbyY_args_t*          pXbyYArgs = (nss_XbyY_args_t*) pArgs;
    struct group*             pResultGroup = pXbyYArgs->buf.result;
    char *                    pszBuf = pXbyYArgs->buf.buffer;
    size_t                    bufLen = pXbyYArgs->buf.buflen;
    int                       err = 0;
    int*                      pErrorNumber = &err;
    int                       ret = NSS_STATUS_NOTFOUND;

    NSS_LOCK();

    ret = LsaNssCommonGroupGetgrent(
              &pLsaBackend->lsaConnection,
              pEnumGroupsState,
              pResultGroup,
              pszBuf,
              bufLen,
              pErrorNumber);

    NSS_UNLOCK();

    if (ret == NSS_STATUS_SUCCESS)
    {
        if (pResultGroup)
        {
            pXbyYArgs->returnval = pXbyYArgs->buf.result;
        }
        else
        {
            pXbyYArgs->returnval = pszBuf;
#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN
            pXbyYArgs->returnlen = strlen(pszBuf);
#else
            /* The pXbyYArgs->buf.result was NULL indicating this is NSS2/NSCD
             * Cast the nss_XbyY_args_t to a NSS2 compatible version.
             * NOTE: This is only required if we build on Solaris 8
             */
            ((nss_XbyY_nss2_args_t *)pXbyYArgs)->returnlen = strlen(pszBuf);
#endif
        }
    }
    else if (ret == NSS_STATUS_TRYAGAIN  && err == ERANGE)
    {
        pXbyYArgs->erange = 1;
        /* Solaris 8 will call again with the same buffer size if tryagain
         * is returned.
         */
        ret = NSS_STATUS_UNAVAIL;
    }
    else
    {
        errno = err;
    }

    return ret;
}