]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/daemon.c
Silence a warning about ldap_debug
[openldap] / servers / slapd / daemon.c
index c13b4ae87602378bf9a2577db8cb873b35d0d10c..6180e391b580922dbffc5a23a44be3d1fa892d41 100644 (file)
@@ -1,6 +1,6 @@
 /* $OpenLDAP$ */
 /*
- * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 
@@ -30,26 +30,14 @@ int deny_severity = LOG_NOTICE;
 
 #ifdef LDAP_PF_LOCAL
 #include <sys/stat.h>
+/* this should go in <ldap.h> as soon as it is accepted */
+#define LDAPI_MOD_URLEXT               "x-mod"
 #endif /* LDAP_PF_LOCAL */
 
 /* globals */
 time_t starttime;
 ber_socket_t dtblsize;
 
-typedef struct slap_listener {
-       char* sl_url;
-       char* sl_name;
-#ifdef HAVE_TLS
-       int             sl_is_tls;
-#endif
-#ifdef LDAP_CONNECTIONLESS
-       int     sl_is_udp;              /* UDP listener is also data port */
-#endif
-       ber_socket_t            sl_sd;
-       Sockaddr sl_sa;
-#define sl_addr        sl_sa.sa_in_addr
-} Listener;
-
 Listener **slap_listeners = NULL;
 
 #define SLAPD_LISTEN 10
@@ -114,8 +102,8 @@ void slapd_slp_init( const char* urls ) {
                                slapd_srvurls[i] = (char *) realloc( slapd_srvurls[i],
                                        strlen( host ) +
                                        sizeof( LDAP_SRVTYPE_PREFIX ) );
-                               strcpy( slapd_srvurls[i], LDAP_SRVTYPE_PREFIX );
-                               strcat( slapd_srvurls[i], host );
+                               strcpy( slap_strcopy(slapd_srvurls[i],
+                                       LDAP_SRVTYPE_PREFIX ), host );
 
                                ch_free( host );
                        }
@@ -126,8 +114,8 @@ void slapd_slp_init( const char* urls ) {
                                slapd_srvurls[i] = (char *) realloc( slapd_srvurls[i],
                                        strlen( host ) +
                                        sizeof( LDAPS_SRVTYPE_PREFIX ) );
-                               strcpy( slapd_srvurls[i], LDAPS_SRVTYPE_PREFIX );
-                               strcat( slapd_srvurls[i], host );
+                               strcpy( slap_strcopy(slapd_srvurls[i],
+                                       LDAPS_SRVTYPE_PREFIX ), host );
 
                                ch_free( host );
                        }
@@ -317,6 +305,171 @@ static void slap_free_listener_addresses(struct sockaddr **sal)
        ch_free(sal);
 }
 
+#ifdef LDAP_PF_LOCAL
+static int get_url_perms(
+       char    **exts,
+       mode_t  *perms,
+       int     *crit )
+{
+       int     i;
+
+       assert( exts );
+       assert( perms );
+       assert( crit );
+
+       *crit = 0;
+       for ( i = 0; exts[ i ]; i++ ) {
+               char    *type = exts[ i ];
+               int     c = 0;
+
+               if ( type[ 0 ] == '!' ) {
+                       c = 1;
+                       type++;
+               }
+
+               if ( strncasecmp( type, LDAPI_MOD_URLEXT "=", sizeof(LDAPI_MOD_URLEXT "=") - 1 ) == 0 ) {
+                       char    *value = type + sizeof(LDAPI_MOD_URLEXT "=") - 1;
+                       mode_t  p = 0;
+
+#if 0
+                       if ( strlen( value ) != 9 ) {
+                               return LDAP_OTHER;
+                       }
+
+                       switch ( value[ 0 ] ) {
+                       case 'r':
+                               p |= S_IRUSR;
+                               break;
+                       case '-':
+                               break;
+                       default:
+                               return LDAP_OTHER;
+                       } 
+
+                       switch ( value[ 1 ] ) {
+                       case 'w':
+                               p |= S_IWUSR;
+                               break;
+                       case '-':
+                               break;
+                       default:
+                               return LDAP_OTHER;
+                       } 
+
+                       switch ( value[ 2 ] ) {
+                       case 'x':
+                               p |= S_IXUSR;
+                               break;
+                       case '-':
+                               break;
+                       default:
+                               return LDAP_OTHER;
+                       } 
+
+                       switch ( value[ 3 ] ) {
+                       case 'r':
+                               p |= S_IRGRP;
+                               break;
+                       case '-':
+                               break;
+                       default:
+                               return LDAP_OTHER;
+                       } 
+
+                       switch ( value[ 4 ] ) {
+                       case 'w':
+                               p |= S_IWGRP;
+                               break;
+                       case '-':
+                               break;
+                       default:
+                               return LDAP_OTHER;
+                       } 
+
+                       switch ( value[ 5 ] ) {
+                       case 'x':
+                               p |= S_IXGRP;
+                               break;
+                       case '-':
+                               break;
+                       default:
+                               return LDAP_OTHER;
+                       } 
+
+                       switch ( value[ 6 ] ) {
+                       case 'r':
+                               p |= S_IROTH;
+                               break;
+                       case '-':
+                               break;
+                       default:
+                               return LDAP_OTHER;
+                       } 
+
+                       switch ( value[ 7 ] ) {
+                       case 'w':
+                               p |= S_IWOTH;
+                               break;
+                       case '-':
+                               break;
+                       default:
+                               return LDAP_OTHER;
+                       } 
+
+                       switch ( value[ 8 ] ) {
+                       case 'x':
+                               p |= S_IXOTH;
+                               break;
+                       case '-':
+                               break;
+                       default:
+                               return LDAP_OTHER;
+                       } 
+#else
+                       if ( strlen(value) != 3 ) {
+                               return LDAP_OTHER;
+                       } 
+
+                       switch ( value[ 0 ] ) {
+                       case 'w':
+                               p |= S_IRWXU;
+                               break;
+                       case '-':
+                               break;
+                       default:
+                               return LDAP_OTHER;
+                       } 
+
+                       switch ( value[ 1 ] ) {
+                       case 'w':
+                               p |= S_IRWXG;
+                               break;
+                       case '-':
+                               break;
+                       default:
+                               return LDAP_OTHER;
+                       } 
+
+                       switch ( value[ 2 ] ) {
+                       case 'w':
+                               p |= S_IRWXO;
+                               break;
+                       case '-':
+                               break;
+                       default:
+                               return LDAP_OTHER;
+                       } 
+#endif
+
+                       *crit = c;
+                       *perms = p;
+
+                       return LDAP_SUCCESS;
+               }
+       }
+}
+#endif /* LDAP_PF_LOCAL */
+
 /* port = 0 indicates AF_LOCAL */
 static int slap_get_listener_addresses(
        const char *host,
@@ -385,7 +538,7 @@ static int slap_get_listener_addresses(
                for (n=2; (sai = sai->ai_next) != NULL; n++) {
                        /* EMPTY */ ;
                }
-               *sal = ch_malloc(n * sizeof(void *));
+               *sal = ch_calloc(n, sizeof(void *));
                if (*sal == NULL) {
                        return -1;
                }
@@ -500,6 +653,10 @@ static Listener * slap_open_listener(
        int err, addrlen = 0;
        struct sockaddr **sal, **psal;
        int socktype = SOCK_STREAM;     /* default to COTS */
+#ifdef LDAP_PF_LOCAL
+       mode_t  perms = S_IRWXU;
+       int     crit = 1;
+#endif
 
        rc = ldap_url_parse( url, &lud );
 
@@ -553,6 +710,10 @@ static Listener * slap_open_listener(
                } else {
                        err = slap_get_listener_addresses(lud->lud_host, 0, &sal);
                }
+
+               if ( lud->lud_exts ) {
+                       err = get_url_perms( lud->lud_exts, &perms, &crit );
+               }
 #else
 
 #ifdef NEW_LOGGING
@@ -707,7 +868,7 @@ static Listener * slap_open_listener(
 #ifdef LDAP_PF_LOCAL
        case AF_LOCAL: {
                char *addr = ((struct sockaddr_un *)*sal)->sun_path;
-               if ( chmod( addr, S_IRWXU ) < 0 ) {
+               if ( chmod( addr, perms ) < 0 && crit ) {
                        int err = sock_errno();
 #ifdef NEW_LOGGING
                        LDAP_LOG(( "connection", LDAP_LEVEL_INFO,
@@ -733,11 +894,10 @@ static Listener * slap_open_listener(
                inet_ntop( AF_INET, &((struct sockaddr_in *)*sal)->sin_addr,
                           addr, sizeof(addr) );
                s = addr;
-               port = ((struct sockaddr_in *)*sal) ->sin_port;
 #else
-               s = inet_ntoa( l.sl_addr.sin_addr );
-               port = l.sl_addr.sin_port;
+               s = inet_ntoa( ((struct sockaddr_in *) *sal)->sin_addr );
 #endif
+               port = ((struct sockaddr_in *)*sal) ->sin_port;
                l.sl_name = ch_malloc( sizeof("IP=255.255.255.255:65535") );
                sprintf( l.sl_name, "IP=%s:%d",
                         s != NULL ? s : "unknown" , port );
@@ -1328,6 +1488,7 @@ slapd_daemon_task(
                        case AF_LOCAL:
                                sprintf( peername, "PATH=%s", from.sa_un_addr.sun_path );
                                ssf = LDAP_PVT_SASL_LOCAL_SSF;
+                               dnsname = "local";
                                break;
 #endif /* LDAP_PF_LOCAL */
 
@@ -1675,9 +1836,15 @@ slapd_daemon_task(
                        }
 #endif /* LDAP_PF_LOCAL */
                        slapd_close( slap_listeners[l]->sl_sd );
-                       break;
                }
+               if ( slap_listeners[l]->sl_url )
+                       free ( slap_listeners[l]->sl_url );
+               if ( slap_listeners[l]->sl_name )
+                       free ( slap_listeners[l]->sl_name );
+               free ( slap_listeners[l] );
        }
+       free ( slap_listeners );
+       slap_listeners = NULL;
 
 #ifdef NEW_LOGGING
        LDAP_LOG(( "connection", LDAP_LEVEL_CRIT,
@@ -1829,3 +1996,7 @@ slap_sig_wake( int sig )
 void slapd_add_internal(ber_socket_t s) {
        slapd_add(s);
 }
+
+Listener ** slapd_get_listeners(void) {
+       return slap_listeners;
+}