#undef DEVELOPER
+
#include "winbind_client.h"
#include <stdlib.h>
#include <sys/types.h>
#include <sys/param.h>
#include <string.h>
#include <pwd.h>
-#include "includes.h"
#include <syslog.h>
+
#if !defined(HPUX)
#include <sys/syslog.h>
#endif /*hpux*/
#define NSS_DEBUG(str) ;
#endif
+#if !defined(SMB_MALLOC_P)
+#define SMB_MALLOC_P(type) (type *)malloc(sizeof(type))
+#endif
+
#define NSS_ARGS(args) ((nss_XbyY_args_t *)args)
#ifdef HPUX
#endif /* HPUX */
-#define make_pwent_str(dest, src) \
-{ \
- if((dest = get_static(buffer, buflen, strlen(src)+1)) == NULL) \
- { \
- *errnop = ERANGE; \
- NSS_DEBUG("ERANGE error"); \
- return NSS_STATUS_TRYAGAIN; \
- } \
- strcpy(dest, src); \
-}
-
static NSS_STATUS _nss_winbind_setpwent_solwrap (nss_backend_t* be, void* args)
{
NSS_DEBUG("_nss_winbind_setpwent_solwrap");
if(ret == NSS_STATUS_SUCCESS)
NSS_ARGS(args)->returnval = (void*) result;
+ if (NSS_ARGS(args)->erange == ERANGE && ret == NSS_STATUS_TRYAGAIN)
+ return NSS_STATUS_UNAVAIL;
+
return ret;
}
if(ret == NSS_STATUS_SUCCESS)
NSS_ARGS(args)->returnval = (void*) result;
+ if (NSS_ARGS(args)->erange == ERANGE && ret == NSS_STATUS_TRYAGAIN)
+ return NSS_STATUS_UNAVAIL;
+
return ret;
}
_nss_winbind_ipnodes_getbyname(nss_backend_t* be, void *args)
{
nss_XbyY_args_t *argp = (nss_XbyY_args_t*) args;
- struct winbindd_response response;
- struct winbindd_request request;
+ struct winbindd_request request = {
+ .wb_flags = WBFLAG_FROM_NSS,
+ };
+ struct winbindd_response response = {
+ .length = 0,
+ };
NSS_STATUS ret;
int af;
- ZERO_STRUCT(response);
- ZERO_STRUCT(request);
-
/* I assume there that AI_ADDRCONFIG cases are handled in nss
frontend code, at least it seems done so in solaris...
strncpy(request.data.winsreq, argp->key.name, sizeof(request.data.winsreq) - 1);
request.data.winsreq[sizeof(request.data.winsreq) - 1] = '\0';
- if( (ret = winbindd_request_response(WINBINDD_WINS_BYNAME, &request, &response))
+ if( (ret = winbindd_request_response(NULL, WINBINDD_WINS_BYNAME,
+ &request, &response))
== NSS_STATUS_SUCCESS ) {
ret = parse_response(af, argp, &response);
}
_nss_winbind_hosts_getbyname(nss_backend_t* be, void *args)
{
nss_XbyY_args_t *argp = (nss_XbyY_args_t*) args;
- struct winbindd_response response;
- struct winbindd_request request;
+ struct winbindd_request request = {
+ .wb_flags = WBFLAG_FROM_NSS,
+ };
+ struct winbindd_response response = {
+ .length = 0,
+ };
NSS_STATUS ret;
- ZERO_STRUCT(response);
- ZERO_STRUCT(request);
-
strncpy(request.data.winsreq, argp->key.name, sizeof(request.data.winsreq) - 1);
request.data.winsreq[sizeof(request.data.winsreq) - 1] = '\0';
- if( (ret = winbindd_request_response(WINBINDD_WINS_BYNAME, &request, &response))
+ if( (ret = winbindd_request_response(NULL, WINBINDD_WINS_BYNAME,
+ &request, &response))
== NSS_STATUS_SUCCESS ) {
ret = parse_response(AF_INET, argp, &response);
}
_nss_winbind_hosts_getbyaddr(nss_backend_t* be, void *args)
{
NSS_STATUS ret;
- struct winbindd_response response;
- struct winbindd_request request;
+ struct winbindd_request request = {
+ .wb_flags = WBFLAG_FROM_NSS,
+ };
+ struct winbindd_response response = {
+ .length = 0,
+ };
nss_XbyY_args_t *argp = (nss_XbyY_args_t *)args;
const char *p;
- ZERO_STRUCT(response);
- ZERO_STRUCT(request);
-
#if defined(AF_INET6)
/* winbindd currently does not resolve IPv6 */
if(argp->key.hostaddr.type == AF_INET6) {
((unsigned char *)argp->key.hostaddr.addr)[3]);
#endif
- ret = winbindd_request_response(WINBINDD_WINS_BYIP, &request, &response);
+ ret = winbindd_request_response(NULL, WINBINDD_WINS_BYIP,
+ &request, &response);
if( ret == NSS_STATUS_SUCCESS) {
parse_response(argp->key.hostaddr.type, argp, &response);