int main( int argc, char **argv ) { int i; char *uri = NULL; char *host = "localhost"; char *dn = NULL; char *base = NULL; char *filter = "(objectClass=person)"; struct berval pass = { 0, NULL }; char *pwattr = NULL; int port = -1; int loops = LOOPS; int outerloops = 1; int force = 0; int chaserefs = 0; int noinit = 1; int delay = 0; /* extra action to do after bind... */ struct berval type[] = { BER_BVC( "tester=" ), BER_BVC( "add=" ), BER_BVC( "bind=" ), BER_BVC( "modify=" ), BER_BVC( "modrdn=" ), BER_BVC( "read=" ), BER_BVC( "search=" ), BER_BVNULL }; LDAPURLDesc *extra_ludp = NULL; tester_init( "slapd-bind", TESTER_BIND ); /* by default, tolerate invalid credentials */ tester_ignore_str2errlist( "INVALID_CREDENTIALS" ); while ( ( i = getopt( argc, argv, "a:B:b:D:Ff:H:h:Ii:L:l:p:t:w:" ) ) != EOF ) { switch ( i ) { case 'a': pwattr = optarg; break; case 'b': /* base DN of a tree of user DNs */ base = optarg; break; case 'B': { int c; for ( c = 0; type[c].bv_val; c++ ) { if ( strncasecmp( optarg, type[c].bv_val, type[c].bv_len ) == 0 ) { break; } } if ( type[c].bv_val == NULL ) { usage( argv[0], 'B' ); } switch ( c ) { case TESTER_TESTER: case TESTER_BIND: /* invalid */ usage( argv[0], 'B' ); case TESTER_SEARCH: { if ( ldap_url_parse( &optarg[type[c].bv_len], &extra_ludp ) != LDAP_URL_SUCCESS ) { usage( argv[0], 'B' ); } } break; case TESTER_ADDEL: case TESTER_MODIFY: case TESTER_MODRDN: case TESTER_READ: /* nothing to do */ break; default: assert( 0 ); } } break; case 'C': chaserefs++; break; case 'H': /* the server uri */ uri = optarg; break; case 'h': /* the servers host */ host = optarg; break; case 'i': tester_ignore_str2errlist( optarg ); break; case 'p': /* the servers port */ if ( lutil_atoi( &port, optarg ) != 0 ) { usage( argv[0], 'p' ); } break; case 'D': dn = optarg; break; case 'w': ber_str2bv( optarg, 0, 1, &pass ); memset( optarg, '*', pass.bv_len ); break; case 'l': /* the number of loops */ if ( lutil_atoi( &loops, optarg ) != 0 ) { usage( argv[0], 'l' ); } break; case 'L': /* the number of outerloops */ if ( lutil_atoi( &outerloops, optarg ) != 0 ) { usage( argv[0], 'L' ); } break; case 'f': filter = optarg; break; case 'F': force++; break; case 'I': /* reuse connection */ noinit = 0; break; case 't': /* sleep between binds */ if ( lutil_atoi( &delay, optarg ) != 0 ) { usage( argv[0], 't' ); } break; default: usage( argv[0], i ); break; } } if ( port == -1 && uri == NULL ) { usage( argv[0], '\0' ); } uri = tester_uri( uri, host, port ); for ( i = 0; i < outerloops; i++ ) { int rc; if ( base != NULL ) { rc = do_base( uri, dn, &pass, base, filter, pwattr, loops, force, chaserefs, noinit, delay, -1, NULL ); } else { rc = do_bind( uri, dn, &pass, loops, force, chaserefs, noinit, NULL, -1, NULL ); } if ( rc == LDAP_SERVER_DOWN ) break; } exit( EXIT_SUCCESS ); }
VOID VSafePrintf(PCSTR pszMsg, va_list args, PCHAR pszBuffer, LONG cbBuffer) { PCHAR pszOut = pszBuffer; PCHAR pszEnd = pszBuffer + cbBuffer - 1; pszBuffer[0] = '\0'; __try { while (*pszMsg && pszOut < pszEnd) { if (*pszMsg == '%') { CHAR szHead[4] = ""; INT nLen; INT nWidth = 0; INT nPrecision = 0; BOOL fLeft = FALSE; BOOL fPositive = FALSE; BOOL fPound = FALSE; BOOL fBlank = FALSE; BOOL fZero = FALSE; BOOL fDigit = FALSE; BOOL fSmall = FALSE; BOOL fLarge = FALSE; BOOL f64Bit = FALSE; PCSTR pszArg = pszMsg; pszMsg++; for (; (*pszMsg == '-' || *pszMsg == '+' || *pszMsg == '#' || *pszMsg == ' ' || *pszMsg == '0'); pszMsg++) { switch (*pszMsg) { case '-': fLeft = TRUE; break; case '+': fPositive = TRUE; break; case '#': fPound = TRUE; break; case ' ': fBlank = TRUE; break; case '0': fZero = TRUE; break; } } if (*pszMsg == '*') { nWidth = va_arg(args, INT); pszMsg++; } else { while (*pszMsg >= '0' && *pszMsg <= '9') { nWidth = nWidth * 10 + (*pszMsg++ - '0'); } } if (*pszMsg == '.') { pszMsg++; fDigit = TRUE; if (*pszMsg == '*') { nPrecision = va_arg(args, INT); pszMsg++; } else { while (*pszMsg >= '0' && *pszMsg <= '9') { nPrecision = nPrecision * 10 + (*pszMsg++ - '0'); } } } if (*pszMsg == 'h') { fSmall = TRUE; pszMsg++; } else if (*pszMsg == 'l') { fLarge = TRUE; pszMsg++; } else if (*pszMsg == 'I' && pszMsg[1] == '6' && pszMsg[2] == '4') { f64Bit = TRUE; pszMsg += 3; } if (*pszMsg == 's' || *pszMsg == 'e' || *pszMsg == 'c') { // We ignore the length, precision, and alignment // to avoid using a temporary buffer. if (*pszMsg == 's') { // [GalenH] need to not use temp. PVOID pvData = va_arg(args, PVOID); pszMsg++; if (fSmall) { fLarge = FALSE; } __try { if (pvData == NULL) { pszOut = do_str(pszOut, pszEnd, "<NULL>"); } else if (pvData < (PVOID)0x10000) { pszOut = do_str(pszOut, pszEnd, "#"); pszOut = do_base(pszOut, (UINT64)pvData, 16, "0123456789ABCDEF"); pszOut = do_str(pszOut, pszEnd, "#"); } else if (fLarge) { pszOut = do_wstr(pszOut, pszEnd, (PWCHAR)pvData); } else { pszOut = do_str(pszOut, pszEnd, (PCHAR)pvData); } } __except(EXCEPTION_EXECUTE_HANDLER) { pszOut = do_str(pszOut, pszEnd, "-"); pszOut = do_base(pszOut, (UINT64)pvData, 16, "0123456789ABCDEF"); pszOut = do_str(pszOut, pszEnd, "-"); } } else if (*pszMsg == 'e') { // Escape the string. PVOID pvData = va_arg(args, PVOID); pszMsg++; if (fSmall) { fLarge = FALSE; } __try { if (pvData == NULL) { pszOut = do_str(pszOut, pszEnd, "<NULL>"); } else if (pvData < (PVOID)0x10000) { pszOut = do_str(pszOut, pszEnd, ">"); pszOut = do_base(pszOut, (UINT64)pvData, 16, "0123456789ABCDEF"); pszOut = do_str(pszOut, pszEnd, ">"); } else if (fLarge) { pszOut = do_ewstr(pszOut, pszEnd, (PWCHAR)pvData); } else { pszOut = do_estr(pszOut, pszEnd, (PCHAR)pvData); } } __except(EXCEPTION_EXECUTE_HANDLER) { pszOut = do_str(pszOut, pszEnd, "-"); pszOut = do_base(pszOut, (UINT64)pvData, 16, "0123456789ABCDEF"); pszOut = do_str(pszOut, pszEnd, "-"); } } else {