Arthur de Jong

Open Source / Free Software developer

summaryrefslogtreecommitdiffstats
path: root/server/shadow.c
diff options
context:
space:
mode:
authorArthur de Jong <arthur@arthurdejong.org>2006-11-22 13:18:19 +0100
committerArthur de Jong <arthur@arthurdejong.org>2006-11-22 13:18:19 +0100
commite45dcde096907034807924384565f2c1ce2f5af8 (patch)
treed71f1937cd9d15ada9858d5045e45c52bea82da2 /server/shadow.c
parent9be071cfd3b8e9c3236cf7e5e001db4ddaedc2bd (diff)
implement server end of shadow lookups
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/libnss_ldapd@111 ef36b2f9-881f-0410-afb5-c4e39611909c
Diffstat (limited to 'server/shadow.c')
-rw-r--r--server/shadow.c107
1 files changed, 81 insertions, 26 deletions
diff --git a/server/shadow.c b/server/shadow.c
index 7a2e407..f90293a 100644
--- a/server/shadow.c
+++ b/server/shadow.c
@@ -25,8 +25,6 @@
#include "config.h"
-#ifdef HAVE_SHADOW_H
-
#include <stdlib.h>
#include <string.h>
#include <shadow.h>
@@ -47,8 +45,10 @@
#endif
#include "ldap-nss.h"
-
-static struct ent_context *sp_context = NULL;
+#include "util.h"
+#include "nslcd-server.h"
+#include "common.h"
+#include "log.h"
static enum nss_status _nss_ldap_parse_sp(LDAPMessage *e,
struct ldap_state *pvt,
@@ -107,30 +107,85 @@ static enum nss_status _nss_ldap_parse_sp(LDAPMessage *e,
return NSS_STATUS_SUCCESS;
}
-enum nss_status _nss_ldap_getspnam_r(const char *name,
- struct spwd *result,
- char *buffer,size_t buflen,int *errnop)
-{
- LOOKUP_NAME(name, result, buffer, buflen, errnop, _nss_ldap_filt_getspnam,
- LM_SHADOW, _nss_ldap_parse_sp, LDAP_NSS_BUFLEN_DEFAULT);
-}
-
-enum nss_status _nss_ldap_setspent(void)
+/* macros for expanding the LDF_SHADOW macro */
+#define LDF_STRING(field) WRITE_STRING(fp,field)
+#define LDF_INT32(field) WRITE_INT32(fp,field)
+#define SHADOW_NAME result.sp_namp
+#define SHADOW_PASSWD result.sp_pwdp
+#define SHADOW_LASTCHANGE result.sp_lstchg
+#define SHADOW_MINDAYS result.sp_min
+#define SHADOW_MAXDAYS result.sp_max
+#define SHADOW_WARN result.sp_warn
+#define SHADOW_INACT result.sp_inact
+#define SHADOW_EXPIRE result.sp_expire
+#define SHADOW_FLAG result.sp_flag
+
+int nslcd_shadow_byname(FILE *fp)
{
- LOOKUP_SETENT(sp_context);
+ int32_t tmpint32;
+ char *name;
+ struct ldap_args a;
+ int retv;
+ struct spwd result;
+ char buffer[1024];
+ int errnop;
+ /* read request parameters */
+ READ_STRING_ALLOC(fp,name);
+ /* log call */
+ log_log(LOG_DEBUG,"nslcd_shadow_byname(%s)",name);
+ /* write the response header */
+ WRITE_INT32(fp,NSLCD_VERSION);
+ WRITE_INT32(fp,NSLCD_ACTION_SHADOW_BYNAME);
+ /* do the LDAP request */
+ LA_INIT(a);
+ LA_STRING(a)=name;
+ LA_TYPE(a)=LA_TYPE_STRING;
+ retv=nss2nslcd(_nss_ldap_getbyname(&a,&result,buffer,1024,&errnop,_nss_ldap_filt_getspnam,LM_SHADOW,_nss_ldap_parse_sp));
+ /* no more need for this string */
+ free(name);
+ /* write the response */
+ WRITE_INT32(fp,retv);
+ if (retv==NSLCD_RESULT_SUCCESS)
+ {
+ LDF_SHADOW;
+ }
+ WRITE_FLUSH(fp);
+ /* we're done */
+ return 0;
}
-enum nss_status _nss_ldap_getspent_r(struct spwd *result,
- char *buffer,size_t buflen,int *errnop)
+int nslcd_shadow_all(FILE *fp)
{
- LOOKUP_GETENT(sp_context, result, buffer, buflen, errnop,
- _nss_ldap_filt_getspent, LM_SHADOW, _nss_ldap_parse_sp,
- LDAP_NSS_BUFLEN_DEFAULT);
+ int32_t tmpint32;
+ static struct ent_context *shadow_context;
+ /* these are here for now until we rewrite the LDAP code */
+ struct spwd result;
+ char buffer[1024];
+ int errnop;
+ int retv;
+ /* log call */
+ log_log(LOG_DEBUG,"nslcd_shadow_all()");
+ /* write the response header */
+ WRITE_INT32(fp,NSLCD_VERSION);
+ WRITE_INT32(fp,NSLCD_ACTION_SHADOW_ALL);
+ /* initialize context */
+ if (_nss_ldap_ent_context_init(&shadow_context)==NULL)
+ return -1;
+ /* loop over all results */
+ while ((retv=nss2nslcd(_nss_ldap_getent(&shadow_context,&result,buffer,1024,&errnop,_nss_ldap_filt_getspent,LM_SHADOW,_nss_ldap_parse_sp)))==NSLCD_RESULT_SUCCESS)
+ {
+ /* write the result code */
+ WRITE_INT32(fp,retv);
+ /* write the shadow entry */
+ LDF_SHADOW;
+ fflush(fp);
+ }
+ /* write the final result code */
+ WRITE_INT32(fp,retv);
+ /* FIXME: if a previous call returns what happens to the context? */
+ _nss_ldap_enter();
+ _nss_ldap_ent_context_release(shadow_context);
+ _nss_ldap_leave();
+ /* we're done */
+ return 0;
}
-
-enum nss_status _nss_ldap_endspent(void)
-{
- LOOKUP_ENDENT(sp_context);
-}
-
-#endif /* HAVE_SHADOW_H */