1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-03 12:58:35 +03:00

Convert wb_trans to tevent_req

This commit is contained in:
Volker Lendecke 2009-03-16 20:38:11 +01:00
parent 1624b58beb
commit 05b49fd4c8
3 changed files with 58 additions and 72 deletions

View File

@ -24,10 +24,11 @@
struct wb_context;
struct async_req *wb_trans_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
struct wb_context *wb_ctx, bool need_priv,
struct winbindd_request *wb_req);
wbcErr wb_trans_recv(struct async_req *req, TALLOC_CTX *mem_ctx,
struct tevent_req *wb_trans_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct wb_context *wb_ctx, bool need_priv,
struct winbindd_request *wb_req);
wbcErr wb_trans_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
struct winbindd_response **presponse);
struct wb_context *wb_context_init(TALLOC_CTX *mem_ctx);

View File

@ -21,7 +21,7 @@
#include "wbc_async.h"
struct wb_context {
struct async_req_queue *queue;
struct tevent_queue *queue;
int fd;
bool is_priv;
};
@ -144,7 +144,7 @@ struct wb_context *wb_context_init(TALLOC_CTX *mem_ctx)
if (result == NULL) {
return NULL;
}
result->queue = async_req_queue_init(result);
result->queue = tevent_queue_create(result, "wb_trans");
if (result->queue == NULL) {
TALLOC_FREE(result);
return NULL;
@ -553,41 +553,16 @@ static void wb_trans_connect_done(struct tevent_req *subreq);
static void wb_trans_done(struct tevent_req *subreq);
static void wb_trans_retry_wait_done(struct tevent_req *subreq);
static void wb_trigger_trans(struct async_req *req)
struct tevent_req *wb_trans_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct wb_context *wb_ctx, bool need_priv,
struct winbindd_request *wb_req)
{
struct wb_trans_state *state = talloc_get_type_abort(
req->private_data, struct wb_trans_state);
struct tevent_req *subreq;
if ((state->wb_ctx->fd == -1)
|| (state->need_priv && !state->wb_ctx->is_priv)) {
subreq = wb_open_pipe_send(state, state->ev, state->wb_ctx,
state->need_priv);
if (async_req_nomem(subreq, req)) {
return;
}
tevent_req_set_callback(subreq, wb_trans_connect_done, req);
return;
}
subreq = wb_int_trans_send(state, state->ev, NULL, state->wb_ctx->fd,
state->wb_req);
if (async_req_nomem(subreq, req)) {
return;
}
tevent_req_set_callback(subreq, wb_trans_done, req);
}
struct async_req *wb_trans_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
struct wb_context *wb_ctx, bool need_priv,
struct winbindd_request *wb_req)
{
struct async_req *result;
struct tevent_req *req, *subreq;
struct wb_trans_state *state;
if (!async_req_setup(mem_ctx, &result, &state,
struct wb_trans_state)) {
req = tevent_req_create(mem_ctx, &state, struct wb_trans_state);
if (req == NULL) {
return NULL;
}
state->wb_ctx = wb_ctx;
@ -596,17 +571,28 @@ struct async_req *wb_trans_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
state->num_retries = 10;
state->need_priv = need_priv;
if (!async_req_enqueue(wb_ctx->queue, ev, result, wb_trigger_trans)) {
if ((wb_ctx->fd == -1) || (need_priv && !wb_ctx->is_priv)) {
subreq = wb_open_pipe_send(state, ev, wb_ctx, need_priv);
if (subreq == NULL) {
goto fail;
}
tevent_req_set_callback(subreq, wb_trans_connect_done, req);
return req;
}
subreq = wb_int_trans_send(state, ev, wb_ctx->queue, wb_ctx->fd,
wb_req);
if (subreq == NULL) {
goto fail;
}
return result;
tevent_req_set_callback(subreq, wb_trans_done, req);
return req;
fail:
TALLOC_FREE(result);
TALLOC_FREE(req);
return NULL;
}
static bool wb_trans_retry(struct async_req *req,
static bool wb_trans_retry(struct tevent_req *req,
struct wb_trans_state *state,
wbcErr wbc_err)
{
@ -621,13 +607,13 @@ static bool wb_trans_retry(struct async_req *req,
* Winbind not around or we can't connect to the pipe. Fail
* immediately.
*/
async_req_error(req, wbc_err);
tevent_req_error(req, wbc_err);
return true;
}
state->num_retries -= 1;
if (state->num_retries == 0) {
async_req_error(req, wbc_err);
tevent_req_error(req, wbc_err);
return true;
}
@ -642,7 +628,7 @@ static bool wb_trans_retry(struct async_req *req,
subreq = tevent_wakeup_send(state, state->ev,
timeval_current_ofs(1, 0));
if (async_req_nomem(subreq, req)) {
if (tevent_req_nomem(subreq, req)) {
return true;
}
tevent_req_set_callback(subreq, wb_trans_retry_wait_done, req);
@ -651,22 +637,22 @@ static bool wb_trans_retry(struct async_req *req,
static void wb_trans_retry_wait_done(struct tevent_req *subreq)
{
struct async_req *req = tevent_req_callback_data(
subreq, struct async_req);
struct wb_trans_state *state = talloc_get_type_abort(
req->private_data, struct wb_trans_state);
struct tevent_req *req = tevent_req_callback_data(
subreq, struct tevent_req);
struct wb_trans_state *state = tevent_req_data(
req, struct wb_trans_state);
bool ret;
ret = tevent_wakeup_recv(subreq);
TALLOC_FREE(subreq);
if (!ret) {
async_req_error(req, WBC_ERR_UNKNOWN_FAILURE);
tevent_req_error(req, WBC_ERR_UNKNOWN_FAILURE);
return;
}
subreq = wb_open_pipe_send(state, state->ev, state->wb_ctx,
state->need_priv);
if (async_req_nomem(subreq, req)) {
state->need_priv);
if (tevent_req_nomem(subreq, req)) {
return;
}
tevent_req_set_callback(subreq, wb_trans_connect_done, req);
@ -674,10 +660,10 @@ static void wb_trans_retry_wait_done(struct tevent_req *subreq)
static void wb_trans_connect_done(struct tevent_req *subreq)
{
struct async_req *req = tevent_req_callback_data(
subreq, struct async_req);
struct wb_trans_state *state = talloc_get_type_abort(
req->private_data, struct wb_trans_state);
struct tevent_req *req = tevent_req_callback_data(
subreq, struct tevent_req);
struct wb_trans_state *state = tevent_req_data(
req, struct wb_trans_state);
wbcErr wbc_err;
wbc_err = wb_open_pipe_recv(subreq);
@ -689,7 +675,7 @@ static void wb_trans_connect_done(struct tevent_req *subreq)
subreq = wb_int_trans_send(state, state->ev, NULL, state->wb_ctx->fd,
state->wb_req);
if (async_req_nomem(subreq, req)) {
if (tevent_req_nomem(subreq, req)) {
return;
}
tevent_req_set_callback(subreq, wb_trans_done, req);
@ -697,10 +683,10 @@ static void wb_trans_connect_done(struct tevent_req *subreq)
static void wb_trans_done(struct tevent_req *subreq)
{
struct async_req *req = tevent_req_callback_data(
subreq, struct async_req);
struct wb_trans_state *state = talloc_get_type_abort(
req->private_data, struct wb_trans_state);
struct tevent_req *req = tevent_req_callback_data(
subreq, struct tevent_req);
struct wb_trans_state *state = tevent_req_data(
req, struct wb_trans_state);
wbcErr wbc_err;
wbc_err = wb_int_trans_recv(subreq, state, &state->wb_resp);
@ -710,17 +696,17 @@ static void wb_trans_done(struct tevent_req *subreq)
return;
}
async_req_done(req);
tevent_req_done(req);
}
wbcErr wb_trans_recv(struct async_req *req, TALLOC_CTX *mem_ctx,
wbcErr wb_trans_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
struct winbindd_response **presponse)
{
struct wb_trans_state *state = talloc_get_type_abort(
req->private_data, struct wb_trans_state);
struct wb_trans_state *state = tevent_req_data(
req, struct wb_trans_state);
wbcErr wbc_err;
if (async_req_is_wbcerr(req, &wbc_err)) {
if (tevent_req_is_wbcerr(req, &wbc_err)) {
return wbc_err;
}

View File

@ -5613,11 +5613,11 @@ static bool run_local_memcache(int dummy)
return ret;
}
static void wbclient_done(struct async_req *req)
static void wbclient_done(struct tevent_req *req)
{
wbcErr wbc_err;
struct winbindd_response *wb_resp;
int *i = (int *)req->async.priv;
int *i = (int *)tevent_req_callback_data_void(req);
wbc_err = wb_trans_recv(req, req, &wb_resp);
TALLOC_FREE(req);
@ -5654,14 +5654,13 @@ static bool run_local_wbclient(int dummy)
goto fail;
}
for (j=0; j<5; j++) {
struct async_req *req;
struct tevent_req *req;
req = wb_trans_send(ev, ev, wb_ctx[i],
(j % 2) == 0, &wb_req);
if (req == NULL) {
goto fail;
}
req->async.fn = wbclient_done;
req->async.priv = &i;
tevent_req_set_callback(req, wbclient_done, &i);
}
}