]> git.sur5r.net Git - openldap/commitdiff
initial commit of idletimeout code... everything but the actual timeout.
authorKurt Zeilenga <kurt@openldap.org>
Fri, 18 Jun 1999 22:54:19 +0000 (22:54 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Fri, 18 Jun 1999 22:54:19 +0000 (22:54 +0000)
doc/man/man5/slapd.conf.5
servers/slapd/config.c
servers/slapd/connection.c
servers/slapd/monitor.c
servers/slapd/proto-slap.h
servers/slapd/slap.h

index 5fb59fa8291dfa14fd6752e4e1f9031e0229dbe9..7bca55ba17c450b91a64d3738c78d09b56fa1620 100644 (file)
@@ -107,6 +107,11 @@ defaultaccess [self]{ none | compare | search | read | write }
 Specify the default access to grant requestors not matched by 
 any other access line.  The default behavior is to grant read access.
 .TP
+.B idletimeout <integer>
+Specify the number of seconds to wait before forcibly closing
+an idle client connections.  A idletimeout of 0 disables this
+feature.  The default is 0.
+.TP
 .B include <filename>
 Read additional configuration information from the given file before
 continuing with the next line of the current file.
index 1fc3cf52ea18e5ad1424516b88f947e918ffd72a..714730961649451feeccb5336ed1836222297010 100644 (file)
@@ -25,6 +25,7 @@ struct acl    *global_acl = NULL;
 int            global_default_access = ACL_READ;
 char           *replogfile;
 int            global_lastmod;
+int            global_idletimeout = 0;
 char           *ldap_srvtab = "";
 
 char   *slapd_pid_file  = NULL;
@@ -508,6 +509,27 @@ read_config( char *fname )
                                        global_lastmod = OFF;
                        }
 
+               /* set idle timeout value */
+               } else if ( strcasecmp( cargv[0], "idletimeout" ) == 0 ) {
+                       int i;
+                       if ( cargc < 2 ) {
+                               Debug( LDAP_DEBUG_ANY,
+           "%s: line %d: missing timeout value in \"idletimeout <seconds>\" line\n",
+                                   fname, lineno, 0 );
+                               return( 1 );
+                       }
+
+                       i = atoi( cargv[1] );
+
+                       if( i < 0 ) {
+                               Debug( LDAP_DEBUG_ANY,
+           "%s: line %d: timeout value (%d) invalid \"idletimeout <seconds>\" line\n",
+                                   fname, lineno, i );
+                               return( 1 );
+                       }
+
+                       global_idletimeout = i;
+
                /* include another config file */
                } else if ( strcasecmp( cargv[0], "include" ) == 0 ) {
                        if ( cargc < 2 ) {
index 1800cc1798ec2a266d56ac0019dfc12c4aae346c..ad6b96c99ebc7b604a774fe1f041311752a33e1d 100644 (file)
@@ -212,6 +212,8 @@ static Connection* connection_get( int s )
                assert( c->c_struct_state == SLAP_C_USED );
                assert( c->c_conn_state != SLAP_C_INVALID );
                assert( ber_pvt_sb_in_use( c->c_sb ) );
+
+       c->c_activitytime = slap_get_time();
        }
 
        return c;
@@ -324,7 +326,7 @@ long connection_init(
     c->c_n_ops_completed = 0;
 #endif
 
-    c->c_starttime = slap_get_time();
+    c->c_activitytime = c->c_starttime = slap_get_time();
 
     ber_pvt_sb_set_desc( c->c_sb, s );
     ber_pvt_sb_set_io( c->c_sb, &ber_pvt_sb_io_tcp, NULL );
@@ -362,7 +364,7 @@ connection_destroy( Connection *c )
 #endif
     c->c_protocol = 0;
 
-    c->c_starttime = 0;
+    c->c_activitytime = c->c_starttime = 0;
 
     if(c->c_dn != NULL) {
         free(c->c_dn);
index c1ee2a993cfbfed78d48c018f14ab39272ed4400..b2ea44db1d519e6db12be391a7cbc44e3de91434 100644 (file)
@@ -36,6 +36,7 @@ monitor_info( Connection *conn, Operation *op )
 #ifdef LDAP_COUNTERS
     int        i;
     char       buf2[22]
+    char       buf3[22]
        Connection *c;
        int                     connindex;
 #endif
@@ -88,19 +89,27 @@ monitor_info( Connection *conn, Operation *op )
 #ifndef LDAP_LOCALTIME
                ltm = gmtime( &c->c_starttime );
                strftime( buf2, sizeof(buf2), "%Y%m%d%H%M%SZ", ltm );
+
+               ltm = gmtime( &c->.c_activitytime );
+               strftime( buf3, sizeof(buf2), "%y%m%d%H%M%SZ", ltm );
 #else
                ltm = localtime( &c->.c_starttime );
                strftime( buf2, sizeof(buf2), "%y%m%d%H%M%SZ", ltm );
+
+               ltm = localtime( &c->.c_activitytime );
+               strftime( buf3, sizeof(buf2), "%y%m%d%H%M%SZ", ltm );
 #endif
+
                ldap_pvt_thread_mutex_unlock( &gmtime_mutex );
 
-               sprintf( buf, "%d : %s : %d : %d : %s : %s%s%s%s", i,
+               sprintf( buf, "%d : %s : %d : %d : %s : %s%s%s%s : %s", i,
                    buf2, c[i].c_n_ops_received, c[i].c_n_ops_completed,
                    c[i].c_cdn ? c[i].c_cdn : "NULLDN",
                    c[i].c_currentber ? "r" : "",
                    c[i].c_writewaiter ? "w" : "",
                    c[i].c_ops != NULL ? "x" : "",
                    c[i].c_pending_ops != NULL ? "p" : ""
+                       buf3
                );
 
                val.bv_val = buf;
index 9b7b48ea18b46e1af1a798ebb79bebe596c3c333..517875c2e831c4223787a2e860c230f5e436d1ee 100644 (file)
@@ -300,6 +300,7 @@ extern int          deftime;
 extern int             g_argc;
 extern int             global_default_access;
 extern int             global_lastmod;
+extern int             global_idletimeout;
 extern int             global_schemacheck;
 extern int             lber_debug;
 extern int             ldap_syslog;
index 0b22132604e75ec0ec37b276ea0b5f70988f0440..6c5a3ce7e4093619cadc4ba8056a8c8d61c064f0 100644 (file)
@@ -509,6 +509,7 @@ typedef struct slap_conn {
 
        /* only can be changed by connect_init */
        time_t          c_starttime;    /* when the connection was opened */
+       time_t          c_activitytime; /* when the connection was last used */
        long            c_connid;       /* id of this connection for stats*/
        char            *c_client_addr; /* address of client */
        char            *c_client_name; /* name of client */