summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArthur de Jong <arthur@arthurdejong.org>2012-11-25 15:51:10 +0000
committerArthur de Jong <arthur@arthurdejong.org>2012-11-25 15:51:10 +0000
commitea55c22e2fd1872dffabc615e20cdf740f1558cb (patch)
tree0333a460302788a51f8dbd817e753e8ee2915b34
parenteefe25d027eb38328e8eaeec92d90fabacc149be (diff)
move all nsswitch-parsing related functions to nsswitch.c
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/nss-pam-ldapd@1840 ef36b2f9-881f-0410-afb5-c4e39611909c
-rw-r--r--nslcd/common.h5
-rw-r--r--nslcd/nsswitch.c61
-rw-r--r--nslcd/passwd.c59
3 files changed, 61 insertions, 64 deletions
diff --git a/nslcd/common.h b/nslcd/common.h
index 3ca77f8..a7be8c5 100644
--- a/nslcd/common.h
+++ b/nslcd/common.h
@@ -127,8 +127,11 @@ void get_shadow_properties(MYLDAP_ENTRY *entry,long *lastchangedate,
long *inactdays,long *expiredate,unsigned long *flag);
+/* check whether the nsswitch file should be reloaded */
+void nsswitch_check_reload(void);
+
/* check whether the nsswitch.conf file has LDAP as a naming source for db */
-int nsswitch_db_uses_ldap(const char *filename,const char *db);
+int nsswitch_shadow_uses_ldap(void);
/* fallback definition of HOST_NAME_MAX */
#ifndef HOST_NAME_MAX
diff --git a/nslcd/nsswitch.c b/nslcd/nsswitch.c
index 69905a6..7d488ff 100644
--- a/nslcd/nsswitch.c
+++ b/nslcd/nsswitch.c
@@ -25,16 +25,49 @@
#include <string.h>
#include <ctype.h>
#include <errno.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <time.h>
#include "common.h"
#include "log.h"
+/* the cached value of whether shadow lookups use LDAP in nsswitch.conf */
+#define NSSWITCH_FILE "/etc/nsswitch.conf"
+#define CACHED_UNKNOWN 22
+static int cached_shadow_uses_ldap=CACHED_UNKNOWN;
+static time_t cached_shadow_lastcheck=0;
+#define CACHED_SHADOW_TIMEOUT (60)
+static time_t nsswitch_mtime=0;
+
/* the maximum line length supported of nsswitch.conf */
#define MAX_LINE_LENGTH 4096
-
-/* TODO: store mtime of file and use it to check reparse */
-/* TODO: cache entries for x minutes */
+/* check whether /etc/nsswitch.conf should be related to update
+ cached_shadow_uses_ldap */
+void nsswitch_check_reload(void)
+{
+ struct stat buf;
+ time_t t;
+ if ((cached_shadow_uses_ldap!=CACHED_UNKNOWN)&&
+ ((t=time(NULL)) > (cached_shadow_lastcheck+CACHED_SHADOW_TIMEOUT)))
+ {
+ cached_shadow_lastcheck=t;
+ if (stat(NSSWITCH_FILE,&buf))
+ {
+ log_log(LOG_ERR,"stat(%s) failed: %s",NSSWITCH_FILE,strerror(errno));
+ /* trigger a recheck anyway */
+ cached_shadow_uses_ldap=CACHED_UNKNOWN;
+ return;
+ }
+ /* trigger a recheck if file changed */
+ if (buf.st_mtime!=nsswitch_mtime)
+ {
+ nsswitch_mtime=buf.st_mtime;
+ cached_shadow_uses_ldap=CACHED_UNKNOWN;
+ }
+ }
+}
/* see if the line is a service definition for db and return a pointer to
the beginning of the services list if it is */
@@ -89,24 +122,24 @@ static int has_service(const char *services,const char *service,
return 0;
}
-int nsswitch_db_uses_ldap(const char *filename,const char *db)
+static int shadow_uses_ldap(void)
{
FILE *fp;
int lnr=0;
char linebuf[MAX_LINE_LENGTH];
const char *services;
/* open config file */
- if ((fp=fopen(filename,"r"))==NULL)
+ if ((fp=fopen(NSSWITCH_FILE,"r"))==NULL)
{
- log_log(LOG_ERR,"cannot open %s: %s",filename,strerror(errno));
+ log_log(LOG_ERR,"cannot open %s: %s",NSSWITCH_FILE,strerror(errno));
return 0;
}
/* read file and parse lines */
while (fgets(linebuf,sizeof(linebuf),fp)!=NULL)
{
lnr++;
- services=find_db(linebuf,db);
- if ((services!=NULL)&&has_service(services,"ldap",filename,lnr))
+ services=find_db(linebuf,"shadow");
+ if ((services!=NULL)&&has_service(services,"ldap",NSSWITCH_FILE,lnr))
{
fclose(fp);
return 1;
@@ -115,3 +148,15 @@ int nsswitch_db_uses_ldap(const char *filename,const char *db)
fclose(fp);
return 0;
}
+
+/* check whether shadow lookups are configured to use ldap */
+inline int nsswitch_shadow_uses_ldap(void)
+{
+ if (cached_shadow_uses_ldap==CACHED_UNKNOWN)
+ {
+ log_log(LOG_INFO,"(re)loading %s",NSSWITCH_FILE);
+ cached_shadow_uses_ldap=shadow_uses_ldap();
+ cached_shadow_lastcheck=time(NULL);
+ }
+ return cached_shadow_uses_ldap;
+}
diff --git a/nslcd/passwd.c b/nslcd/passwd.c
index 31485d6..cdeb814 100644
--- a/nslcd/passwd.c
+++ b/nslcd/passwd.c
@@ -28,7 +28,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
-#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
@@ -386,59 +385,9 @@ char *uid2dn(MYLDAP_SESSION *session,const char *uid,char *buf,size_t buflen)
}
#ifndef NSS_FLAVOUR_GLIBC
-
/* only check nsswitch.conf for glibc */
#define check_nsswitch_reload()
#define shadow_uses_ldap() (1)
-
-#else /* NSS_FLAVOUR_GLIBC */
-
-/* the cached value of whether shadow lookups use LDAP in nsswitch.conf */
-#define NSSWITCH_FILE "/etc/nsswitch.conf"
-#define CACHED_UNKNOWN 22
-static int cached_shadow_uses_ldap=CACHED_UNKNOWN;
-static time_t cached_shadow_lastcheck=0;
-#define CACHED_SHADOW_TIMEOUT (60)
-static time_t nsswitch_mtime=0;
-
-/* check whether /etc/nsswitch.conf should be related to update
- cached_shadow_uses_ldap */
-static inline void check_nsswitch_reload(void)
-{
- struct stat buf;
- time_t t;
- if ((cached_shadow_uses_ldap!=CACHED_UNKNOWN)&&
- ((t=time(NULL)) > (cached_shadow_lastcheck+CACHED_SHADOW_TIMEOUT)))
- {
- cached_shadow_lastcheck=t;
- if (stat(NSSWITCH_FILE,&buf))
- {
- log_log(LOG_ERR,"stat(%s) failed: %s",NSSWITCH_FILE,strerror(errno));
- /* trigger a recheck anyway */
- cached_shadow_uses_ldap=CACHED_UNKNOWN;
- return;
- }
- /* trigger a recheck if file changed */
- if (buf.st_mtime!=nsswitch_mtime)
- {
- nsswitch_mtime=buf.st_mtime;
- cached_shadow_uses_ldap=CACHED_UNKNOWN;
- }
- }
-}
-
-/* check whether shadow lookups are configured to use ldap */
-static inline int shadow_uses_ldap(void)
-{
- if (cached_shadow_uses_ldap==CACHED_UNKNOWN)
- {
- log_log(LOG_INFO,"(re)loading %s",NSSWITCH_FILE);
- cached_shadow_uses_ldap=nsswitch_db_uses_ldap(NSSWITCH_FILE,"shadow");
- cached_shadow_lastcheck=time(NULL);
- }
- return cached_shadow_uses_ldap;
-}
-
#endif /* NSS_FLAVOUR_GLIBC */
/* the maximum number of uidNumber attributes per entry */
@@ -471,7 +420,7 @@ static int write_passwd(TFILE *fp,MYLDAP_ENTRY *entry,const char *requser,
}
/* if we are using shadow maps and this entry looks like it would return
shadow information, make the passwd entry indicate it */
- if (myldap_has_objectclass(entry,"shadowAccount")&&shadow_uses_ldap())
+ if (myldap_has_objectclass(entry,"shadowAccount")&&nsswitch_shadow_uses_ldap())
{
passwd="x";
}
@@ -604,7 +553,7 @@ NSLCD_HANDLE_UID(
log_log(LOG_WARNING,"request denied by validnames option");
return -1;
}
- check_nsswitch_reload();,
+ nsswitch_check_reload();,
NSLCD_ACTION_PASSWD_BYNAME,
mkfilter_passwd_byname(name,filter,sizeof(filter)),
write_passwd(fp,entry,name,NULL,calleruid)
@@ -623,7 +572,7 @@ NSLCD_HANDLE_UID(
WRITE_INT32(fp,NSLCD_ACTION_PASSWD_BYUID);
WRITE_INT32(fp,NSLCD_RESULT_END);
}
- check_nsswitch_reload();,
+ nsswitch_check_reload();,
NSLCD_ACTION_PASSWD_BYUID,
mkfilter_passwd_byuid(uid,filter,sizeof(filter)),
write_passwd(fp,entry,NULL,&uid,calleruid)
@@ -633,7 +582,7 @@ NSLCD_HANDLE_UID(
passwd,all,
const char *filter;
log_setrequest("passwd(all)");
- check_nsswitch_reload();,
+ nsswitch_check_reload();,
NSLCD_ACTION_PASSWD_ALL,
(filter=passwd_filter,0),
write_passwd(fp,entry,NULL,NULL,calleruid)