63
67
/* thread-local file pointer to an ongoing request */
64
68
static __thread TFILE *etherentfp;
66
enum nss_status _nss_ldap_setetherent(int UNUSED(stayopen))
70
/* open a connection to read all ether entries */
71
nss_status_t _nss_ldap_setetherent(int UNUSED(stayopen))
68
73
NSS_SETENT(etherentfp);
71
enum nss_status _nss_ldap_getetherent_r(
76
/* read a single ethernet entry from the stream */
77
nss_status_t _nss_ldap_getetherent_r(
72
78
struct etherent *result,
73
79
char *buffer,size_t buflen,int *errnop)
76
82
read_etherent(etherentfp,result,buffer,buflen,errnop));
79
enum nss_status _nss_ldap_endetherent(void)
85
/* close the stream opened with setetherent() above */
86
nss_status_t _nss_ldap_endetherent(void)
81
88
NSS_ENDENT(etherentfp);
91
#endif /* NSS_FLAVOUR_GLIBC */
93
#ifdef NSS_FLAVOUR_SOLARIS
95
#ifndef NSS_BUFLEN_ETHERS
96
#define NSS_BUFLEN_ETHERS 1024
97
#endif /* NSS_BUFLEN_ETHERS */
99
#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN
101
static nss_status_t read_etherstring(TFILE *fp,nss_XbyY_args_t *args)
103
struct etherent result;
107
/* read the etherent into a temporary buffer */
108
buffer=(char *)malloc(args->buf.buflen);
110
return NSS_STATUS_UNAVAIL;
111
retv=read_etherent(fp,&result,buffer,args->buf.buflen,&errno);
112
if (retv!=NSS_STATUS_SUCCESS)
117
/* make a string representation */
118
res=snprintf(args->buf.buffer,args->buf.buflen,
119
"%s %s",ether_ntoa(&result.e_addr),result.e_name);
121
if ((res<0)||(res>=args->buf.buflen))
122
return NSS_STATUS_TRYAGAIN;
123
NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.buffer;
124
NSS_ARGS(args)->returnlen=strlen(NSS_ARGS(args)->buf.buffer);
125
return NSS_STATUS_SUCCESS;
128
#define READ_RESULT(fp) \
129
NSS_ARGS(args)->buf.result? \
130
read_etherent(fp,(struct etherent *)NSS_ARGS(args)->buf.result,NSS_ARGS(args)->buf.buffer,NSS_ARGS(args)->buf.buflen,&errno): \
131
read_etherstring(fp,args); \
132
if ((NSS_ARGS(args)->buf.result)&&(retv==NSS_STATUS_SUCCESS)) \
133
NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result;
135
#else /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */
137
#define READ_RESULT(fp) \
138
read_etherent(fp,(struct etherent *)NSS_ARGS(args)->buf.result,NSS_ARGS(args)->buf.buffer,NSS_ARGS(args)->buf.buflen,&errno); \
139
if (retv==NSS_STATUS_SUCCESS) \
140
NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result;
142
#endif /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */
144
/* map a hostname to the corresponding ethernet address */
145
static nss_status_t ethers_gethostton(nss_backend_t UNUSED(*be),void *args)
147
NSS_BYNAME(NSLCD_ACTION_ETHER_BYNAME,
148
NSS_ARGS(args)->key.name,
152
/* map an ethernet address to the corresponding hostname */
153
static nss_status_t ethers_getntohost(nss_backend_t UNUSED(*be),void *args)
155
struct ether_addr *addr=(struct ether_addr *)(NSS_ARGS(args)->key.ether);
156
NSS_BYTYPE(NSLCD_ACTION_ETHER_BYETHER,
161
static nss_status_t ethers_destructor(nss_backend_t *be,void UNUSED(*args))
164
return NSS_STATUS_SUCCESS;
167
static nss_backend_op_t ethers_ops[]={
173
nss_backend_t *_nss_ldap_ethers_constr(const char UNUSED(*db_name),
174
const char UNUSED(*src_name),const char UNUSED(*cfg_args))
177
if (!(be=(nss_backend_t *)malloc(sizeof(*be))))
180
be->n_ops=sizeof(ethers_ops)/sizeof(nss_backend_op_t);
184
#endif /* NSS_FLAVOUR_SOLARIS */