mirror of
https://github.com/samba-team/samba.git
synced 2025-02-26 21:57:41 +03:00
Convert lib/wb_reqtrans.c to unix calling conventions
This commit is contained in:
parent
6f320d0208
commit
b475a1e7eb
@ -41,24 +41,24 @@ wbcErr tevent_req_simple_recv_wbcerr(struct tevent_req *req);
|
||||
struct tevent_req *wb_req_read_send(TALLOC_CTX *mem_ctx,
|
||||
struct tevent_context *ev,
|
||||
int fd, size_t max_extra_data);
|
||||
wbcErr wb_req_read_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
|
||||
struct winbindd_request **preq);
|
||||
ssize_t wb_req_read_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
|
||||
struct winbindd_request **preq, int *err);
|
||||
|
||||
struct tevent_req *wb_req_write_send(TALLOC_CTX *mem_ctx,
|
||||
struct tevent_context *ev,
|
||||
struct tevent_queue *queue, int fd,
|
||||
struct winbindd_request *wb_req);
|
||||
wbcErr wb_req_write_recv(struct tevent_req *req);
|
||||
ssize_t wb_req_write_recv(struct tevent_req *req, int *err);
|
||||
|
||||
struct tevent_req *wb_resp_read_send(TALLOC_CTX *mem_ctx,
|
||||
struct tevent_context *ev, int fd);
|
||||
wbcErr wb_resp_read_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
|
||||
struct winbindd_response **presp);
|
||||
ssize_t wb_resp_read_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
|
||||
struct winbindd_response **presp, int *err);
|
||||
|
||||
struct tevent_req *wb_resp_write_send(TALLOC_CTX *mem_ctx,
|
||||
struct tevent_context *ev,
|
||||
struct tevent_queue *queue, int fd,
|
||||
struct winbindd_response *wb_resp);
|
||||
wbcErr wb_resp_write_recv(struct tevent_req *req);
|
||||
ssize_t wb_resp_write_recv(struct tevent_req *req, int *err);
|
||||
|
||||
#endif /*_WBC_ASYNC_H_*/
|
||||
|
@ -25,60 +25,10 @@
|
||||
#undef DBGC_CLASS
|
||||
#define DBGC_CLASS DBGC_WINBIND
|
||||
|
||||
wbcErr map_wbc_err_from_errno(int error)
|
||||
{
|
||||
switch(error) {
|
||||
case EPERM:
|
||||
case EACCES:
|
||||
return WBC_ERR_AUTH_ERROR;
|
||||
case ENOMEM:
|
||||
return WBC_ERR_NO_MEMORY;
|
||||
case EIO:
|
||||
default:
|
||||
return WBC_ERR_UNKNOWN_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
bool tevent_req_is_wbcerr(struct tevent_req *req, wbcErr *pwbc_err)
|
||||
{
|
||||
enum tevent_req_state state;
|
||||
uint64_t error;
|
||||
if (!tevent_req_is_error(req, &state, &error)) {
|
||||
*pwbc_err = WBC_ERR_SUCCESS;
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (state) {
|
||||
case TEVENT_REQ_USER_ERROR:
|
||||
*pwbc_err = error;
|
||||
break;
|
||||
case TEVENT_REQ_TIMED_OUT:
|
||||
*pwbc_err = WBC_ERR_UNKNOWN_FAILURE;
|
||||
break;
|
||||
case TEVENT_REQ_NO_MEMORY:
|
||||
*pwbc_err = WBC_ERR_NO_MEMORY;
|
||||
break;
|
||||
default:
|
||||
*pwbc_err = WBC_ERR_UNKNOWN_FAILURE;
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
wbcErr tevent_req_simple_recv_wbcerr(struct tevent_req *req)
|
||||
{
|
||||
wbcErr wbc_err;
|
||||
|
||||
if (tevent_req_is_wbcerr(req, &wbc_err)) {
|
||||
return wbc_err;
|
||||
}
|
||||
|
||||
return WBC_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
struct req_read_state {
|
||||
struct winbindd_request *wb_req;
|
||||
size_t max_extra_data;
|
||||
ssize_t ret;
|
||||
};
|
||||
|
||||
static ssize_t wb_req_more(uint8_t *buf, size_t buflen, void *private_data);
|
||||
@ -139,13 +89,12 @@ static void wb_req_read_done(struct tevent_req *subreq)
|
||||
struct req_read_state *state = tevent_req_data(
|
||||
req, struct req_read_state);
|
||||
int err;
|
||||
ssize_t ret;
|
||||
uint8_t *buf;
|
||||
|
||||
ret = read_packet_recv(subreq, state, &buf, &err);
|
||||
state->ret = read_packet_recv(subreq, state, &buf, &err);
|
||||
TALLOC_FREE(subreq);
|
||||
if (ret == -1) {
|
||||
tevent_req_error(req, map_wbc_err_from_errno(err));
|
||||
if (state->ret == -1) {
|
||||
tevent_req_error(req, err);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -160,22 +109,22 @@ static void wb_req_read_done(struct tevent_req *subreq)
|
||||
tevent_req_done(req);
|
||||
}
|
||||
|
||||
wbcErr wb_req_read_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
|
||||
struct winbindd_request **preq)
|
||||
ssize_t wb_req_read_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
|
||||
struct winbindd_request **preq, int *err)
|
||||
{
|
||||
struct req_read_state *state = tevent_req_data(
|
||||
req, struct req_read_state);
|
||||
wbcErr wbc_err;
|
||||
|
||||
if (tevent_req_is_wbcerr(req, &wbc_err)) {
|
||||
return wbc_err;
|
||||
if (tevent_req_is_unix_error(req, err)) {
|
||||
return -1;
|
||||
}
|
||||
*preq = talloc_move(mem_ctx, &state->wb_req);
|
||||
return WBC_ERR_SUCCESS;
|
||||
return state->ret;
|
||||
}
|
||||
|
||||
struct req_write_state {
|
||||
struct iovec iov[2];
|
||||
ssize_t ret;
|
||||
};
|
||||
|
||||
static void wb_req_write_done(struct tevent_req *subreq);
|
||||
@ -215,25 +164,33 @@ static void wb_req_write_done(struct tevent_req *subreq)
|
||||
{
|
||||
struct tevent_req *req = tevent_req_callback_data(
|
||||
subreq, struct tevent_req);
|
||||
struct req_write_state *state = tevent_req_data(
|
||||
req, struct req_write_state);
|
||||
int err;
|
||||
ssize_t ret;
|
||||
|
||||
ret = writev_recv(subreq, &err);
|
||||
state->ret = writev_recv(subreq, &err);
|
||||
TALLOC_FREE(subreq);
|
||||
if (ret < 0) {
|
||||
tevent_req_error(req, map_wbc_err_from_errno(err));
|
||||
if (state->ret < 0) {
|
||||
tevent_req_error(req, err);
|
||||
return;
|
||||
}
|
||||
tevent_req_done(req);
|
||||
}
|
||||
|
||||
wbcErr wb_req_write_recv(struct tevent_req *req)
|
||||
ssize_t wb_req_write_recv(struct tevent_req *req, int *err)
|
||||
{
|
||||
return tevent_req_simple_recv_wbcerr(req);
|
||||
struct req_write_state *state = tevent_req_data(
|
||||
req, struct req_write_state);
|
||||
|
||||
if (tevent_req_is_unix_error(req, err)) {
|
||||
return -1;
|
||||
}
|
||||
return state->ret;
|
||||
}
|
||||
|
||||
struct resp_read_state {
|
||||
struct winbindd_response *wb_resp;
|
||||
ssize_t ret;
|
||||
};
|
||||
|
||||
static ssize_t wb_resp_more(uint8_t *buf, size_t buflen, void *private_data);
|
||||
@ -282,12 +239,11 @@ static void wb_resp_read_done(struct tevent_req *subreq)
|
||||
req, struct resp_read_state);
|
||||
uint8_t *buf;
|
||||
int err;
|
||||
ssize_t ret;
|
||||
|
||||
ret = read_packet_recv(subreq, state, &buf, &err);
|
||||
state->ret = read_packet_recv(subreq, state, &buf, &err);
|
||||
TALLOC_FREE(subreq);
|
||||
if (ret == -1) {
|
||||
tevent_req_error(req, map_wbc_err_from_errno(err));
|
||||
if (state->ret == -1) {
|
||||
tevent_req_error(req, err);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -302,22 +258,22 @@ static void wb_resp_read_done(struct tevent_req *subreq)
|
||||
tevent_req_done(req);
|
||||
}
|
||||
|
||||
wbcErr wb_resp_read_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
|
||||
struct winbindd_response **presp)
|
||||
ssize_t wb_resp_read_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
|
||||
struct winbindd_response **presp, int *err)
|
||||
{
|
||||
struct resp_read_state *state = tevent_req_data(
|
||||
req, struct resp_read_state);
|
||||
wbcErr wbc_err;
|
||||
|
||||
if (tevent_req_is_wbcerr(req, &wbc_err)) {
|
||||
return wbc_err;
|
||||
if (tevent_req_is_unix_error(req, err)) {
|
||||
return -1;
|
||||
}
|
||||
*presp = talloc_move(mem_ctx, &state->wb_resp);
|
||||
return WBC_ERR_SUCCESS;
|
||||
return state->ret;
|
||||
}
|
||||
|
||||
struct resp_write_state {
|
||||
struct iovec iov[2];
|
||||
ssize_t ret;
|
||||
};
|
||||
|
||||
static void wb_resp_write_done(struct tevent_req *subreq);
|
||||
@ -358,19 +314,26 @@ static void wb_resp_write_done(struct tevent_req *subreq)
|
||||
{
|
||||
struct tevent_req *req = tevent_req_callback_data(
|
||||
subreq, struct tevent_req);
|
||||
struct resp_write_state *state = tevent_req_data(
|
||||
req, struct resp_write_state);
|
||||
int err;
|
||||
ssize_t ret;
|
||||
|
||||
ret = writev_recv(subreq, &err);
|
||||
state->ret = writev_recv(subreq, &err);
|
||||
TALLOC_FREE(subreq);
|
||||
if (ret < 0) {
|
||||
tevent_req_error(req, map_wbc_err_from_errno(err));
|
||||
if (state->ret < 0) {
|
||||
tevent_req_error(req, err);
|
||||
return;
|
||||
}
|
||||
tevent_req_done(req);
|
||||
}
|
||||
|
||||
wbcErr wb_resp_write_recv(struct tevent_req *req)
|
||||
ssize_t wb_resp_write_recv(struct tevent_req *req, int *err)
|
||||
{
|
||||
return tevent_req_simple_recv_wbcerr(req);
|
||||
struct resp_write_state *state = tevent_req_data(
|
||||
req, struct resp_write_state);
|
||||
|
||||
if (tevent_req_is_unix_error(req, err)) {
|
||||
return -1;
|
||||
}
|
||||
return state->ret;
|
||||
}
|
||||
|
@ -20,6 +20,57 @@
|
||||
#include "includes.h"
|
||||
#include "wbc_async.h"
|
||||
|
||||
wbcErr map_wbc_err_from_errno(int error)
|
||||
{
|
||||
switch(error) {
|
||||
case EPERM:
|
||||
case EACCES:
|
||||
return WBC_ERR_AUTH_ERROR;
|
||||
case ENOMEM:
|
||||
return WBC_ERR_NO_MEMORY;
|
||||
case EIO:
|
||||
default:
|
||||
return WBC_ERR_UNKNOWN_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
bool tevent_req_is_wbcerr(struct tevent_req *req, wbcErr *pwbc_err)
|
||||
{
|
||||
enum tevent_req_state state;
|
||||
uint64_t error;
|
||||
if (!tevent_req_is_error(req, &state, &error)) {
|
||||
*pwbc_err = WBC_ERR_SUCCESS;
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (state) {
|
||||
case TEVENT_REQ_USER_ERROR:
|
||||
*pwbc_err = error;
|
||||
break;
|
||||
case TEVENT_REQ_TIMED_OUT:
|
||||
*pwbc_err = WBC_ERR_UNKNOWN_FAILURE;
|
||||
break;
|
||||
case TEVENT_REQ_NO_MEMORY:
|
||||
*pwbc_err = WBC_ERR_NO_MEMORY;
|
||||
break;
|
||||
default:
|
||||
*pwbc_err = WBC_ERR_UNKNOWN_FAILURE;
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
wbcErr tevent_req_simple_recv_wbcerr(struct tevent_req *req)
|
||||
{
|
||||
wbcErr wbc_err;
|
||||
|
||||
if (tevent_req_is_wbcerr(req, &wbc_err)) {
|
||||
return wbc_err;
|
||||
}
|
||||
|
||||
return WBC_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
struct wb_context {
|
||||
struct tevent_queue *queue;
|
||||
int fd;
|
||||
@ -320,12 +371,13 @@ static void wb_int_trans_write_done(struct tevent_req *subreq)
|
||||
subreq, struct tevent_req);
|
||||
struct wb_int_trans_state *state = tevent_req_data(
|
||||
req, struct wb_int_trans_state);
|
||||
wbcErr wbc_err;
|
||||
ssize_t ret;
|
||||
int err;
|
||||
|
||||
wbc_err = wb_req_write_recv(subreq);
|
||||
ret = wb_req_write_recv(subreq, &err);
|
||||
TALLOC_FREE(subreq);
|
||||
if (!WBC_ERROR_IS_OK(wbc_err)) {
|
||||
tevent_req_error(req, wbc_err);
|
||||
if (ret == -1) {
|
||||
tevent_req_error(req, map_wbc_err_from_errno(err));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -342,12 +394,13 @@ static void wb_int_trans_read_done(struct tevent_req *subreq)
|
||||
subreq, struct tevent_req);
|
||||
struct wb_int_trans_state *state = tevent_req_data(
|
||||
req, struct wb_int_trans_state);
|
||||
wbcErr wbc_err;
|
||||
ssize_t ret;
|
||||
int err;
|
||||
|
||||
wbc_err = wb_resp_read_recv(subreq, state, &state->wb_resp);
|
||||
ret = wb_resp_read_recv(subreq, state, &state->wb_resp, &err);
|
||||
TALLOC_FREE(subreq);
|
||||
if (!WBC_ERROR_IS_OK(wbc_err)) {
|
||||
tevent_req_error(req, wbc_err);
|
||||
if (ret == -1) {
|
||||
tevent_req_error(req, map_wbc_err_from_errno(err));
|
||||
return;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user