90
91
#ifdef NSS_FLAVOUR_SOLARIS
92
93
#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 */
94
static char *spwd2str(struct spwd *result,char *buffer,size_t buflen)
96
/* snprintf writes a terminating \0 on Solaris */
97
snprintf(buffer,buflen,"%s:%s:",result->sp_namp,result->sp_pwdp);
98
if (result->sp_lstchg>=0)
99
snprintf(buffer,buflen-strlen(buffer)-1,"%d",result->sp_lstchg);
100
strlcat(buffer,":",buflen);
101
if (result->sp_min>=0)
102
snprintf(buffer,buflen-strlen(buffer)-1,"%d",result->sp_min);
103
strlcat(buffer,":",buflen);
104
if (result->sp_max>=0)
105
snprintf(buffer,buflen-strlen(buffer)-1,"%d",result->sp_max);
106
strlcat(buffer,":",buflen);
107
if (result->sp_warn>=0)
108
snprintf(buffer,buflen-strlen(buffer)-1,"%d",result->sp_warn);
109
strlcat(buffer,":",buflen);
110
if (result->sp_inact>=0)
111
snprintf(buffer,buflen-strlen(buffer)-1,"%d",result->sp_inact);
112
strlcat(buffer,":",buflen);
113
if (result->sp_expire>=0)
114
snprintf(buffer,buflen-strlen(buffer)-1,"%d",result->sp_expire);
115
strlcat(buffer,":",buflen);
116
if (result->sp_flag>0)
117
snprintf(buffer,buflen-strlen(buffer)-1,"%x",result->sp_flag);
118
if (strlen(buffer)>=buflen-1)
122
#endif /* HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */
124
static nss_status_t read_result(TFILE *fp,nss_XbyY_args_t *args)
126
READ_RESULT(spwd,&args->erange);
170
129
static nss_status_t shadow_getspnam(nss_backend_t UNUSED(*be),void *args)
172
131
NSS_BYNAME(NSLCD_ACTION_SHADOW_BYNAME,
173
132
NSS_ARGS(args)->key.name,
133
read_result(fp,args));
177
136
static nss_status_t shadow_setspent(nss_backend_t *be,void UNUSED(*args))