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;