diff options
author | Arthur de Jong <arthur@arthurdejong.org> | 2012-09-14 23:08:48 +0200 |
---|---|---|
committer | Arthur de Jong <arthur@arthurdejong.org> | 2012-09-14 23:08:48 +0200 |
commit | 9d1bfe50eeb5d9beed38186834dfa267945e8996 (patch) | |
tree | 1a668199c832a96c0a912579e32e08f8d2627ba5 /nss | |
parent | 07e9509a375c80969fe0a69b8887dacdc17d35b8 (diff) |
fix host name lookups for Solaris (tested with Solaris 10)
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/nss-pam-ldapd@1766 ef36b2f9-881f-0410-afb5-c4e39611909c
Diffstat (limited to 'nss')
-rw-r--r-- | nss/hosts.c | 127 |
1 files changed, 52 insertions, 75 deletions
diff --git a/nss/hosts.c b/nss/hosts.c index 56b035f..3b9bd20 100644 --- a/nss/hosts.c +++ b/nss/hosts.c @@ -242,110 +242,87 @@ nss_status_t _nss_ldap_endhostent(void) #ifdef NSS_FLAVOUR_SOLARIS -struct nss_ldap_hosts_backend -{ - nss_backend_op_t *ops; - int n_ops; - TFILE *fp; -}; - #ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN - -static nss_status_t read_hoststring(TFILE *fp,nss_XbyY_args_t *args,int erronempty) +static nss_status_t read_hoststring(TFILE *fp,int af,nss_XbyY_args_t *args,int erronempty) { struct hostent result; - nss_status_t retv; - char *buffer; - size_t buflen; - int i; - /* read the hostent */ + char buffer[NSS_BUFLEN_HOSTS]; + int retv; + int i,j; + /* read the result entry */ if (erronempty) - retv=read_hostent_erronempty(fp,NSS_ARGS(args)->key.hostaddr.type,&result,NSS_ARGS(args)->buf.buffer,args->buf.buflen,&NSS_ARGS(args)->erange,&(NSS_ARGS(args)->h_errno)); + retv=read_hostent_erronempty(fp,af,&result,buffer,sizeof(buffer),&args->erange,&args->h_errno); else - retv=read_hostent_nextonempty(fp,NSS_ARGS(args)->key.hostaddr.type,&result,NSS_ARGS(args)->buf.buffer,args->buf.buflen,&NSS_ARGS(args)->erange,&(NSS_ARGS(args)->h_errno)); + retv=read_hostent_nextonempty(fp,af,&result,buffer,sizeof(buffer),&args->erange,&args->h_errno); if (retv!=NSS_STATUS_SUCCESS) return retv; - /* allocate a temporary buffer */ - buflen=args->buf.buflen; - buffer=(char *)malloc(buflen); - /* build the formatted string */ - /* FIXME: implement proper buffer size checking */ - if (result.h_addr_list) + /* build the formatted string, one line per address */ + args->buf.buffer[0]='\0'; + if (result.h_addr_list!=NULL) { - struct in_addr in; - (void)memcpy(&in.s_addr,result.h_addr_list[0],sizeof(in.s_addr)); - sprintf(buffer,"%s %s",inet_ntoa(in),result.h_name); - if (result.h_aliases) + for (i=0;result.h_addr_list[i];i++) { - int j; - for (j=0;result.h_aliases[j];j++) + if (i>0) + strlcat(args->buf.buffer,"\n",args->buf.buflen); + snprintf(args->buf.buffer,args->buf.buflen-strlen(args->buf.buffer)-1, + "%s %s",inet_ntoa(*((struct in_addr *)result.h_addr_list[i])),result.h_name); + /* add aliases for first line only */ + if ((i==0)&&(result.h_aliases)) { - strcat(buffer," "); - strcat(buffer,result.h_aliases[j]); + for (j=0;result.h_aliases[j];j++) + { + strlcat(args->buf.buffer," ",args->buf.buflen); + strlcat(args->buf.buffer,result.h_aliases[j],args->buf.buflen); + } } } - for (i=1;result.h_addr_list[i];i++) - { - (void)memcpy(&in.s_addr,result.h_addr_list[i],sizeof(in.s_addr)); - strcat(buffer,"\n"); - strcat(buffer,inet_ntoa(in)); - strcat(buffer," "); - strcat(buffer,result.h_name); - /* TODO: aliases only supplied to the first address */ - /* need review */ - } } - /* copy the result back to the result buffer and free the temporary one */ - strcpy(NSS_ARGS(args)->buf.buffer,buffer); - free(buffer); - NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.buffer; - NSS_ARGS(args)->returnlen=strlen(NSS_ARGS(args)->buf.buffer); + if (strlen(args->buf.buffer)>=args->buf.buflen-1) + return NSS_STR_PARSE_PARSE; + args->returnval=args->buf.buffer; + args->returnlen=strlen(args->returnval); return NSS_STATUS_SUCCESS; } +#endif /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ -#define READ_RESULT_ERRONEMPTY(fp) \ - NSS_ARGS(args)->buf.result? \ - read_hostent_erronempty(fp,NSS_ARGS(args)->key.hostaddr.type,(struct hostent *)NSS_ARGS(args)->buf.result,NSS_ARGS(args)->buf.buffer,NSS_ARGS(args)->buf.buflen,&NSS_ARGS(args)->erange,&(NSS_ARGS(args)->h_errno)): \ - read_hoststring(fp,args,1); \ - if ((NSS_ARGS(args)->buf.result)&&(retv==NSS_STATUS_SUCCESS)) \ - NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result; - -#define READ_RESULT_NEXTONEMPTY(fp) \ - NSS_ARGS(args)->buf.result? \ - read_hostent_nextonempty(fp,NSS_ARGS(args)->key.hostaddr.type,(struct hostent *)NSS_ARGS(args)->buf.result,NSS_ARGS(args)->buf.buffer,NSS_ARGS(args)->buf.buflen,&NSS_ARGS(args)->erange,&(NSS_ARGS(args)->h_errno)): \ - read_hoststring(fp,args,0); \ - if ((NSS_ARGS(args)->buf.result)&&(retv==NSS_STATUS_SUCCESS)) \ - NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result; - -#else /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ - -#define READ_RESULT_ERRONEMPTY(fp) \ - read_hostent_erronempty(fp,NSS_ARGS(args)->key.hostaddr.type,(struct hostent *)NSS_ARGS(args)->buf.result,NSS_ARGS(args)->buf.buffer,NSS_ARGS(args)->buf.buflen,&NSS_ARGS(args)->erange,&(NSS_ARGS(args)->h_errno)); \ - if (retv==NSS_STATUS_SUCCESS) \ - NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result; - -#define READ_RESULT_NEXTONEMPTY(fp) \ - read_hostent_nextonempty(fp,NSS_ARGS(args)->key.hostaddr.type,(struct hostent *)NSS_ARGS(args)->buf.result,NSS_ARGS(args)->buf.buffer,NSS_ARGS(args)->buf.buflen,&NSS_ARGS(args)->erange,&(NSS_ARGS(args)->h_errno)); \ - if (retv==NSS_STATUS_SUCCESS) \ - NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result; - +static nss_status_t read_result(TFILE *fp,int af,nss_XbyY_args_t *args,int erronempty) +{ + nss_status_t retv; +#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN + /* try to return in string format if requested */ + if (args->buf.result==NULL) + return read_hoststring(fp,af,args,erronempty); #endif /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ + /* read the hostent */ + if (erronempty) + retv=read_hostent_erronempty(fp,af, + args->buf.result,args->buf.buffer,args->buf.buflen, + &args->erange,&args->h_errno); + else + retv=read_hostent_nextonempty(fp,af, + args->buf.result,args->buf.buffer,args->buf.buflen, + &args->erange,&args->h_errno); + if (retv!=NSS_STATUS_SUCCESS) + return retv; + args->returnval=args->buf.result; + return NSS_STATUS_SUCCESS; +} -/* hack to set the correct errno and h_errno */ +/* hack to set the correct h_errno */ #define h_errnop &(NSS_ARGS(args)->h_errno) static nss_status_t hosts_gethostbyname(nss_backend_t UNUSED(*be),void *args) { NSS_BYNAME(NSLCD_ACTION_HOST_BYNAME, NSS_ARGS(args)->key.name, - READ_RESULT_ERRONEMPTY(fp)); + read_result(fp,AF_INET,args,1)); } static nss_status_t hosts_gethostbyaddr(nss_backend_t UNUSED(*be),void *args) { NSS_BYGEN(NSLCD_ACTION_HOST_BYADDR, WRITE_ADDRESS(fp,NSS_ARGS(args)->key.hostaddr.type,NSS_ARGS(args)->key.hostaddr.len,NSS_ARGS(args)->key.hostaddr.addr), - READ_RESULT_ERRONEMPTY(fp)); + read_result(fp,NSS_ARGS(args)->key.hostaddr.type,args,1)); } static nss_status_t hosts_sethostent(nss_backend_t *be,void UNUSED(*args)) @@ -356,7 +333,7 @@ static nss_status_t hosts_sethostent(nss_backend_t *be,void UNUSED(*args)) static nss_status_t hosts_gethostent(nss_backend_t *be,void *args) { NSS_GETENT(LDAP_BE(be)->fp,NSLCD_ACTION_HOST_ALL, - READ_RESULT_NEXTONEMPTY(LDAP_BE(be)->fp)); + read_result(LDAP_BE(be)->fp,AF_INET,args,0)); } static nss_status_t hosts_endhostent(nss_backend_t *be,void UNUSED(*args)) |