226
232
read_hostent_nextonempty(hostentfp,AF_INET,result,buffer,buflen,errnop,h_errnop));
229
enum nss_status _nss_ldap_endhostent(void)
235
/* close the stream opened with sethostent() above */
236
nss_status_t _nss_ldap_endhostent(void)
231
238
NSS_ENDENT(hostentfp);
241
#endif /* NSS_FLAVOUR_GLIBC */
243
#ifdef NSS_FLAVOUR_SOLARIS
245
struct nss_ldap_hosts_backend
247
nss_backend_op_t *ops;
252
#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN
254
static nss_status_t read_hoststring(TFILE *fp,nss_XbyY_args_t *args,int erronempty)
256
struct hostent result;
261
/* read the hostent */
263
retv=read_hostent_erronempty(fp,NSS_ARGS(args)->key.hostaddr.type,&result,NSS_ARGS(args)->buf.buffer,args->buf.buflen,&errno,&(NSS_ARGS(args)->h_errno));
265
retv=read_hostent_nextonempty(fp,NSS_ARGS(args)->key.hostaddr.type,&result,NSS_ARGS(args)->buf.buffer,args->buf.buflen,&errno,&(NSS_ARGS(args)->h_errno));
266
if (retv!=NSS_STATUS_SUCCESS)
268
/* allocate a temporary buffer */
269
buflen=args->buf.buflen;
270
buffer=(char *)malloc(buflen);
271
/* build the formatted string */
272
/* FIXME: implement proper buffer size checking */
273
if (result.h_addr_list)
276
(void)memcpy(&in.s_addr,result.h_addr_list[0],sizeof(in.s_addr));
277
sprintf(buffer,"%s %s",inet_ntoa(in),result.h_name);
278
if (result.h_aliases)
281
for (j=0;result.h_aliases[j];j++)
284
strcat(buffer,result.h_aliases[j]);
287
for (i=1;result.h_addr_list[i];i++)
289
(void)memcpy(&in.s_addr,result.h_addr_list[i],sizeof(in.s_addr));
291
strcat(buffer,inet_ntoa(in));
293
strcat(buffer,result.h_name);
294
/* TODO: aliases only supplied to the first address */
298
/* copy the result back to the result buffer and free the temporary one */
299
strcpy(NSS_ARGS(args)->buf.buffer,buffer);
301
NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.buffer;
302
NSS_ARGS(args)->returnlen=strlen(NSS_ARGS(args)->buf.buffer);
303
return NSS_STATUS_SUCCESS;
306
#define READ_RESULT_ERRONEMPTY(fp) \
307
NSS_ARGS(args)->buf.result? \
308
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,&errno,&(NSS_ARGS(args)->h_errno)): \
309
read_hoststring(fp,args,1); \
310
if ((NSS_ARGS(args)->buf.result)&&(retv==NSS_STATUS_SUCCESS)) \
311
NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result;
313
#define READ_RESULT_NEXTONEMPTY(fp) \
314
NSS_ARGS(args)->buf.result? \
315
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,&errno,&(NSS_ARGS(args)->h_errno)): \
316
read_hoststring(fp,args,0); \
317
if ((NSS_ARGS(args)->buf.result)&&(retv==NSS_STATUS_SUCCESS)) \
318
NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result;
320
#else /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */
322
#define READ_RESULT_ERRONEMPTY(fp) \
323
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,&errno,&(NSS_ARGS(args)->h_errno)); \
324
if (retv==NSS_STATUS_SUCCESS) \
325
NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result;
327
#define READ_RESULT_NEXTONEMPTY(fp) \
328
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,&errno,&(NSS_ARGS(args)->h_errno)); \
329
if (retv==NSS_STATUS_SUCCESS) \
330
NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result;
332
#endif /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */
334
/* hack to set the correct errno and h_errno */
335
#define h_errnop &(NSS_ARGS(args)->h_errno)
337
static nss_status_t hosts_gethostbyname(nss_backend_t UNUSED(*be),void *args)
339
NSS_BYNAME(NSLCD_ACTION_HOST_BYNAME,
340
NSS_ARGS(args)->key.name,
341
READ_RESULT_ERRONEMPTY(fp));
344
static nss_status_t hosts_gethostbyaddr(nss_backend_t UNUSED(*be),void *args)
346
NSS_BYGEN(NSLCD_ACTION_HOST_BYADDR,
347
WRITE_ADDRESS(fp,NSS_ARGS(args)->key.hostaddr.type,NSS_ARGS(args)->key.hostaddr.len,NSS_ARGS(args)->key.hostaddr.addr),
348
READ_RESULT_ERRONEMPTY(fp));
351
static nss_status_t hosts_sethostent(nss_backend_t *be,void UNUSED(*args))
353
NSS_SETENT(LDAP_BE(be)->fp);
356
static nss_status_t hosts_gethostent(nss_backend_t *be,void *args)
358
NSS_GETENT(LDAP_BE(be)->fp,NSLCD_ACTION_HOST_ALL,
359
READ_RESULT_NEXTONEMPTY(LDAP_BE(be)->fp));
362
static nss_status_t hosts_endhostent(nss_backend_t *be,void UNUSED(*args))
364
NSS_ENDENT(LDAP_BE(be)->fp);
367
static nss_backend_op_t hosts_ops[]={
376
nss_backend_t *_nss_ldap_hosts_constr(const char UNUSED(*db_name),
377
const char UNUSED(*src_name),const char UNUSED(*cfg_args))
379
return nss_ldap_constructor(hosts_ops,sizeof(hosts_ops));
382
#endif /* NSS_FLAVOUR_SOLARIS */