57
64
/* thread-local file pointer to an ongoing request */
58
65
static __thread TFILE *spentfp;
60
enum nss_status _nss_ldap_setspent(int UNUSED(stayopen))
67
/* start listing all shadow users */
68
nss_status_t _nss_ldap_setspent(int UNUSED(stayopen))
62
70
NSS_SETENT(spentfp);
65
enum nss_status _nss_ldap_getspent_r(struct spwd *result,char *buffer,size_t buflen,int *errnop)
73
/* return a single shadow entry read from the stream */
74
nss_status_t _nss_ldap_getspent_r(
76
char *buffer,size_t buflen,int *errnop)
67
78
NSS_GETENT(spentfp,NSLCD_ACTION_SHADOW_ALL,
68
79
read_spwd(spentfp,result,buffer,buflen,errnop));
71
enum nss_status _nss_ldap_endspent(void)
82
/* close the stream opened by setspent() above */
83
nss_status_t _nss_ldap_endspent(void)
73
85
NSS_ENDENT(spentfp);
88
#endif /* NSS_FLAVOUR_GLIBC */
90
#ifdef NSS_FLAVOUR_SOLARIS
92
#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN
94
static nss_status_t read_spwdstring(TFILE *fp,nss_XbyY_args_t *args)
102
retv=read_spwd(fp,&result,NSS_ARGS(args)->buf.buffer,args->buf.buflen,&errno);
103
if (retv!=NSS_STATUS_SUCCESS)
105
/* allocate a temporary buffer */
106
buflen=args->buf.buflen;
107
buffer=(char *)malloc(buflen);
108
/* build the formatted string */
109
/* FIXME: implement proper buffer size checking */
110
sprintf(buffer,"%s:%s:",result.sp_namp,result.sp_pwdp);
111
if (result.sp_lstchg >= 0)
112
sprintf(field_buf,"%d:",result.sp_lstchg);
114
sprintf(field_buf,":");
115
strcat(buffer,field_buf);
116
if (result.sp_min >= 0)
117
sprintf(field_buf,"%d:",result.sp_min);
119
sprintf(field_buf,":");
120
strcat(buffer,field_buf);
121
if (result.sp_max >= 0)
122
sprintf(field_buf,"%d:",result.sp_max);
124
sprintf(field_buf,":");
125
strcat(buffer,field_buf);
126
if (result.sp_warn >= 0)
127
sprintf(field_buf,"%d:",result.sp_warn);
129
sprintf(field_buf,":");
130
strcat(buffer,field_buf);
131
if (result.sp_inact >= 0)
132
sprintf(field_buf,"%d:",result.sp_inact);
134
sprintf(field_buf,":");
135
strcat(buffer,field_buf);
136
if (result.sp_expire >= 0)
137
sprintf(field_buf,"%d:",result.sp_expire);
139
sprintf(field_buf,":");
140
strcat(buffer,field_buf);
141
if (result.sp_flag >= 0)
142
sprintf(field_buf,"%x",result.sp_flag);
144
sprintf(field_buf,":");
145
strcat(buffer,field_buf);
146
/* copy the result back to the result buffer and free the temporary one */
147
strcpy(NSS_ARGS(args)->buf.buffer,buffer);
149
NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.buffer;
150
NSS_ARGS(args)->returnlen=strlen(NSS_ARGS(args)->buf.buffer);
151
return NSS_STATUS_SUCCESS;
154
#define READ_RESULT(fp) \
155
NSS_ARGS(args)->buf.result? \
156
read_spwd(fp,(struct spwd *)NSS_ARGS(args)->buf.result,NSS_ARGS(args)->buf.buffer,NSS_ARGS(args)->buf.buflen,&errno): \
157
read_spwdstring(fp,args); \
158
if ((NSS_ARGS(args)->buf.result)&&(retv==NSS_STATUS_SUCCESS)) \
159
NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result;
161
#else /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */
163
#define READ_RESULT(fp) \
164
read_spwd(fp,(struct spwd *)NSS_ARGS(args)->buf.result,NSS_ARGS(args)->buf.buffer,NSS_ARGS(args)->buf.buflen,&errno); \
165
if (retv==NSS_STATUS_SUCCESS) \
166
NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result;
168
#endif /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */
170
static nss_status_t shadow_getspnam(nss_backend_t UNUSED(*be),void *args)
172
NSS_BYNAME(NSLCD_ACTION_SHADOW_BYNAME,
173
NSS_ARGS(args)->key.name,
177
static nss_status_t shadow_setspent(nss_backend_t *be,void UNUSED(*args))
179
NSS_SETENT(LDAP_BE(be)->fp);
182
static nss_status_t shadow_getspent(nss_backend_t *be,void *args)
184
NSS_GETENT(LDAP_BE(be)->fp,NSLCD_ACTION_SHADOW_ALL,
185
READ_RESULT(LDAP_BE(be)->fp));
188
static nss_status_t shadow_endspent(nss_backend_t *be,void UNUSED(*args))
190
NSS_ENDENT(LDAP_BE(be)->fp);
193
static nss_backend_op_t shadow_ops[]={
201
nss_backend_t *_nss_ldap_shadow_constr(const char UNUSED(*db_name),
202
const char UNUSED(*src_name),const char UNUSED(*cfg_args))
204
return nss_ldap_constructor(shadow_ops,sizeof(shadow_ops));
207
#endif /* NSS_FLAVOUR_SOLARIS */