Arthur de Jong

Open Source / Free Software developer

summaryrefslogtreecommitdiffstats
path: root/nss/passwd.c
diff options
context:
space:
mode:
Diffstat (limited to 'nss/passwd.c')
-rw-r--r--nss/passwd.c190
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),