implement the openzap wanpipe wait function using the cross platform poll from last commit.

git-svn-id: http://svn.openzap.org/svn/openzap/trunk@45 a93c3328-9c30-0410-af19-c9cd2b2d52af
This commit is contained in:
Michael Jerris 2007-05-20 05:46:09 +00:00
parent 631e7e61bb
commit 3685804c98
1 changed files with 34 additions and 116 deletions

View File

@ -313,57 +313,6 @@ static ZINT_COMMAND_FUNCTION(wanpipe_command)
#ifdef __WINDOWS__ #ifdef __WINDOWS__
static ZINT_WAIT_FUNCTION(wanpipe_wait_windows)
{
API_POLL_STRUCT api_poll;
zap_wait_flag_t inflags = *flags;
memset(&api_poll, 0x00, sizeof(API_POLL_STRUCT));
api_poll.user_flags_bitmap = inflags;
api_poll.timeout = to;
*flags = ZAP_NO_FLAGS;
if(DoApiPollCommand(zchan->sockfd, &api_poll)){
snprintf(zchan->last_error, sizeof(zchan->last_error), "Poll failed");
return ZAP_FAIL;
}
switch(api_poll.operation_status)
{
case SANG_STATUS_RX_DATA_AVAILABLE:
break;
default:
snprintf(zchan->last_error, sizeof(zchan->last_error), "Unknown Operation Status: %d\n", api_poll.operation_status);
return ZAP_FAIL;
}
if(api_poll.poll_events_bitmap == 0){
snprintf(zchan->last_error, sizeof(zchan->last_error), "invalid Poll Events bitmap: 0x%X\n", api_poll.poll_events_bitmap);
return ZAP_FAIL;
}
if (api_poll.poll_events_bitmap & POLL_EVENT_TIMEOUT) {
return ZAP_TIMEOUT;
}
if (api_poll.poll_events_bitmap & POLL_EVENT_RX_DATA) {
*flags |= ZAP_READ;
}
if (api_poll.poll_events_bitmap & POLL_EVENT_TX_READY) {
*flags |= ZAP_WRITE;
}
if (api_poll.poll_events_bitmap & POLL_EVENT_LINK_STATE) {
*flags |= ZAP_ERROR;
}
return ZAP_SUCCESS;
}
static ZINT_READ_FUNCTION(wanpipe_read_windows) static ZINT_READ_FUNCTION(wanpipe_read_windows)
{ {
zap_size_t rx_len = 0; zap_size_t rx_len = 0;
@ -465,69 +414,6 @@ static ZINT_WRITE_FUNCTION(wanpipe_write_windows)
#else #else
static ZINT_WAIT_FUNCTION(wanpipe_wait_unix)
{
fd_set read_fds, write_fds, error_fds, *r = NULL, *w = NULL, *e = NULL;
zap_wait_flag_t inflags = *flags;
int s;
struct timeval tv, *tvp = NULL;
if (to) {
memset(&tv, 0, sizeof(tv));
tv.tv_sec = to / 1000;
tv.tv_usec = (to % 1000) * 1000;
tvp = &tv;
}
FD_ZERO(&read_fds);
FD_ZERO(&write_fds);
FD_ZERO(&error_fds);
if (inflags & ZAP_READ) {
r = &read_fds;
FD_SET(zchan->sockfd, r);
}
if (inflags & ZAP_WRITE) {
w = &write_fds;
FD_SET(zchan->sockfd, w);
}
if (inflags & ZAP_ERROR) {
e = &error_fds;
FD_SET(zchan->sockfd, e);
}
*flags = ZAP_NO_FLAGS;
s = select(zchan->sockfd + 1, r, w, e, tvp);
if (s < 0) {
snprintf(zchan->last_error, sizeof(zchan->last_error), "select: %s", strerror(errno));
return ZAP_FAIL;
}
if (s > 0) {
if (r && FD_ISSET(zchan->sockfd, r)) {
*flags |= ZAP_READ;
}
if (w && FD_ISSET(zchan->sockfd, w)) {
*flags |= ZAP_WRITE;
}
if (e && FD_ISSET(zchan->sockfd, e)) {
*flags |= ZAP_ERROR;
}
}
if (s == 0) {
return ZAP_TIMEOUT;
}
return ZAP_SUCCESS;
}
static ZINT_READ_FUNCTION(wanpipe_read_unix) static ZINT_READ_FUNCTION(wanpipe_read_unix)
{ {
int rx_len = 0; int rx_len = 0;
@ -596,6 +482,39 @@ static ZINT_WRITE_FUNCTION(wanpipe_write_unix)
#endif #endif
static ZINT_WAIT_FUNCTION(wanpipe_wait)
{
zap_wait_flag_t inflags = *flags;
int result;
result = tdmv_api_wait_socket(zchan->sockfd, to, inflags);
*flags = ZAP_NO_FLAGS;
if(result < 0){
snprintf(zchan->last_error, sizeof(zchan->last_error), "Poll failed");
return ZAP_FAIL;
}
if (result == 0) {
return ZAP_TIMEOUT;
}
if (result & POLLIN) {
*flags |= ZAP_READ;
}
if (result & POLLOUT) {
*flags |= ZAP_WRITE;
}
if (result & POLLPRI) {
*flags |= ZAP_ERROR;
}
return ZAP_SUCCESS;
}
zap_status_t wanpipe_init(zap_software_interface_t **zint) zap_status_t wanpipe_init(zap_software_interface_t **zint)
{ {
assert(zint != NULL); assert(zint != NULL);
@ -607,12 +526,11 @@ zap_status_t wanpipe_init(zap_software_interface_t **zint)
wanpipe_interface.open = wanpipe_open; wanpipe_interface.open = wanpipe_open;
wanpipe_interface.close = wanpipe_close; wanpipe_interface.close = wanpipe_close;
wanpipe_interface.command = wanpipe_command; wanpipe_interface.command = wanpipe_command;
wanpipe_interface.wait = wanpipe_wait;
#ifdef __WINDOWS__ #ifdef __WINDOWS__
wanpipe_interface.wait = wanpipe_wait_windows;
wanpipe_interface.read = wanpipe_read_windows; wanpipe_interface.read = wanpipe_read_windows;
wanpipe_interface.write = wanpipe_write_windows; wanpipe_interface.write = wanpipe_write_windows;
#else #else
wanpipe_interface.wait = wanpipe_wait_unix;
wanpipe_interface.read = wanpipe_read_unix; wanpipe_interface.read = wanpipe_read_unix;
wanpipe_interface.write = wanpipe_write_unix; wanpipe_interface.write = wanpipe_write_unix;
#endif #endif