Patch for solaris 2.x to provide nsswitch wins resolution
Steven Tamm
steven.tamm at ixos.com
Sat Dec 14 00:45:02 GMT 2002
Sorry if this is not the right forum, but the documents on the website kind
of implied I should send this to the list.
I needed to get wins resolution added on Solaris to nsswitch specifically
for gethostbyname. The problem was that libnss_wins.so didn't include the
solaris wrapper and that libnss_winbind.so didn't include gethostbyname.
Here is a patch off of 2.2.7a that solves both issues (I'm not sure about
the #if SUN).
The patch to libnss_wins.so is relatively straightforward; it just adds the
required constructor for solaris to nsswitch/wins.c.
The patch to libnss_winbind.so is not so straightforward, mostly because the
implementation of _nss_winbind_gethostname_r doesn't appear to work on
linux. I only have darwin and solaris, I apologize.
It also seems that gethostname was omitted "on purpose" from winbind, but
that may just be a difference in timing between winbindd and libnss.
Thanks,
-Steven
diff -r -c samba-2.2.7a/source/nsswitch/winbind_nss.c
samba-2.2.7a_sol/source/nsswitch/winbind_nss.c
*** samba-2.2.7a/source/nsswitch/winbind_nss.c Wed Jul 17 06:47:50 2002
--- samba-2.2.7a_sol/source/nsswitch/winbind_nss.c Fri Dec 13 14:12:02
2002
***************
*** 1332,1335 ****
--- 1332,1404 ----
return ret;
}
+
+ static NSS_STATUS fill_hostent(struct hostent *result,
+ fstring winsresp,
+ char **buffer, size_t *buflen)
+ {
+ unsigned long host_addr;
+ host_addr = inet_addr(winsresp);
+ if (host_addr == 0)
+ {
+ return NSS_STATUS_NOTFOUND;
+ }
+
+ bzero(result, sizeof(struct hostent));
+ result->h_name = strdup(winsresp);
+ result->h_aliases = (char**)malloc(sizeof(char*));
+ result->h_aliases[0] = NULL;
+ result->h_addrtype = AF_INET;
+ result->h_length = 4; /* Handle ipv6 later */
+ result->h_addr_list = (char**) malloc(sizeof(char*) << 1);
+ result->h_addr_list[0] = (char*) malloc(sizeof host_addr);
+ result->h_addr_list[1] = NULL;
+ memcpy(result->h_addr_list[0], &host_addr, sizeof(host_addr));
+ return NSS_STATUS_SUCCESS;
+ }
+
+ /* Return passwd struct from username */
+
+ NSS_STATUS
+ _nss_winbind_gethostname_r(const char *name, struct hostent *result,
+ char *buffer,
+ size_t buflen, int *errnop)
+ {
+ NSS_STATUS ret;
+ static struct winbindd_response response;
+ struct winbindd_request request;
+
+ #ifdef DEBUG_NSS
+ fprintf(stderr, "[%5d]: gethostname %s\n", getpid(), name);
+ #endif
+
+ /* Call for the first time */
+
+ ZERO_STRUCT(response);
+ ZERO_STRUCT(request);
+
+ strncpy(request.data.winsreq, name,
+ sizeof(request.data.winsreq) - 1);
+ request.data.winsreq
+ [sizeof(request.data.winsreq) - 1] = '\0';
+
+ ret = winbindd_request(WINBINDD_WINS_BYNAME, &request, &response);
+
+ if (ret == NSS_STATUS_SUCCESS) {
+ ret = fill_hostent(result, response.data.winsresp,
+ &buffer,
+ (int *)&buflen);
+
+ if (ret == NSS_STATUS_TRYAGAIN) {
+ *errnop = errno = ERANGE;
+ return ret;
+ }
+ }
+
+ free_response(&response);
+ return ret;
+ }
+
+
+
#endif
diff -r -c samba-2.2.7a/source/nsswitch/winbind_nss_config.h
samba-2.2.7a_sol/source/nsswitch/winbind_nss_config.h
*** samba-2.2.7a/source/nsswitch/winbind_nss_config.h Tue Dec 10 06:58:15
2002
--- samba-2.2.7a_sol/source/nsswitch/winbind_nss_config.h Thu Dec 12
20:25:28 2002
***************
*** 91,96 ****
--- 91,100 ----
struct group *result, char *buffer,
size_t buflen, int *errnop);
+ NSS_STATUS _nss_winbind_gethostname_r(const char *name,
+ struct hostent *result, char *buffer,
+ size_t buflen, int *errnop);
+
/* I'm trying really hard not to include anything from smb.h with the
result of some silly looking redeclaration of structures. */
diff -r -c samba-2.2.7a/source/nsswitch/winbind_nss_solaris.c
samba-2.2.7a_sol/source/nsswitch/winbind_nss_solaris.c
*** samba-2.2.7a/source/nsswitch/winbind_nss_solaris.c Tue Apr 30 06:27:23
2002
--- samba-2.2.7a_sol/source/nsswitch/winbind_nss_solaris.c Thu Dec 12
20:30:38 2002
***************
*** 278,283 ****
--- 278,349 ----
return be;
}
+ /*****************************************************************
+ HOSTS database backend
+ *****************************************************************/
+
+
+ static NSS_STATUS
+ _nss_winbind_gethostname_solwrap(nss_backend_t* be, void* args)
+ {
+ NSS_STATUS ret;
+ struct hostent* result = (struct hostent*)
NSS_ARGS(args)->buf.result;
+
+ NSS_DEBUG("_nss_winbind_gethostname_solwrap");
+ ret = _nss_winbind_gethostname_r(NSS_ARGS(args)->key.name,
+ result,
+ NSS_ARGS(args)->buf.buffer,
+ NSS_ARGS(args)->buf.buflen,
+ &NSS_ARGS(args)->erange);
+
+ if(ret == NSS_STATUS_SUCCESS)
+ NSS_ARGS(args)->returnval = (void*) result;
+
+ return ret;
+ }
+
+ static NSS_STATUS
+ _nss_winbind_gethostaddr_solwrap(nss_backend_t* be, void* args)
+ {
+ NSS_DEBUG("_nss_winbind_gethostaddr");
+ return NSS_STATUS_NOTFOUND;
+ }
+
+ static NSS_STATUS
+ _nss_winbind_hosts_destr (nss_backend_t* be, void* args)
+ {
+ SAFE_FREE(be);
+ NSS_DEBUG("_nss_winbind_hosts_destr");
+ return NSS_STATUS_SUCCESS;
+ }
+
+ static nss_backend_op_t hosts_ops[] =
+ {
+ _nss_winbind_hosts_destr,
+ NULL,
+ NULL,
+ NULL,
+ _nss_winbind_gethostname_solwrap,
+ _nss_winbind_gethostaddr_solwrap
+ };
+
+ nss_backend_t*
+ _nss_winbind_hosts_constr (const char* db_name,
+ const char* src_name,
+ const char* cfg_args)
+ {
+ nss_backend_t* be;
+
+ if(!(be = (nss_backend_t*) malloc(sizeof(nss_backend_t))) )
+ return NULL;
+
+ be->ops = hosts_ops;
+ be->n_ops = sizeof(hosts_ops) / sizeof(nss_backend_op_t);
+
+ NSS_DEBUG("Initialized nss_winbind hosts backend");
+ return be;
+ }
+
#endif /* SUN_NSS */
diff -r -c samba-2.2.7a/source/nsswitch/wins.c
samba-2.2.7a_sol/source/nsswitch/wins.c
*** samba-2.2.7a/source/nsswitch/wins.c Sun Jun 2 15:19:19 2002
--- samba-2.2.7a_sol/source/nsswitch/wins.c Fri Dec 13 14:07:31 2002
***************
*** 334,339 ****
--- 334,402 ----
return
_nss_wins_gethostbyname_r(name,he,buffer,buflen,errnop,h_errnop);
}
+ #if SUNOS5
+ #define NSS_ARGS(args) ((nss_XbyY_args_t *)args)
+ static NSS_STATUS
+ _nss_wins_gethostbyname_solwrap(nss_backend_t* be, void* args)
+ {
+ NSS_STATUS ret;
+ struct hostent* result = (struct hostent*)
NSS_ARGS(args)->buf.result;
+
+ ret = _nss_wins_gethostbyname_r (NSS_ARGS(args)->key.name,
+ result,
+ NSS_ARGS(args)->buf.buffer,
+ NSS_ARGS(args)->buf.buflen,
+ &NSS_ARGS(args)->erange,
+ NULL);
+
+ if(ret == NSS_STATUS_SUCCESS)
+ NSS_ARGS(args)->returnval = (void*) result;
+
+ return ret;
+ }
+
+ static NSS_STATUS
+ _nss_wins_gethostbyaddr_solwrap(nss_backend_t* be, void* args)
+ {
+ return NSS_STATUS_NOTFOUND;
+ }
+
+ static NSS_STATUS
+ _nss_wins_hosts_destr (nss_backend_t* be, void* args)
+ {
+ SAFE_FREE(be);
+ return NSS_STATUS_SUCCESS;
+ }
+
+ static nss_backend_op_t hosts_ops[] =
+ {
+ _nss_wins_hosts_destr,
+ NULL,
+ NULL,
+ NULL,
+ _nss_wins_gethostbyname_solwrap,
+ _nss_wins_gethostbyaddr_solwrap
+ };
+
+ nss_backend_t*
+ _nss_wins_hosts_constr (const char* db_name,
+ const char* src_name,
+ const char* cfg_args)
+ {
+ nss_backend_t* be;
+
+ if(!(be = (nss_backend_t*) malloc(sizeof(nss_backend_t))) )
+ return NULL;
+
+ be->ops = hosts_ops;
+ be->n_ops = sizeof(hosts_ops) / sizeof(nss_backend_op_t);
+
+ return be;
+ }
+
+
#endif
+
+ #endif
More information about the samba-technical
mailing list