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; ret = LsaNssCommonGroupGetgrnam( &pLsaBackend->lsaConnection, pszGroupName, pResultGroup, pszBuf, bufLen, pErrorNumber); if (ret == NSS_STATUS_SUCCESS) { pXbyYArgs->returnval = pXbyYArgs->buf.result; } 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; }
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; }
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; }