diff -ruN openldap-1.2.9/servers/slapd/config.c openldap-1.2.9-kos/servers/slapd/config.c
--- openldap-1.2.9/servers/slapd/config.c	Tue Mar  2 18:30:05 1999
+++ openldap-1.2.9-kos/servers/slapd/config.c	Wed Mar 29 08:37:44 2000
@@ -26,6 +26,10 @@
 
 char   *slapd_pid_file  = NULL;
 char   *slapd_args_file = NULL;
+char *slapd_bind_address = NULL;
+char *slapd_bind_port = NULL;
+char *slapd_uid = NULL;
+char *slapd_gid = NULL;
 
 static char	*fp_getline(FILE *fp, int *lineno);
 static void	fp_getline_init(int *lineno);
@@ -453,6 +457,35 @@
 				exit( 1 );
 			}
 			ldap_srvtab = ch_strdup( cargv[1] );
+		       
+		} else if(strcasecmp(cargv[0], "bind_address") == 0) {
+		  if(cargc < 2) {
+		    Debug(LDAP_DEBUG_ANY, "%s: line %d: No address specified for bind_address\n",
+			  fname, lineno, 0 );
+		    exit( 1 );
+		  }
+		  slapd_bind_address = ch_strdup(cargv[1]);
+		} else if(strcasecmp(cargv[0], "bind_port") == 0) {
+		  if(cargc < 2) {
+		    Debug(LDAP_DEBUG_ANY, "%s: line %d: No port specified for bind_port\n",
+			  fname, lineno, 0 );
+		    exit( 1 );
+		  }
+		  slapd_bind_port = ch_strdup(cargv[1]);
+		} else if(strcasecmp(cargv[0], "uid") == 0) {
+		  if(cargc < 2) {
+		    Debug(LDAP_DEBUG_ANY, "%s: line %d: No uid specified for uid config line\n",
+			  fname, lineno, 0 );
+		    exit( 1 );
+		  }
+		  slapd_uid = ch_strdup(cargv[1]);
+		} else if(strcasecmp(cargv[0], "gid") == 0) {
+		  if(cargc < 2) {
+		    Debug(LDAP_DEBUG_ANY, "%s: line %d: No gid specified for gid config line\n",
+			  fname, lineno, 0 );
+		    exit( 1 );
+		  }
+		  slapd_gid = ch_strdup(cargv[1]);
 
 		/* pass anything else to the current backend config routine */
 		} else {
diff -ruN openldap-1.2.9/servers/slapd/daemon.c openldap-1.2.9-kos/servers/slapd/daemon.c
--- openldap-1.2.9/servers/slapd/daemon.c	Tue Jan 18 01:10:21 2000
+++ openldap-1.2.9-kos/servers/slapd/daemon.c	Wed Mar 29 08:45:39 2000
@@ -41,10 +41,14 @@
 /* a link to the slapd.conf configuration parameters */
 extern char *slapd_pid_file;
 extern char *slapd_args_file;
+extern char *slapd_bind_address;
+extern char *slapd_bind_port;
+extern char *slapd_uid;
+extern char *slapd_gid;
 
 void *
 slapd_daemon(
-    void *port
+    void *notused
 )
 {
 	Operation		*o;
@@ -135,8 +139,19 @@
 
 	(void) memset( (void *) &addr, '\0', sizeof(addr) );
 	addr.sin_family = AF_INET;
-	addr.sin_addr.s_addr = INADDR_ANY;
-	addr.sin_port = htons( (int)port );
+
+	if(slapd_bind_address) {
+	  addr.sin_addr.s_addr = inet_addr(slapd_bind_address);
+	} else {
+	  addr.sin_addr.s_addr = INADDR_ANY;
+	}
+
+	if(slapd_bind_port) {
+	  addr.sin_port = htons(atoi(slapd_bind_port));
+	} else {
+	  addr.sin_port = LDAP_PORT;
+	}
+
 	if ( bind( tcps, (struct sockaddr *) &addr, sizeof(addr) ) == -1 ) {
 		int err = errno;
 		Debug( LDAP_DEBUG_ANY, "bind() failed errno %d (%s)\n",
@@ -169,6 +184,11 @@
 		fprintf( fp, "\n" );
 		fclose( fp );
 	}
+
+	if(slapd_gid)
+	  setreuid((gid_t)atoi(slapd_gid), (gid_t)atoi(slapd_gid));
+	if(slapd_uid)
+	  setreuid((uid_t)atoi(slapd_uid), (uid_t)atoi(slapd_uid));
 
 	while ( !slapd_shutdown ) {
 		struct sockaddr_in	from;

