]> git.sur5r.net Git - openldap/commitdiff
add Time subsystem
authorPierangelo Masarati <ando@openldap.org>
Tue, 29 Jan 2002 12:15:13 +0000 (12:15 +0000)
committerPierangelo Masarati <ando@openldap.org>
Tue, 29 Jan 2002 12:15:13 +0000 (12:15 +0000)
servers/slapd/back-monitor/Makefile.in
servers/slapd/back-monitor/back-monitor.h
servers/slapd/back-monitor/init.c
servers/slapd/back-monitor/proto-back-monitor.h
servers/slapd/back-monitor/time.c [new file with mode: 0644]
servers/slapd/tools/mimic.c

index d7cd5e6944adb071aba75d76d7b1b072f81f24aa..e80385288ad89df7fcd578e203792f3ffbb837f4 100644 (file)
@@ -4,12 +4,12 @@ SRCS = init.c search.c compare.c modify.c bind.c \
        operational.c \
        cache.c entry.c \
        backend.c database.c thread.c conn.c rww.c log.c \
-       operation.c sent.c listener.c
+       operation.c sent.c listener.c time.c
 OBJS = init.lo search.lo compare.lo modify.lo bind.lo \
        operational.lo \
        cache.lo entry.lo \
        backend.lo database.lo thread.lo conn.lo rww.lo log.lo \
-       operation.lo sent.lo listener.lo
+       operation.lo sent.lo listener.lo time.lo
 
 LDAP_INCDIR= ../../../include       
 LDAP_LIBDIR= ../../../libraries
index fdf8c23750611b248b50682e3d9528d2ee64cdc0..bb1bd74b982e9d0a9e746cb8915d2851fbf1a887 100644 (file)
@@ -162,6 +162,13 @@ struct monitorinfo {
 #define SLAPD_MONITOR_SENT_DN  \
        SLAPD_MONITOR_SENT_RDN "," SLAPD_MONITOR_DN
 
+#define SLAPD_MONITOR_TIME             12
+#define SLAPD_MONITOR_TIME_NAME                "Time"
+#define SLAPD_MONITOR_TIME_RDN  \
+       "cn=" SLAPD_MONITOR_TIME_NAME
+#define SLAPD_MONITOR_TIME_DN   \
+       SLAPD_MONITOR_TIME_RDN "," SLAPD_MONITOR_DN
+
 #define SLAPD_MONITOR_OBJECTCLASSES \
        "objectClass: top\n" \
        "objectClass: monitor\n" \
index a2b91a15642abb5a1b0d5a0f6c6ef78fcd621464..94ab4b675856db93e490f9e4c79fcda392f21731 100644 (file)
@@ -132,7 +132,7 @@ struct monitorsubsys monitor_subsys[] = {
                }, { 
                SLAPD_MONITOR_OPS, SLAPD_MONITOR_OPS_NAME,
                { 0L, NULL }, { 0L, NULL }, { 0L, NULL },
-               MONITOR_F_NONE,
+               MONITOR_F_PERSISTENT_CH,
                monitor_subsys_ops_init,
                monitor_subsys_ops_update,
                NULL,   /* create */
@@ -140,11 +140,19 @@ struct monitorsubsys monitor_subsys[] = {
                }, { 
                SLAPD_MONITOR_SENT, SLAPD_MONITOR_SENT_NAME,
                { 0L, NULL }, { 0L, NULL }, { 0L, NULL },
-               MONITOR_F_NONE,
+               MONITOR_F_PERSISTENT_CH,
                monitor_subsys_sent_init,
                monitor_subsys_sent_update,
                NULL,   /* create */
                NULL,   /* modify */
+               }, { 
+               SLAPD_MONITOR_TIME, SLAPD_MONITOR_TIME_NAME,
+               { 0L, NULL }, { 0L, NULL }, { 0L, NULL },
+               MONITOR_F_PERSISTENT_CH,
+               monitor_subsys_time_init,
+               monitor_subsys_time_update,
+               NULL,   /* create */
+               NULL,   /* modify */
        }, { -1, NULL }
 };
 
index 34c66b769fd090a2c0e2960197a4cabce58ed89b..45d0df8852e5d4e93707686b04d5465d17662921 100644 (file)
@@ -100,6 +100,12 @@ int monitor_subsys_sent_update LDAP_P(( struct monitorinfo *mi, Entry *e ));
  */
 int monitor_subsys_listener_init LDAP_P(( BackendDB *be ));
 
+/*
+ * time
+ */
+int monitor_subsys_time_init LDAP_P(( BackendDB *be ));
+int monitor_subsys_time_update LDAP_P(( struct monitorinfo *mi, Entry *e ));
+
 LDAP_END_DECL
 
 #endif
diff --git a/servers/slapd/back-monitor/time.c b/servers/slapd/back-monitor/time.c
new file mode 100644 (file)
index 0000000..0da78a8
--- /dev/null
@@ -0,0 +1,247 @@
+/* time.c - deal with time subsystem */
+/*
+ * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
+ * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+ */
+/*
+ * Copyright 2001, Pierangelo Masarati, All rights reserved. <ando@sys-net.it>
+ * 
+ * This work has beed deveolped for the OpenLDAP Foundation 
+ * in the hope that it may be useful to the Open Source community, 
+ * but WITHOUT ANY WARRANTY.
+ * 
+ * Permission is granted to anyone to use this software for any purpose
+ * on any computer system, and to alter it and redistribute it, subject
+ * to the following restrictions:
+ * 
+ * 1. The author and SysNet s.n.c. are not responsible for the consequences
+ *    of use of this software, no matter how awful, even if they arise from
+ *    flaws in it.
+ * 
+ * 2. The origin of this software must not be misrepresented, either by
+ *    explicit claim or by omission.  Since few users ever read sources,
+ *    credits should appear in the documentation.
+ * 
+ * 3. Altered versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.  Since few users
+ *    ever read sources, credits should appear in the documentation.
+ *    SysNet s.n.c. cannot be responsible for the consequences of the
+ *    alterations.
+ * 
+ * 4. This notice may not be removed or altered.
+ */
+
+#include "portable.h"
+
+#include <stdio.h>
+#include <ac/string.h>
+#include <ac/time.h>
+
+#include "slap.h"
+#include "proto-slap.h"
+#include "back-monitor.h"
+
+int
+monitor_subsys_time_init(
+       BackendDB               *be
+)
+{
+       struct monitorinfo      *mi;
+       
+       Entry                   *e, *e_tmp, *e_time;
+       struct monitorentrypriv *mp;
+       char                    buf[1024], tmbuf[20];
+       struct tm               *ltm;
+
+       assert( be != NULL );
+
+       mi = ( struct monitorinfo * )be->be_private;
+
+       if ( monitor_cache_get( mi,
+                       &monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn, &e_time ) ) {
+#ifdef NEW_LOGGING
+               LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
+                       "monitor_subsys_time_init: "
+                       "unable to get entry '%s'\n",
+                       monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val ));
+#else
+               Debug( LDAP_DEBUG_ANY,
+                       "monitor_subsys_time_init: "
+                       "unable to get entry '%s'\n%s%s",
+                       monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val, 
+                       "", "" );
+#endif
+               return( -1 );
+       }
+
+       e_tmp = NULL;
+
+       /*
+        * Start
+        */
+       ldap_pvt_thread_mutex_lock( &gmtime_mutex );
+       ltm = gmtime( &starttime );
+       strftime( tmbuf, sizeof(tmbuf), "%Y%m%d%H%M%SZ", ltm );
+       ldap_pvt_thread_mutex_unlock( &gmtime_mutex );
+       snprintf( buf, sizeof( buf ),
+                       "dn: cn=Start,%s\n"
+                       SLAPD_MONITOR_OBJECTCLASSES
+                       "cn: Start\n"
+                       "description: %s",
+                       monitor_subsys[SLAPD_MONITOR_TIME].mss_dn.bv_val,
+                       tmbuf );
+
+       e = str2entry( buf );
+       if ( e == NULL ) {
+#ifdef NEW_LOGGING
+               LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
+                       "monitor_subsys_time_init: "
+                       "unable to create entry 'cn=Start,%s'\n",
+                       monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val ));
+#else
+               Debug( LDAP_DEBUG_ANY,
+                       "monitor_subsys_time_init: "
+                       "unable to create entry 'cn=Start,%s'\n%s%s",
+                       monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val,
+                       "", "" );
+#endif
+               return( -1 );
+       }
+       
+       mp = ( struct monitorentrypriv * )ch_calloc( sizeof( struct monitorentrypriv ), 1 );
+       e->e_private = ( void * )mp;
+       mp->mp_next = e_tmp;
+       mp->mp_children = NULL;
+       mp->mp_info = &monitor_subsys[SLAPD_MONITOR_TIME];
+       mp->mp_flags = monitor_subsys[SLAPD_MONITOR_TIME].mss_flags \
+               | MONITOR_F_SUB | MONITOR_F_PERSISTENT;
+
+       if ( monitor_cache_add( mi, e ) ) {
+#ifdef NEW_LOGGING
+               LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
+                       "monitor_subsys_time_init: "
+                       "unable to add entry 'cn=Start,%s'\n",
+                       monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val ));
+#else
+               Debug( LDAP_DEBUG_ANY,
+                       "monitor_subsys_time_init: "
+                       "unable to add entry 'cn=Start,%s'\n%s%s",
+                       monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val,
+                       "", "" );
+#endif
+               return( -1 );
+       }
+       
+       e_tmp = e;
+
+       /*
+        * Current
+        */
+       snprintf( buf, sizeof( buf ),
+                       "dn: cn=Current,%s\n"
+                       SLAPD_MONITOR_OBJECTCLASSES
+                       "cn: Current\n"
+                       "description: %s",
+                       monitor_subsys[SLAPD_MONITOR_TIME].mss_dn.bv_val,
+                       tmbuf );
+
+       e = str2entry( buf );
+       if ( e == NULL ) {
+#ifdef NEW_LOGGING
+               LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
+                       "monitor_subsys_time_init: "
+                       "unable to create entry 'cn=Current,%s'\n",
+                       monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val ));
+#else
+               Debug( LDAP_DEBUG_ANY,
+                       "monitor_subsys_time_init: "
+                       "unable to create entry 'cn=Current,%s'\n%s%s",
+                       monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val,
+                       "", "" );
+#endif
+               return( -1 );
+       }
+       
+       mp = ( struct monitorentrypriv * )ch_calloc( sizeof( struct monitorentrypriv ), 1 );
+       e->e_private = ( void * )mp;
+       mp->mp_next = e_tmp;
+       mp->mp_children = NULL;
+       mp->mp_info = &monitor_subsys[SLAPD_MONITOR_TIME];
+       mp->mp_flags = monitor_subsys[SLAPD_MONITOR_TIME].mss_flags \
+               | MONITOR_F_SUB | MONITOR_F_PERSISTENT;
+
+       if ( monitor_cache_add( mi, e ) ) {
+#ifdef NEW_LOGGING
+               LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
+                       "monitor_subsys_time_init: "
+                       "unable to add entry 'cn=Current,%s'\n",
+                       monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val ));
+#else
+               Debug( LDAP_DEBUG_ANY,
+                       "monitor_subsys_time_init: "
+                       "unable to add entry 'cn=Current,%s'\n%s%s",
+                       monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val,
+                       "", "" );
+#endif
+               return( -1 );
+       }
+       
+       e_tmp = e;
+
+       mp = ( struct monitorentrypriv * )e_time->e_private;
+       mp->mp_children = e_tmp;
+
+       monitor_cache_release( mi, e_time );
+
+       return( 0 );
+}
+
+int
+monitor_subsys_time_update(
+       struct monitorinfo      *mi,
+       Entry                   *e
+)
+{
+       char            tmbuf[20];
+       struct tm       *ltm;
+       time_t          currenttime;
+       struct berval   bv[ 2 ];
+       Attribute       *a;
+       ber_len_t       len;
+
+       static int      init_start = 0;
+
+       assert( mi );
+       assert( e );
+       
+       if ( init_start == 0 && strncmp( e->e_nname.bv_val, "cn=START",
+                               sizeof("cn=START")-1 ) == 0 ) {
+               currenttime = starttime;
+               init_start = 1;
+
+       } else if ( strncmp( e->e_nname.bv_val, "cn=CURRENT",
+                               sizeof("cn=CURRENT")-1 ) == 0 ) {
+               currenttime = slap_get_time();
+
+       } else {
+               return( 0 );
+       }
+
+       a = attr_find( e->e_attrs, monitor_ad_desc );
+       if ( a == NULL ) {
+               return( -1 );
+       }
+
+
+       ldap_pvt_thread_mutex_lock( &gmtime_mutex );
+       ltm = gmtime( &currenttime );
+       strftime( tmbuf, sizeof(tmbuf), "%Y%m%d%H%M%SZ", ltm );
+       ldap_pvt_thread_mutex_unlock( &gmtime_mutex );
+
+       len = strlen( tmbuf );
+       assert( len == a->a_vals[0].bv_len );
+       AC_MEMCPY( a->a_vals[0].bv_val, tmbuf, len );
+
+       return( 0 );
+}
+
index 3f07f66caf1aacf1f0e5c5802d67d40d4120dd8e..b6e75dc6aff6f8a4a6d9a998deebf547cdc01b77 100644 (file)
@@ -13,9 +13,8 @@
 
 #include "../slap.h"
 
-#ifdef WIN32
+/* needed by WIN32 and back-monitor */
 time_t starttime;
-#endif
 
 /* because Versionstr is used in back-monitor */
 const char Versionstr[] = "";