diff options
Diffstat (limited to 'nss/passwd.c')
-rw-r--r-- | nss/passwd.c | 190 |
1 files changed, 54 insertions, 136 deletions
diff --git a/nss/passwd.c b/nss/passwd.c index 26327e5..112cfa7 100644 --- a/nss/passwd.c +++ b/nss/passwd.c @@ -54,10 +54,9 @@ nss_status_t _nss_ldap_getpwnam_r( const char *name,struct passwd *result, char *buffer,size_t buflen,int *errnop) { - NSS_BYNAME(NSLCD_ACTION_PASSWD_BYNAME,buffer,buflen, + NSS_BYNAME(NSLCD_ACTION_PASSWD_BYNAME, name, read_passwd(fp,result,buffer,buflen,errnop)); - return retv; } /* get a single passwd entry by uid */ @@ -65,10 +64,9 @@ nss_status_t _nss_ldap_getpwuid_r( uid_t uid,struct passwd *result, char *buffer,size_t buflen,int *errnop) { - NSS_BYTYPE(NSLCD_ACTION_PASSWD_BYUID,buffer,buflen, + NSS_BYTYPE(NSLCD_ACTION_PASSWD_BYUID, uid,uid_t, read_passwd(fp,result,buffer,buflen,errnop)); - return retv; } /* thread-local file pointer to an ongoing request */ @@ -85,9 +83,8 @@ nss_status_t _nss_ldap_getpwent_r( struct passwd *result, char *buffer,size_t buflen,int *errnop) { - NSS_GETENT(pwentfp,NSLCD_ACTION_PASSWD_ALL,buffer,buflen, + NSS_GETENT(pwentfp,NSLCD_ACTION_PASSWD_ALL, read_passwd(pwentfp,result,buffer,buflen,errnop)); - return retv; } /* close the stream opened with setpwent() above */ @@ -100,167 +97,88 @@ nss_status_t _nss_ldap_endpwent(void) #ifdef NSS_FLAVOUR_SOLARIS -static nss_status_t _nss_nslcd_getpwnam_r( - const char *name,struct passwd *result,char *buffer,size_t buflen, - int *errnop) -{ - NSS_BYNAME(NSLCD_ACTION_PASSWD_BYNAME,buffer,buflen, - name, - read_passwd(fp,result,buffer,buflen,errnop)); - return retv; +static nss_status_t read_passwdstring(TFILE *fp,nss_XbyY_args_t *args) +{ + struct passwd result; + nss_status_t retv; + char *buffer; + size_t buflen; + /* read the passwd */ + retv=read_passwd(fp,&result,NSS_ARGS(args)->buf.buffer,args->buf.buflen,&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 */ + sprintf(buffer,"%s:%s:%d:%d:%s:%s:%s", + result.pw_name,result.pw_passwd,(int)result.pw_uid,(int)result.pw_gid,result.pw_gecos, + result.pw_dir,result.pw_shell); + /* 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); + return NSS_STATUS_SUCCESS; } -static nss_status_t _xnss_ldap_getpwnam_r(nss_backend_t UNUSED(*be),void *args) +#define READ_RESULT(fp) \ + NSS_ARGS(args)->buf.result? \ + read_passwd(fp,(struct passwd *)NSS_ARGS(args)->buf.result,NSS_ARGS(args)->buf.buffer,NSS_ARGS(args)->buf.buflen,&errno): \ + read_passwdstring(fp,args); \ + if (NSS_ARGS(args)->buf.result) \ + NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result + +static nss_status_t get_getpwnam(nss_backend_t UNUSED(*be),void *args) { - struct passwd priv_pw; - struct passwd *pw=NSS_ARGS(args)->buf.result?(struct passwd *)NSS_ARGS(args)->buf.result:&priv_pw; - char *buffer=NSS_ARGS(args)->buf.buffer; - size_t buflen=NSS_ARGS(args)->buf.buflen; - char *data_ptr; - nss_status_t status; - if (NSS_ARGS(args)->buf.buflen<0) - { - NSS_ARGS(args)->erange=1; - status=NSS_STATUS_TRYAGAIN; - return status; - } - status=_nss_nslcd_getpwnam_r(NSS_ARGS(args)->key.name,pw,buffer,buflen,&errno); - if (status!=NSS_STATUS_SUCCESS) - return status; - if (!NSS_ARGS(args)->buf.result) - { - /* result==NULL, return file format */ - data_ptr=(char *)malloc(buflen); - sprintf(data_ptr,"%s:%s:%d:%d:%s:%s:%s", - pw->pw_name,"x",(int) pw->pw_uid,(int) pw->pw_gid,pw->pw_gecos, - pw->pw_dir,pw->pw_shell); - /* copy file-format data to buffer provided by front-end */ - strcpy(buffer,data_ptr); - if (data_ptr) - free(data_ptr); - NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.buffer; - NSS_ARGS(args)->returnlen=strlen(NSS_ARGS(args)->buf.buffer); - } - else - { - NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result; - } - return status; + NSS_BYNAME(NSLCD_ACTION_PASSWD_BYNAME, + NSS_ARGS(args)->key.name, + READ_RESULT(fp)); } -static nss_status_t _nss_nslcd_getpwuid_r( - uid_t uid,struct passwd *result,char *buffer, - size_t buflen,int *errnop) +static nss_status_t get_getpwuid(nss_backend_t UNUSED(*be),void *args) { - NSS_BYTYPE(NSLCD_ACTION_PASSWD_BYUID,buffer,buflen, - uid,uid_t, - read_passwd(fp,result,buffer,buflen,errnop)); - return retv; + NSS_BYTYPE(NSLCD_ACTION_PASSWD_BYUID, + NSS_ARGS(args)->key.uid,uid_t, + READ_RESULT(fp)); } /* thread-local file pointer to an ongoing request */ static __thread TFILE *pwentfp; /* open a connection to the nslcd and write the request */ -static nss_status_t _xnss_ldap_setpwent(nss_backend_t UNUSED(*be),void UNUSED(*args)) +static nss_status_t get_setpwent(nss_backend_t UNUSED(*be),void UNUSED(*args)) { NSS_SETENT(pwentfp); } /* read password data from an opened stream */ -static nss_status_t _nss_nslcd_getpwent_r( - struct passwd *result,char *buffer,size_t buflen,int *errnop) +static nss_status_t get_getpwent(nss_backend_t UNUSED(*be),void *args) { - NSS_GETENT(pwentfp,NSLCD_ACTION_PASSWD_ALL,buffer,buflen, - read_passwd(pwentfp,result,buffer,buflen,errnop)); - return retv; + NSS_GETENT(pwentfp,NSLCD_ACTION_PASSWD_ALL, + READ_RESULT(pwentfp)); } /* close the stream opened with setpwent() above */ -static nss_status_t _xnss_ldap_endpwent(nss_backend_t UNUSED(*be),void UNUSED(*args)) +static nss_status_t get_endpwent(nss_backend_t UNUSED(*be),void UNUSED(*args)) { NSS_ENDENT(pwentfp); } -static nss_status_t _xnss_ldap_getpwuid_r(nss_backend_t UNUSED(*be),void *args) -{ - struct passwd priv_pw; - struct passwd *pw=NSS_ARGS(args)->buf.result ? - NSS_ARGS(args)->buf.result : &priv_pw; - uid_t uid=NSS_ARGS(args)->key.uid; - char *data_ptr; - char *buffer=NSS_ARGS(args)->buf.buffer; - size_t buflen=NSS_ARGS(args)->buf.buflen; - nss_status_t status; - status=_nss_nslcd_getpwuid_r(uid,pw,buffer,buflen,&errno); - if (status!=NSS_STATUS_SUCCESS) - return status; - if (!NSS_ARGS(args)->buf.result) - { - /* result==NULL, return file format */ - data_ptr=(char *)malloc((size_t) buflen); - sprintf(data_ptr,"%s:%s:%d:%d:%s:%s:%s", - pw->pw_name,"x",(int) pw->pw_uid,(int) pw->pw_gid,pw->pw_gecos, - pw->pw_dir,pw->pw_shell); - /* copy file-format data to buffer provided by front-end */ - strcpy(buffer,data_ptr); - if (data_ptr) - free((void *)data_ptr); - NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.buffer; - NSS_ARGS(args)->returnlen=strlen(NSS_ARGS(args)->buf.buffer); - } - else - { - NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result; - } - return status; -} - -static nss_status_t _xnss_ldap_getpwent_r(nss_backend_t UNUSED(*be),void *args) -{ - struct passwd priv_pw; - struct passwd *pw=NSS_ARGS(args)->buf.result?(struct passwd *)NSS_ARGS(args)->buf.result:&priv_pw; - char *buffer=NSS_ARGS(args)->buf.buffer; - size_t buflen=NSS_ARGS(args)->buf.buflen; - char *data_ptr; - nss_status_t status; - status=_nss_nslcd_getpwent_r(pw,buffer,buflen,&errno); - if (status!=NSS_STATUS_SUCCESS) - return status; - if (!NSS_ARGS(args)->buf.result) - { - /* result==NULL, return file format */ - data_ptr=(char *)malloc(buflen); - sprintf(data_ptr,"%s:%s:%d:%d:%s:%s:%s", - pw->pw_name,"x",(int) pw->pw_uid,(int) pw->pw_gid,pw->pw_gecos, - pw->pw_dir,pw->pw_shell); - /* copy file-format data to buffer provided by front-end */ - strcpy(buffer,data_ptr); - if (data_ptr) - free(data_ptr); - NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.buffer; - NSS_ARGS(args)->returnlen=strlen(NSS_ARGS(args)->buf.buffer); - } - else - { - NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.result; - } - return status; -} - -static nss_status_t _xnss_ldap_passwd_destr(nss_backend_t *be,void UNUSED(*args)) +static nss_status_t destructor(nss_backend_t *be,void UNUSED(*args)) { free(be); return NSS_STATUS_SUCCESS; } static nss_backend_op_t passwd_ops[]={ - _xnss_ldap_passwd_destr, - _xnss_ldap_endpwent, /* NSS_DBOP_ENDENT */ - _xnss_ldap_setpwent, /* NSS_DBOP_SETENT */ - _xnss_ldap_getpwent_r, /* NSS_DBOP_GETENT */ - _xnss_ldap_getpwnam_r, /* NSS_DBOP_PASSWD_BYNAME */ - _xnss_ldap_getpwuid_r /* NSS_DBOP_PASSWD_BYUID */ + destructor, + get_endpwent, /* NSS_DBOP_ENDENT */ + get_setpwent, /* NSS_DBOP_SETENT */ + get_getpwent, /* NSS_DBOP_GETENT */ + get_getpwnam, /* NSS_DBOP_PASSWD_BYNAME */ + get_getpwuid /* NSS_DBOP_PASSWD_BYUID */ }; nss_backend_t *_nss_ldap_passwd_constr(const char UNUSED(*db_name), |