VERSION: Disable GIT_SNAPSHOT for the 4.11.0rc1 release...
[samba.git] / nsswitch / winbind_nss_solaris.c
index 5fb37643ce2c92cfe55a87d96f9bf114f4fba954..495854fb9f32bf37d1e355e9278a76334c2e8749 100644 (file)
 
 #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
@@ -72,17 +77,6 @@ struct nss_groupsbymem {
 
 #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");
@@ -254,6 +248,9 @@ _nss_winbind_getgrnam_solwrap(nss_backend_t* be, void* args)
        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;
 }
 
@@ -273,6 +270,9 @@ _nss_winbind_getgrgid_solwrap(nss_backend_t* be, void* args)
        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;
 }
 
@@ -479,14 +479,15 @@ static NSS_STATUS
 _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...
 
@@ -510,7 +511,8 @@ _nss_winbind_ipnodes_getbyname(nss_backend_t* be, void *args)
        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);
        }
@@ -523,17 +525,19 @@ static NSS_STATUS
 _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);
        }
@@ -546,14 +550,15 @@ static NSS_STATUS
 _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) {
@@ -572,7 +577,8 @@ _nss_winbind_hosts_getbyaddr(nss_backend_t* be, void *args)
                 ((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);