]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/main.c
add logs; fix bug in group/dn selection logic
[openldap] / servers / slapd / main.c
index 4ed2c6cc6d1f4ad9823ce98937a0e8a48ee0d9ed..91887448df8db77dc31acd81f6001455b05c5f52 100644 (file)
@@ -65,7 +65,8 @@ static struct sockaddr_in     bind_addr;
 #endif
 
 typedef int (MainFunc) LDAP_P(( int argc, char *argv[] ));
-extern MainFunc slapadd, slapcat, slapdn, slapindex, slappasswd, slaptest;
+extern MainFunc slapadd, slapcat, slapdn, slapindex, slappasswd,
+       slaptest, slapauth;
 
 static struct {
        char *name;
@@ -77,6 +78,13 @@ static struct {
        {"slapindex", slapindex},
        {"slappasswd", slappasswd},
        {"slaptest", slaptest},
+       {"slapauth", slapauth},
+       /* NOTE: new tools must be added in chronological order,
+        * not in alphabetical order, because for backwards
+        * compatibility name[4] is used to identify the
+        * tools; so name[4]=='a' must refer to "slapadd" and
+        * not to "slapauth".  Alphabetical order can be used
+        * for tools whose name[4] is not used yet */
        {NULL, NULL}
 };
 
@@ -119,10 +127,8 @@ static int   cnvt_str2int( char *, STRDISP_P, int );
 #endif /* LOG_LOCAL4 */
 
 #define CHECK_NONE     0x00
-#define        CHECK_CONFIG    0x01
-#define CHECK_DN       0x02
+#define CHECK_CONFIG   0x01
 static int check = CHECK_NONE;
-static struct berval check_dn = BER_BVC("");
 static int version = 0;
 
 static void
@@ -133,7 +139,8 @@ usage( char *name )
        fprintf( stderr,
                "\t-4\t\tIPv4 only\n"
                "\t-6\t\tIPv6 only\n"
-               "\t-T (a|c|i|p)\tRun in Tool mode\n"
+               "\t-T {add|auth|cat|dn|index|passwd|test}\n"
+               "\t\t\tRun in Tool mode\n"
                "\t-c cookie\tSync cookie of consumer\n"
                "\t-d level\tDebug level" "\n"
                "\t-f filename\tConfiguration file\n"
@@ -149,8 +156,6 @@ usage( char *name )
                "\t-r directory\tSandbox directory to chroot to\n"
 #endif
                "\t-s level\tSyslog level\n"
-               "\t-t\t\tCheck configuration file and exit\n"
-               "\t-D dn\tCheck dn and exit\n"
 #if defined(HAVE_SETUID) && defined(HAVE_SETGID)
                "\t-u user\t\tUser (id or name) to run as\n"
                "\t-V\t\tprint version info (-VV only)\n"
@@ -189,7 +194,7 @@ int main( int argc, char **argv )
        char        *serverName;
        int         serverMode = SLAP_SERVER_MODE;
 
-       struct berval cookie = { 0, NULL };
+       struct berval cookie = BER_BVNULL;
        struct sync_cookie *scp = NULL;
        struct sync_cookie *scp_entry = NULL;
 
@@ -199,6 +204,8 @@ int main( int argc, char **argv )
                leakfile = stderr;
        }
 #endif
+       char    *serverNamePrefix = "";
+       size_t  l;
 
        sl_mem_init();
 
@@ -273,7 +280,7 @@ int main( int argc, char **argv )
 #endif
 
        while ( (i = getopt( argc, argv,
-                            "c:d:D:f:h:s:n:tT:V"
+                            "c:d:f:h:s:n:tT:V"
 #if LDAP_PF_INET6
                                "46"
 #endif
@@ -377,26 +384,39 @@ int main( int argc, char **argv )
                        break;
 
                case 't':
+                       /* deprecated; use slaptest instead */
+                       fprintf( stderr, "option -t deprecated; "
+                               "use slaptest command instead\n" );
                        check |= CHECK_CONFIG;
                        break;
 
-               case 'D':
-                       check |= CHECK_DN;
-                       check_dn.bv_val = optarg;
-                       check_dn.bv_len = strlen( optarg );
-                       break;
-
                case 'V':
                        version++;
                        break;
 
                case 'T':
-                       for (i=0; tools[i].name; i++) {
-                               if ( optarg[0] == tools[i].name[4] ) {
-                                       rc = tools[i].func(argc, argv);
-                                       MAIN_RETURN(rc);
+                       /* try full option string first */
+                       for ( i = 0; tools[i].name; i++ ) {
+                               if ( strcmp( optarg, &tools[i].name[4] ) == 0 ) {
+                                       rc = tools[i].func( argc, argv );
+                                       MAIN_RETURN( rc );
+                               }
+                       }
+
+                       /* try bits of option string (backward compatibility for single char) */
+                       l = strlen( optarg );
+                       for ( i = 0; tools[i].name; i++ ) {
+                               if ( strncmp( optarg, &tools[i].name[4], l ) == 0 ) {
+                                       rc = tools[i].func( argc, argv );
+                                       MAIN_RETURN( rc );
                                }
                        }
+                       
+                       /* issue error */
+                       serverName = optarg;
+                       serverNamePrefix = "slap";
+                       fprintf( stderr, "program name \"%s%s\" unrecognized; "
+                                       "aborting...\n", serverNamePrefix, serverName );
                        /* FALLTHRU */
                default:
                        usage( argv[0] );
@@ -586,32 +606,6 @@ int main( int argc, char **argv )
                goto destroy;
        }
 
-       if ( check & CHECK_DN ) {
-               struct berval   pdn, ndn;
-               
-               rc = dnPrettyNormal( NULL, &check_dn,
-                                       &pdn, &ndn, NULL );
-               if ( rc != LDAP_SUCCESS ) {
-                       fprintf( stderr, "DN: <%s> check failed %d (%s)\n",
-                                       check_dn.bv_val, rc,
-                                       ldap_err2string( rc ) );
-                       rc = 1;
-                       
-               } else {
-                       fprintf( stderr, "DN: <%s> check succeeded\n"
-                                       "normalized: <%s>\n"
-                                       "pretty:     <%s>\n",
-                                       check_dn.bv_val,
-                                       ndn.bv_val, pdn.bv_val );
-                       rc = 0;
-               }
-
-               check &= ~CHECK_DN;
-               if ( check == CHECK_NONE ) {
-                       goto destroy;
-               }
-       }
-
 #ifdef HAVE_TLS
        rc = ldap_pvt_tls_init();
        if( rc != 0) {