コード例 #1
0
int Mariadb_nodes::check_galera()
{
    int res1 = 0;
    char str[1024];
    int cluster_size;
    MYSQL *conn;
    printf("Checking Galera\n"); fflush(stdout);
    for (int i = 0; i < N; i++) {
        conn = open_conn(port[i], IP[i], user_name, password, ssl);
        if (mysql_errno(conn) != 0) {
            printf("Error connectiong node %d\n", i);
            res1 = 1;
        } else {
            if (find_field(conn, (char *) "SHOW STATUS WHERE Variable_name='wsrep_cluster_size';", (char *) "Value", str) != 0) {
                printf("wsrep_cluster_size is not found in SHOW STATUS LIKE 'wsrep%%' results\n"); fflush(stdout);
                res1 = 1;
            } else {
                sscanf(str, "%d",  &cluster_size);
                if (cluster_size != N ) {
                    printf("wsrep_cluster_size is not %d\n", N); fflush(stdout);
                    res1 = 1;
                }
            }
        }
        mysql_close(conn);
    }
    return(res1);
}
コード例 #2
0
ファイル: help.c プロジェクト: rezalas/riftshadow
void do_modhelp(CHAR_DATA *ch, char *argument)
{
	MYSQL *conn;
	MYSQL_RES *res_set;
	MYSQL_ROW row;
	char query[MSL*2];
	int id;
	if(!str_cmp(argument,"") || !is_number(argument))
		return send_to_char("Syntax: modhelp <id>\n\r",ch);
	conn = open_conn();
        if(!conn)
                return send_to_char("Error opening help database.\n\r",ch);
	id = atoi(argument);
	sprintf(query, "SELECT * from helpfiles where id=%d", id);
	mysql_query(conn,query);
        res_set = mysql_store_result (conn);
        if (res_set == NULL)
                        send_to_char("Error accessing that id number.\n\r",ch);
	else
	{
			row = mysql_fetch_row (res_set);
			ch->pcdata->helpid	 = id;
			ch->pcdata->entered_text = palloc_string(row[4]);
			enter_text(ch, modhelp_end_fun);
			mysql_free_result(res_set);
	}
        do_disc(conn);

}
コード例 #3
0
int main(int argc, char *argv[])
{
  MYSQL *conn_rwsplit;

  int i;
  int global_result = 0;

  char ip[15];
  char maxscaleIP[15];
  char ip1[15];

  int IP_end;
  int NodesNum;

  if (argc != 3) { printf("Usage: ./rw_select_insert Last_digits_of_IP number_of_VM\n"); exit(2); }

  sscanf(argv[1], "%d", &IP_end);
  if ( (IP_end < 0) || (IP_end > 255) ) { printf("Wrong last digits of IP\n"); exit(2); }
  sprintf(ip, "192.168.122.%d", IP_end);
  sprintf(maxscaleIP, "192.168.122.%s", getenv("maxscaleIP"));
  
  sscanf(argv[2], "%d", &NodesNum);
  if ( (NodesNum < 3) || (NodesNum > 255) ) { printf("Wrong number of nodes\n"); exit(2); }
   NodesNum--;

  tolerance=0;
  // Connecting to all nodes
  if (connect_all_nodes(nodes, IP_end, NodesNum) != 0) {exit(2);}

  // connect to the MaxScale server (rwsplit)
  conn_rwsplit = open_conn(4006, maxscaleIP);
  if (conn_rwsplit == NULL ) {
    printf("Can't connect to MaxScale\n");
    exit(1);
  } else {
 
    global_result += execute_query(conn_rwsplit, "DROP TABLE IF EXISTS t1;");
    global_result += execute_query(conn_rwsplit, "create table t1 (x1 int);");


    get_global_status_allnodes(&selects[0], &inserts[0], nodes, NodesNum, silent);
    global_result += execute_query(conn_rwsplit, "select * from t1;"); 
    get_global_status_allnodes(&new_selects[0], &new_inserts[0], nodes, NodesNum, silent);
    print_delta(&new_selects[0], &new_inserts[0], &selects[0], &inserts[0], NodesNum);


    global_result += execute_query(conn_rwsplit, "insert into t1 values(1);"); 
    get_global_status_allnodes(&new_selects[0], &new_inserts[0], nodes, NodesNum, silent);
    print_delta(&new_selects[0], &new_inserts[0], &selects[0], &inserts[0], NodesNum); 

  // close connections
    mysql_close(conn_rwsplit);
  }
  for (i=0; i<NodesNum; i++) { mysql_close(nodes[i]); }

  exit(global_result);
}
コード例 #4
0
int Mariadb_nodes::check_replication(int master)
{
    int res1 = 0;
    char str[1024];
    MYSQL *conn;
    MYSQL_RES *res;
    printf("Checking Master/Slave setup\n"); fflush(stdout);
    for (int i = 0; i < N; i++) {
        conn = open_conn(port[i], IP[i], user_name, password, ssl);
        if (mysql_errno(conn) != 0) {
            printf("Error connectiong node %d\n", i); fflush(stdout);
            res1 = 1;
        } else {
            if ( i == master ) {
                // checking master
                if (conn != NULL ) {
                    if(mysql_query(conn, (char *) "SHOW SLAVE HOSTS;") != 0) {
                        printf("%s\n", mysql_error(conn));
                        res1 = 1;
                    } else {
                        res = mysql_store_result(conn);
                        if(res == NULL) {
                            printf("Error: can't get the result description\n"); fflush(stdout);
                            res1 = 1;
                        } else {
                            if (mysql_num_rows(res) != N-1) {
                                printf("Number if slaves is not equal to N-1\n"); fflush(stdout);
                                res1 = 1;
                            }
                        }
                        mysql_free_result(res);
                        do {
                            res = mysql_store_result(conn);
                            mysql_free_result(res);
                        } while ( mysql_next_result(conn) == 0 );
                    }
                }

            } else {
                // checking slave
                if (find_field(conn, (char *) "SHOW SLAVE STATUS;", (char *) "Slave_IO_Running", str) != 0) {
                    printf("Slave_IO_Running is not found in SHOW SLAVE STATUS results\n"); fflush(stdout);
                    res1 = 1;
                } else {
                    if (strcmp(str, "Yes") !=0 ) {
                        printf("Slave_IO_Running is not Yes\n"); fflush(stdout);
                        res1 = 1;
                    }
                }
            }
        }
        mysql_close(conn);
    }
    return(res1);
}
コード例 #5
0
ファイル: help.c プロジェクト: rezalas/riftshadow
void modhelp_end_fun(CHAR_DATA *ch, char *argument)
{
	MYSQL *conn;
	char query[MSL*3], results[MSL];
	conn = open_conn();
        sprintf(query,"UPDATE helpfiles SET helpdata=\"%s\" WHERE id=%d", argument, ch->pcdata->helpid);
        mysql_query(conn, query);
        sprintf(results,"%i helpfiles updated.\n\r", (int)mysql_affected_rows(conn));
	send_to_char(results, ch);
	do_disc(conn);
}
コード例 #6
0
std::auto_ptr<BackupProtocolCallable> connect_to_bbstored(TLSContext& rContext)
{
	// Make a protocol
	std::auto_ptr<BackupProtocolCallable> protocol(new
		BackupProtocolClient(open_conn("localhost", rContext)));
	
	// Check the version
	std::auto_ptr<BackupProtocolVersion> serverVersion(
		protocol->QueryVersion(BACKUP_STORE_SERVER_VERSION));
	TEST_THAT(serverVersion->GetVersion() == BACKUP_STORE_SERVER_VERSION);

	return protocol;
}
コード例 #7
0
ファイル: CNetComm.cpp プロジェクト: Zhanyin/taomee
int
CNetComm::safe_net_out (const char *sndbuf, int sndlen)
{
	DEBUG_LOG("enter the safe_net_out ....");
	int len = net_out(sndbuf, sndlen);
	if (len == -1) {
		DEBUG_LOG("reconnect the server ...");
		if (open_conn() == -1) {
			close_conn();
			DEBUG_LOG("reconnect the server fail !");
			return -1;
		}

		return net_out(sndbuf, sndlen); //send the data second time
	}

	return len;
}
コード例 #8
0
ファイル: help.c プロジェクト: rezalas/riftshadow
void do_listhelp(CHAR_DATA *ch, char *argument)
{
	MYSQL		*conn;
	MYSQL_FIELD	*field;
	MYSQL_ROW	row;
	MYSQL_RES 	*res_set;
	char buf[MSL], query[MSL], arg1[MSL];
	if(!str_cmp(argument,""))
	{
		send_to_char("Syntax: listhelp all\n\r",ch);
		send_to_char("        listhelp <field> <value>\n\r",ch);
		send_to_char("        Valid fields are: id, title, skill, minlevel, helpdata\n\r",ch);
		send_to_char("        You can search for substrings by entering them normally.\n\r",ch);
		return;
	}
	argument = one_argument(argument,arg1);
	if(!str_cmp(arg1,"ALL"))
		sprintf(query, "select * from helpfiles");
	else
		sprintf(query, "select * from helpfiles where %s RLIKE '%s'", arg1, argument);
	conn = open_conn();
	if(!conn)
		return send_to_char("Error opening help database.\n\r",ch);
	mysql_query (conn, query);
	res_set = mysql_store_result (conn);
	if (res_set == NULL || mysql_field_count(conn)<1)
			send_to_char("Error accessing results.\n\r",ch);
	else
	{
		while((row = mysql_fetch_row (res_set)) != NULL)
		{
			mysql_field_seek (res_set, 0);
			field	= mysql_fetch_field (res_set);
                	sprintf(buf, "Help ID: %s\n\rHelp Title: %s\n\rRequired Skill: %s\n\rMinimum Level: %s\n\r",
                        	row[0], row[1], row[2], row[3]);
                	send_to_char(buf,ch);
        	        sprintf(buf,"Help Text:\n\r%s\n\r", row[4]);
	                send_to_char(buf,ch);
		}
		mysql_free_result(res_set);
	}
	do_disc (conn);
}
コード例 #9
0
int main(int argc, char *argv[])
{
    TestConnections * Test = new TestConnections(argc, argv);
    Test->set_timeout(20);
    int i, j;
    MYSQL * conn;

    int N_cmd = 2;
    char * fail_cmd[N_cmd - 1];

    int N_ports = 3;
    int ports[N_ports];

    fail_cmd[0] = (char *) "fail backendfd";
    fail_cmd[1] = (char *) "fail clientfd";

    ports[0] = Test->rwsplit_port;
    ports[1] = Test->readconn_master_port;
    ports[2] = Test->readconn_slave_port;

    for (i = 0; i < N_cmd; i++)
    {
        for (j = 0; j < N_ports; j++)
        {
            Test->tprintf("Executing MaxAdmin command '%s'\n", fail_cmd[i]);
            if (execute_maxadmin_command(Test->maxscale_IP, (char *) "admin", Test->maxadmin_password, fail_cmd[i]) != 0)
            {
                Test->add_result(1, "MaxAdmin command failed\n");
            }
            else
            {
                printf("Trying query against %d\n", ports[j]);
                conn = open_conn(ports[j], Test->maxscale_IP, Test->maxscale_user, Test->maxscale_user, Test->ssl);
                Test->try_query(conn, (char *) "show processlist;");
            }
        }
    }

    Test->check_maxscale_alive();
    int rval = Test->global_result;
    delete Test;
    return rval;
}
コード例 #10
0
ファイル: help.c プロジェクト: rezalas/riftshadow
void do_addhelp(CHAR_DATA *ch, char *argument)
{
	MYSQL *conn;
	char buf[MSL*3], title[MSL], skill[MSL], arg[MSL], *ttitle;
	char *escape, *escape2;
	int minlevel;
	if(!str_cmp(argument,""))
	{
		send_to_char("Syntax: addhelp edit\n\r",ch);
		send_to_char("Syntax: addhelp 'help title' 'skill required' minimumlevel\n\r",ch);
		send_to_char("Example: addhelp 'HELP NEW FORMAT' 'none' 0\n\r",ch);
		send_to_char("Any words in the title will be keywords, case insensitive, that the help command searches for.\n\r",ch);
		send_to_char("The skill required is the name of a skill you must have at 1% or greater to view the help.\n\r",ch);
		send_to_char("It should only be used for cabal power helpfiles and other semi-secret helpfiles and should be 'none' otherwise.\n\r",ch);
		send_to_char("Minimum level is the minimum level required to view this helpfile, and should have a 0 if it's not\n\r",ch);
		send_to_char("an immortal or level dependant helpfile.\n\r",ch);
		send_to_char("Addhelp edit will allow you to change and add the actual text of your helpfile, and must be done first.\n\r",ch);
		return;
	}
	if(!str_cmp(argument, "edit"))
		return enter_text(ch, addhelp_end_fun);
	if(!ch->pcdata->entered_text || ch->pcdata->entered_text[0] == '\0' || !str_cmp(ch->pcdata->entered_text, ""))
		return send_to_char("You haven't specified the contents of your helpfile.\n\r",ch);
	conn = open_conn();
        if(!conn)
                return send_to_char("Error opening help database.\n\r",ch);
	argument = one_argument(argument,title);
	argument = one_argument(argument,skill);
	argument = one_argument(argument,arg);
	ttitle = palloc_string(upstring(title));
	minlevel = atoi(arg);
	escape = (char *)escape_string(ttitle);
	escape2 = (char *)escape_string(ch->pcdata->entered_text);
	sprintf(buf,"INSERT INTO helpfiles VALUES(NULL, \"%s\", \"%s\", %d, \"%s\")",
		escape, skill, minlevel, escape2);
	mysql_query(conn, buf);
	sprintf(buf,"Help file added:\n\rTitle: %s\n\rSkill Required: %s\n\rMinimum Level: %d\n\rHelp Text: %s\n\r",
			ttitle, skill, minlevel, ch->pcdata->entered_text);
	send_to_char(buf,ch);
	do_disc(conn);
}
コード例 #11
0
ファイル: help.c プロジェクト: rezalas/riftshadow
void do_delhelp(CHAR_DATA *ch, char *argument)
{
	MYSQL *conn;
	char buf[MSL];
	int id;
	if(!str_cmp(argument,""))
	{
		send_to_char("Syntax: delhelp <id #>\n\r",ch);
		send_to_char("        Deletes the helpfile with the given ID number.\n\r",ch);
		return;
	}
	conn = open_conn();
        if(!conn)
                return send_to_char("Error opening help database.\n\r",ch);
	if(!is_number(argument))
		return send_to_char("Argument must be a number.\n\r",ch);
	id = atoi(argument);
	sprintf(buf,"DELETE FROM helpfiles WHERE id=%d", id);
	mysql_query(conn, buf);
	sprintf(buf,"%i helpfiles deleted.\n\r", (int)mysql_affected_rows(conn));
	send_to_char(buf,ch);
	do_disc(conn);
}
コード例 #12
0
ファイル: help.c プロジェクト: rezalas/riftshadow
void do_help(CHAR_DATA *ch, char *argument)
{
	int numresults=0;
	MYSQL *conn;
	MYSQL_RES *res_set = NULL, *res_set2 = NULL;
	MYSQL_ROW row;
	char query[MSL*2], buf[MSL];

	if(!str_cmp(argument,""))
		return do_help(ch, "topics");
	else
	{
		if((!is_alphanum(argument) && !have_space(argument)) || have_schar(argument))
			return do_help(ch, "topics");
	}

	conn = open_conn();
	if(!conn)
		return send_to_char("Error opening help database.\n\r",ch);

	if(is_number(argument))
		sprintf(query,"select * from helpfiles where id=%d", atoi(argument));
	else if(!is_number(argument))
		sprintf(query,"select * from helpfiles where title RLIKE '%s' ORDER BY id ASC", argument);

	mysql_query(conn,query);
	res_set = mysql_store_result(conn);
	numresults = mysql_affected_rows(conn);
	
	if(!numresults || (res_set == NULL && mysql_field_count(conn)>0))
		send_to_char("No matching helpfiles found.\n\r",ch);
	else if(numresults == 1)
	{
		row = mysql_fetch_row (res_set);
		if(!can_see_help(ch, row, TRUE))
			send_to_char("No matching helpfiles found.\n\r",ch);
		else
			show_helpfile(ch, row);
	}
	else
	{
		sprintf(query,"select * from helpfiles where title RLIKE '\\'%s\\'' OR title = '%s'", argument, argument);
		mysql_query(conn,query);
		res_set2 = mysql_store_result(conn);
		numresults = mysql_affected_rows(conn);
		if(numresults > 0)
		{
			row = mysql_fetch_row(res_set2);
			if(!can_see_help(ch, row, FALSE))
				send_to_char("No matching helpfiles found.\n\r", ch);
			else
			{
				show_helpfile(ch, row);
				mysql_free_result(res_set2);
			}
		}
		else
		{
			send_to_char("Multiple helpfiles matched your request:\n\r",ch);
			while((row = mysql_fetch_row (res_set)) != NULL)
        	{
	   			if(!can_see_help(ch,row, FALSE))
					continue;
	   			sprintf(buf,"%-5s %s\n\r", row[0], row[1]);
	   			send_to_char(buf,ch);
        	}
		}
	}
	mysql_free_result (res_set);
	do_disc(conn);
}
コード例 #13
0
int Mariadb_nodes::connect()
{
    for (int i = 0; i < N; i++) {
        nodes[i] = open_conn(port[i], IP[i], user_name, password, ssl);
    }
}
コード例 #14
0
ファイル: CNetComm.cpp プロジェクト: Zhanyin/taomee
CNetComm::CNetComm (const char *i, u_short p) : port (p) , sockfd (-1)
{
	strcpy (this->ip, i);
	open_conn ();
}
コード例 #15
0
void test_binlog(TestConnections* Test)
{
    int i;
    MYSQL* binlog;
    Test->repl->connect();

    Test->set_timeout(100);
    Test->try_query(Test->repl->nodes[0], (char *) "SET NAMES utf8mb4");
    Test->try_query(Test->repl->nodes[0], (char *) "set autocommit=1");
    Test->try_query(Test->repl->nodes[0], (char *) "select USER()");

    Test->set_timeout(100);
    create_t1(Test->repl->nodes[0]);
    Test->add_result(insert_into_t1(Test->repl->nodes[0], 4), "Data inserting to t1 failed\n");
    Test->stop_timeout();
    Test->tprintf("Sleeping to let replication happen\n");
    sleep(60);

    for (i = 0; i < Test->repl->N; i++)
    {
        Test->tprintf("Checking data from node %d (%s)\n", i, Test->repl->IP[i]);
        Test->set_timeout(100);
        Test->add_result(select_from_t1(Test->repl->nodes[i], 4), "Selecting from t1 failed\n");
        Test->stop_timeout();
    }

    Test->set_timeout(10);
    Test->tprintf("First transaction test (with ROLLBACK)\n");
    start_transaction(Test);

    Test->set_timeout(50);

    Test->tprintf("SELECT * FROM t1 WHERE fl=10, checking inserted values\n");
    Test->add_result(execute_query_check_one(Test->repl->nodes[0], (char *) "SELECT * FROM t1 WHERE fl=10",
                     "111"), "SELECT check failed\n");

    //Test->add_result(check_sha1(Test), "sha1 check failed\n");

    Test->tprintf("ROLLBACK\n");
    Test->try_query(Test->repl->nodes[0], (char *) "ROLLBACK");
    Test->tprintf("INSERT INTO t1 VALUES(112, 10)\n");
    Test->try_query(Test->repl->nodes[0], (char *) "INSERT INTO t1 VALUES(112, 10)");
    Test->try_query(Test->repl->nodes[0], (char *) "COMMIT");
    Test->stop_timeout();
    sleep(20);

    Test->set_timeout(20);
    Test->tprintf("SELECT * FROM t1 WHERE fl=10, checking inserted values\n");
    Test->add_result(execute_query_check_one(Test->repl->nodes[0], (char *) "SELECT * FROM t1 WHERE fl=10",
                     "112"), "SELECT check failed\n");

    Test->tprintf("SELECT * FROM t1 WHERE fl=10, checking inserted values from slave\n");
    Test->add_result(execute_query_check_one(Test->repl->nodes[2], (char *) "SELECT * FROM t1 WHERE fl=10",
                     "112"), "SELECT check failed\n");
    Test->tprintf("DELETE FROM t1 WHERE fl=10\n");
    Test->try_query(Test->repl->nodes[0], (char *) "DELETE FROM t1 WHERE fl=10");
    Test->tprintf("Checking t1\n");
    Test->add_result(select_from_t1(Test->repl->nodes[0], 4), "SELECT from t1 failed\n");

    Test->tprintf("Second transaction test (with COMMIT)\n");
    start_transaction(Test);

    Test->tprintf("COMMIT\n");
    Test->try_query(Test->repl->nodes[0], (char *) "COMMIT");

    Test->tprintf("SELECT, checking inserted values\n");
    Test->add_result(execute_query_check_one(Test->repl->nodes[0], (char *) "SELECT * FROM t1 WHERE fl=10",
                     "111"), "SELECT check failed\n");

    Test->tprintf("SELECT, checking inserted values from slave\n");
    Test->add_result(execute_query_check_one(Test->repl->nodes[2], (char *) "SELECT * FROM t1 WHERE fl=10",
                     "111"), "SELECT check failed\n");
    Test->tprintf("DELETE FROM t1 WHERE fl=10\n");
    Test->try_query(Test->repl->nodes[0], (char *) "DELETE FROM t1 WHERE fl=10");

    Test->stop_timeout();

    Test->set_timeout(50);
    Test->add_result(check_sha1(Test), "sha1 check failed\n");
    Test->repl->close_connections();

    Test->stop_timeout();

    // test SLAVE STOP/START
    for (int j = 0; j < 3; j++)
    {
        Test->set_timeout(100);
        Test->repl->connect();

        Test->tprintf("Dropping and re-creating t1\n");
        Test->try_query(Test->repl->nodes[0], (char *) "DROP TABLE IF EXISTS t1");
        create_t1(Test->repl->nodes[0]);

        Test->tprintf("Connecting to MaxScale binlog router\n");
        binlog = open_conn(Test->binlog_port, Test->maxscale_IP, Test->repl->user_name, Test->repl->password,
                           Test->ssl);

        Test->tprintf("STOP SLAVE against Maxscale binlog\n");
        execute_query(binlog, (char *) "STOP SLAVE");

        if (j == 1)
        {
            Test->tprintf("FLUSH LOGS on master\n");
            execute_query(Test->repl->nodes[0], (char *) "FLUSH LOGS");
        }
        Test->add_result(insert_into_t1(Test->repl->nodes[0], 4), "INSERT into t1 failed\n");

        Test->tprintf("START SLAVE against Maxscale binlog\n");
        Test->try_query(binlog, (char *) "START SLAVE");

        Test->tprintf("Sleeping to let replication happen\n");
        Test->stop_timeout();
        sleep(30);

        for (i = 0; i < Test->repl->N; i++)
        {
            Test->set_timeout(50);
            Test->tprintf("Checking data from node %d (%s)\n", i, Test->repl->IP[i]);
            Test->add_result(select_from_t1(Test->repl->nodes[i], 4), "SELECT from t1 failed\n");
        }

        Test->set_timeout(100);
        Test->add_result(check_sha1(Test), "sha1 check failed\n");
        Test->repl->close_connections();
        Test->stop_timeout();
    }
}
コード例 #16
0
ファイル: ldapproxy.c プロジェクト: Zabrane/SPOCP
spocp_result_t
ldapproxy_test(cmd_param_t * cpp, octet_t * blob)
{
	spocp_result_t	r = SPOCP_DENIED;
	LDAP		*ld = 0;
	becon_t		*bc = 0;
	octarr_t	*argv;
	octet_t		*oct, *domain;
	pdyn_t		*dyn = cpp->pd;
	char		***ava = 0, *tmp, *filter, *fqdn;
	char 		*attr = 0, *val, *dn, **attrs = 0;
	char 		*xml;
	srvrec_t	*sr, *nsr;
	int		i, j;
	
	if (cpp->arg == 0 || cpp->arg->len == 0)
		return SPOCP_MISSING_ARG;

	if ((oct = element_atom_sub(cpp->arg, cpp->x)) == 0)
		return SPOCP_SYNTAXERROR;

	argv = oct_split( oct, ':', '\\', 0,0 );

	traceLog( LOG_DEBUG,"argc: %d", argv->n);

	domain = argv->arr[0];

	tmp = oct2strdup( domain, 0);
	fqdn = normalize(tmp);
	free(tmp);
	traceLog( LOG_DEBUG,"domain: %s", fqdn);

	if (dyn == 0 || (bc = becon_get(domain, dyn->bcp)) == 0) {
		/* find the server/-s */
		if(( sr = dnssrv_lookup( fqdn, "ldap")) == 0 ) {
			traceLog(LOG_DEBUG,"SRV record lookup failed");
			sr = ( srvrec_t * ) calloc( 1, sizeof( srvrec_t ));
			sr->srv = ( char * ) calloc( domain->len+7, sizeof( char ));
			tmp = oct2strdup( domain, 0 );
			snprintf(sr->srv, domain->len+6,"ldap.%s", tmp );
			free( tmp ); 
		}

		for( nsr = sr ; nsr ; nsr = nsr->next ) {
			/* should pick the one with the lowest priority first */
			LOG(SPOCP_DEBUG)
			    traceLog(LOG_DEBUG, "Trying %s:%d", nsr->srv, nsr->port);
			ld = open_conn(nsr->srv, nsr->port, &r);

			if (ld)
				break ;
		}

		srvrec_free( sr );

		if (ld == 0)
			r = SPOCP_UNAVAILABLE;
		else if (dyn && dyn->size) {
			if (!dyn->bcp)
				dyn->bcp = becpool_new(dyn->size);
			bc = becon_push(domain, &P_ldapclose, (void *) ld, dyn->bcp);
		}
	} else
		ld = (LDAP *) bc->con;

	if (r != SPOCP_UNAVAILABLE) {
		/* get the baseDN */
		dn = fqdn2dn( fqdn );
		free( fqdn );

		/* create the filter */
		val = oct2strdup( argv->arr[1], 0 );
		if( argv->n == 3 ) 
			attr = oct2strdup( argv->arr[2], 0 );
		else
			attr = "uid";

		filter = (char *)malloc( strlen(attr) + strlen(val) +4);
		sprintf( filter, "(%s=%s)", attr, val );

		traceLog(LOG_DEBUG, "Filter: %s, DN: %s", filter, dn);

		if( cpp->conf )
			attrs = match_base( (ainfo_t *) cpp->conf, dn );

		if (attrs == 0)
			attrs = defattrs;

		/* do the stuff */
	
		ava = do_ldap_query( ld, dn, filter, attrs, &r);

		if (bc)
			becon_return(bc);
		else
			ldap_unbind_s(ld);

		free(val);
		free(filter);
		free(dn);

		if( argv->n == 3) 
			free(attr);

	}

	/* create the blob */

	if (ava) {
		xml = do_xml( ava );
		oct_assign( blob, xml );
		blob->size = blob->len;
		traceLog(LOG_DEBUG, "%s", xml);

		for( i = 0; ava[i] ; i++) {
			for( j = 0; ava[i][j] ; j++) free( ava[i][j] );
			free( ava[i] );
		}
		free(ava);
	}

	if (oct != cpp->arg)
		oct_free(oct);

	return r;
}