int client_prep_connection(struct client *cl,
int operation_timeout, int session_timeout,
iochan_man_t iochan,
- const struct timeval *abstime);
+ const struct timeval *abstime,
+ int ok_with_working);
void client_start_search(struct client *cl);
void client_set_session(struct client *cl, struct session *se);
int client_is_active(struct client *cl);
int client_prep_connection(struct client *cl,
int operation_timeout, int session_timeout,
iochan_man_t iochan_man,
- const struct timeval *abstime)
+ const struct timeval *abstime,
+ int ok_with_working)
{
struct connection *co;
struct session_database *sdb = client_get_database(cl);
if (co)
{
assert(co->host);
- if (co->host == host && client_get_state(cl) == Client_Idle)
+ if (co->host == host && (client_get_state(cl) == Client_Idle
+ || ok_with_working))
{
return 2;
}
{
struct client *cl = l->client;
struct timeval tval;
- if (client_prep_connection(cl, se->service->z3950_operation_timeout,
- se->service->z3950_session_timeout,
- se->service->server->iochan_man,
- &tval))
+ int ret = client_prep_connection(cl, se->service->z3950_operation_timeout,
+ se->service->z3950_session_timeout,
+ se->service->server->iochan_man,
+ &tval, 1);
+ if (ret)
client_start_search(cl);
}
session_leave(se);
client_prep_connection(cl, se->service->z3950_operation_timeout,
se->service->z3950_session_timeout,
se->service->server->iochan_man,
- &tval);
+ &tval, 0);
if (parse_ret == 1 && r == 2)
{
session_log(se, YLOG_LOG, "client REUSE %s", client_get_id(cl));