added stio_syserrtoerrnum()
This commit is contained in:
parent
15652f70e4
commit
702a008fbb
@ -103,6 +103,8 @@ struct stio_t
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
stio_errnum_t stio_syserrtoerrnum (int no);
|
||||
|
||||
stio_sckhnd_t stio_openasyncsck (int domain, int type);
|
||||
void stio_closeasyncsck (stio_sckhnd_t sck);
|
||||
int stio_makesckasync (stio_sckhnd_t sck);
|
||||
|
@ -55,8 +55,7 @@ static int tcp_make (stio_dev_t* dev, void* ctx)
|
||||
if (setsockopt (tcp->sck, SOL_SOCKET, SO_REUSEADDR, &iv, STIO_SIZEOF(iv)) == -1 ||
|
||||
bind (tcp->sck, (struct sockaddr*)&arg->addr, len) == -1)
|
||||
{
|
||||
// TODO: set errnum from errno ...
|
||||
//dev->stio->errnum = STIO_EINVAL;
|
||||
tcp->stio->errnum = stio_syserrtoerrnum(errno);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
@ -124,6 +123,7 @@ static int tcp_recv (stio_dev_t* dev, void* buf, stio_len_t* len)
|
||||
{
|
||||
if (errno == EINPROGRESS || errno == EWOULDBLOCK) return 0; /* no data available */
|
||||
if (errno == EINTR) return 0;
|
||||
tcp->stio->errnum = stio_syserrtoerrnum(errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -146,6 +146,7 @@ static int tcp_send (stio_dev_t* dev, const void* data, stio_len_t* len)
|
||||
{
|
||||
if (errno == EINPROGRESS || errno == EWOULDBLOCK) return 0; /* no data can be written */
|
||||
if (errno == EINTR) return 0;
|
||||
tcp->stio->errnum = stio_syserrtoerrnum(errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -199,7 +200,7 @@ static int tcp_ioctl (stio_dev_t* dev, int cmd, void* arg)
|
||||
x = bind (tcp->sck, sa, sl);
|
||||
if (x == -1)
|
||||
{
|
||||
/* TODO: set dev->errnum from errno */
|
||||
tcp->stio->errnum = stio_syserrtoerrnum(errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -264,7 +265,7 @@ static int tcp_ioctl (stio_dev_t* dev, int cmd, void* arg)
|
||||
}
|
||||
}
|
||||
|
||||
/* TODO: set dev->errnum from errno */
|
||||
tcp->stio->errnum = stio_syserrtoerrnum(errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -288,7 +289,7 @@ static int tcp_ioctl (stio_dev_t* dev, int cmd, void* arg)
|
||||
x = listen (tcp->sck, lstn->backlogs);
|
||||
if (x == -1)
|
||||
{
|
||||
/* TODO: set tcp->stio->errnum */
|
||||
tcp->stio->errnum = stio_syserrtoerrnum(errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -340,9 +341,14 @@ printf ("TCP READY...%p\n", dev);
|
||||
stio_scklen_t len;
|
||||
|
||||
len = STIO_SIZEOF(errcode);
|
||||
if (getsockopt (tcp->sck, SOL_SOCKET, SO_ERROR, (char*)&errcode, &len) == 0)
|
||||
if (getsockopt (tcp->sck, SOL_SOCKET, SO_ERROR, (char*)&errcode, &len) == -1)
|
||||
{
|
||||
printf ("CANNOT CONNECT ERRORCODE - %s\n", strerror(errcode));
|
||||
tcp->stio->errnum = stio_syserrtoerrnum(errno);
|
||||
}
|
||||
else
|
||||
{
|
||||
tcp->stio->errnum = stio_syserrtoerrnum(errcode);
|
||||
}
|
||||
|
||||
return -1;
|
||||
@ -358,7 +364,7 @@ printf ("TCP READY...%p\n", dev);
|
||||
len = STIO_SIZEOF(errcode);
|
||||
if (getsockopt (tcp->sck, SOL_SOCKET, SO_ERROR, (char*)&errcode, &len) == -1)
|
||||
{
|
||||
printf ("CANNOT GET SOCKET CONNECTION STATE....\n");
|
||||
tcp->stio->errnum = stio_syserrtoerrnum(errno);
|
||||
return -1;
|
||||
}
|
||||
else if (errcode == 0)
|
||||
@ -390,7 +396,7 @@ printf ("TCP READY...%p\n", dev);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf ("failed to get SOCKET PROGRESS CODE...\n");
|
||||
tcp->stio->errnum = stio_syserrtoerrnum(errcode);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@ -413,7 +419,7 @@ printf ("TCP READY...%p\n", dev);
|
||||
if (errno == EINPROGRESS || errno == EWOULDBLOCK) return 0;
|
||||
if (errno == EINTR) return 0; /* if interrupted by a signal, treat it as if it's EINPROGRESS */
|
||||
|
||||
/* TODO: set tcp->stio->errnum from errno */
|
||||
tcp->stio->errnum = stio_syserrtoerrnum(errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -432,7 +438,6 @@ printf ("TCP READY...%p\n", dev);
|
||||
clitcp->parent = tcp;
|
||||
|
||||
|
||||
|
||||
/* inherit some event handlers from the parent.
|
||||
* you can still change them inside the on_connected handler */
|
||||
clitcp->on_connected = tcp->on_connected;
|
||||
@ -475,9 +480,9 @@ static stio_dev_evcb_t tcp_evcb =
|
||||
tcp_on_sent
|
||||
};
|
||||
|
||||
stio_dev_tcp_t* stio_dev_tcp_make (stio_t* stio, stio_size_t xtnsize, const stio_dev_tcp_make_t* arg)
|
||||
stio_dev_tcp_t* stio_dev_tcp_make (stio_t* stio, stio_size_t xtnsize, const stio_dev_tcp_make_t* data)
|
||||
{
|
||||
return (stio_dev_tcp_t*)stio_makedev (stio, STIO_SIZEOF(stio_dev_tcp_t) + xtnsize, &tcp_mth, &tcp_evcb, (void*)arg);
|
||||
return (stio_dev_tcp_t*)stio_makedev (stio, STIO_SIZEOF(stio_dev_tcp_t) + xtnsize, &tcp_mth, &tcp_evcb, (void*)data);
|
||||
}
|
||||
|
||||
void stio_dev_tcp_kill (stio_dev_tcp_t* tcp)
|
||||
|
@ -36,36 +36,25 @@
|
||||
|
||||
static int udp_make (stio_dev_t* dev, void* ctx)
|
||||
{
|
||||
/* NOTE: this can be extended to use ctx to tell between INET and INET6 or other types of sockets without creating a new dev method set. */
|
||||
|
||||
stio_dev_udp_t* udp = (stio_dev_udp_t*)dev;
|
||||
struct sockaddr* saddr = (struct sockaddr*)ctx;
|
||||
stio_dev_udp_make_t* arg = (stio_dev_udp_make_t*)ctx;
|
||||
stio_scklen_t len;
|
||||
stio_sckfam_t family;
|
||||
|
||||
udp->sck = stio_openasyncsck (AF_INET, SOCK_DGRAM);
|
||||
if (stio_getsckadrinfo(dev->stio, &arg->addr, &len, &family) <= -1) return -1;
|
||||
|
||||
udp->sck = stio_openasyncsck (family, SOCK_DGRAM);
|
||||
if (udp->sck == STIO_SCKHND_INVALID) goto oops;
|
||||
|
||||
if (saddr)
|
||||
/* some socket options? */
|
||||
if (bind (udp->sck, (struct sockaddr*)&arg->addr, len) == -1)
|
||||
{
|
||||
stio_scklen_t len;
|
||||
if (saddr->sa_family == AF_INET)
|
||||
len = STIO_SIZEOF(struct sockaddr_in);
|
||||
else if (saddr->sa_family == AF_INET6)
|
||||
len = STIO_SIZEOF(struct sockaddr_in6);
|
||||
else
|
||||
{
|
||||
dev->stio->errnum = STIO_EINVAL;
|
||||
udp->stio->errnum = stio_syserrtoerrnum(errno);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
|
||||
//setsockopt (udp->sck, SOL_SOCKET, SO_REUSEADDR, ...);
|
||||
if (bind (udp->sck, saddr, len) == -1)
|
||||
{
|
||||
//dev->stio->errnum = STIO_EINVAL; TODO:
|
||||
goto oops;
|
||||
}
|
||||
}
|
||||
|
||||
udp->on_sent = arg->on_sent;
|
||||
udp->on_recv = arg->on_recv;
|
||||
return 0;
|
||||
|
||||
oops:
|
||||
@ -99,12 +88,15 @@ static int udp_recv (stio_dev_t* dev, void* buf, stio_len_t* len)
|
||||
stio_scklen_t addrlen;
|
||||
int x;
|
||||
|
||||
/* TODO: udp_recv need source address ... have to extend the send callback to accept the source address */
|
||||
printf ("UDP RECVFROM...\n");
|
||||
addrlen = STIO_SIZEOF(udp->peer);
|
||||
x = recvfrom (udp->sck, buf, *len, 0, (struct sockaddr*)&udp->peer, &addrlen);
|
||||
if (x <= -1)
|
||||
{
|
||||
if (errno == EINPROGRESS || errno == EWOULDBLOCK) return 0; /* no data available */
|
||||
if (errno == EINTR) return 0;
|
||||
udp->stio->errnum = stio_syserrtoerrnum(errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -118,10 +110,13 @@ static int udp_send (stio_dev_t* dev, const void* data, stio_len_t* len)
|
||||
ssize_t x;
|
||||
|
||||
#if 0
|
||||
/* TODO: udp_send need target address ... have to extend the send callback to accept the target address */
|
||||
x = sendto (udp->sck, data, *len, skad, stio_getskadlen(skad));
|
||||
if (x <= -1)
|
||||
{
|
||||
if (errno == EINPROGRESS || errno == EWOULDBLOCK) return 0; /* no data can be written */
|
||||
if (errno == EINTR) return 0;
|
||||
udp->stio->errnum = stio_syserrtoerrnum(errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -157,6 +152,7 @@ static stio_dev_mth_t udp_mth =
|
||||
|
||||
static int udp_ready (stio_dev_t* dev, int events)
|
||||
{
|
||||
/* TODO: ... */
|
||||
if (events & STIO_DEV_EVENT_ERR) printf ("UDP READY ERROR.....\n");
|
||||
if (events & STIO_DEV_EVENT_HUP) printf ("UDP READY HANGUP.....\n");
|
||||
if (events & STIO_DEV_EVENT_PRI) printf ("UDP READY PRI.....\n");
|
||||
@ -187,13 +183,9 @@ static stio_dev_evcb_t udp_evcb =
|
||||
};
|
||||
|
||||
|
||||
stio_dev_udp_t* stio_dev_udp_make (stio_t* stio, stio_size_t xtnsize, stio_sckadr_t* addr)
|
||||
stio_dev_udp_t* stio_dev_udp_make (stio_t* stio, stio_size_t xtnsize, const stio_dev_udp_make_t* data)
|
||||
{
|
||||
stio_dev_udp_t* udp;
|
||||
|
||||
udp = (stio_dev_udp_t*)stio_makedev (stio, STIO_SIZEOF(*udp) + xtnsize, &udp_mth, &udp_evcb, addr);
|
||||
|
||||
return udp;
|
||||
return (stio_dev_udp_t*)stio_makedev (stio, STIO_SIZEOF(stio_dev_udp_t) + xtnsize, &udp_mth, &udp_evcb, (void*)data);
|
||||
}
|
||||
|
||||
|
||||
|
@ -32,13 +32,27 @@
|
||||
|
||||
typedef struct stio_dev_udp_t stio_dev_udp_t;
|
||||
|
||||
typedef int (*stio_dev_udp_on_recv_t) (stio_dev_udp_t* dev, const void* data, stio_len_t len);
|
||||
typedef int (*stio_dev_udp_on_sent_t) (stio_dev_udp_t* dev, void* sendctx);
|
||||
|
||||
typedef struct stio_dev_udp_make_t stio_dev_udp_make_t;
|
||||
struct stio_dev_udp_make_t
|
||||
{
|
||||
/* TODO: options: REUSEADDR for binding?? */
|
||||
stio_sckadr_t addr; /* binding address. */
|
||||
stio_dev_udp_on_sent_t on_sent;
|
||||
stio_dev_udp_on_recv_t on_recv;
|
||||
};
|
||||
|
||||
struct stio_dev_udp_t
|
||||
{
|
||||
STIO_DEV_HEADERS;
|
||||
stio_sckhnd_t sck;
|
||||
stio_sckadr_t peer;
|
||||
};
|
||||
|
||||
stio_dev_udp_on_sent_t on_sent;
|
||||
stio_dev_udp_on_recv_t on_recv;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@ -48,7 +62,7 @@ extern "C" {
|
||||
STIO_EXPORT stio_dev_udp_t* stio_dev_udp_make (
|
||||
stio_t* stio,
|
||||
stio_size_t xtnsize,
|
||||
stio_sckadr_t* addr
|
||||
const stio_dev_udp_make_t* data
|
||||
);
|
||||
|
||||
STIO_EXPORT void stio_dev_udp_kill (
|
||||
|
@ -32,9 +32,6 @@
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
|
||||
|
||||
stio_t* stio_open (stio_mmgr_t* mmgr, stio_size_t xtnsize, stio_size_t tmrcapa, stio_errnum_t* errnum)
|
||||
{
|
||||
stio_t* stio;
|
||||
@ -73,8 +70,7 @@ int stio_init (stio_t* stio, stio_mmgr_t* mmgr, stio_size_t tmrcapa)
|
||||
stio->mux = epoll_create (1000);
|
||||
if (stio->mux == -1)
|
||||
{
|
||||
/* TODO: set error number */
|
||||
//if (stio->errnum) *errnum = XXXXX
|
||||
stio->errnum = stio_syserrtoerrnum(errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -256,9 +252,8 @@ int stio_exec (stio_t* stio)
|
||||
if (nentries <= -1)
|
||||
{
|
||||
if (errno == EINTR) return 0; /* it's actually ok */
|
||||
|
||||
/* other errors are critical - EBADF, EFAULT, EINVAL */
|
||||
/* TODO: set errnum */
|
||||
stio->errnum = stio_syserrtoerrnum(errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -508,7 +503,7 @@ int stio_dev_event (stio_dev_t* dev, stio_dev_event_cmd_t cmd, int flags)
|
||||
|
||||
if (epoll_ctl (dev->stio->mux, epoll_op, dev->mth->getsyshnd(dev), &ev) == -1)
|
||||
{
|
||||
/* TODO: set dev->stio->errnum from errno */
|
||||
dev->stio->errnum = stio_syserrtoerrnum(errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -576,3 +571,30 @@ int stio_dev_send (stio_dev_t* dev, const void* data, stio_len_t len, void* send
|
||||
dev->evcb->on_sent (dev, sendctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
stio_errnum_t stio_syserrtoerrnum (int no)
|
||||
{
|
||||
switch (no)
|
||||
{
|
||||
case ENOMEM:
|
||||
return STIO_ENOMEM;
|
||||
|
||||
case EINVAL:
|
||||
return STIO_EINVAL;
|
||||
|
||||
case ENOENT:
|
||||
return STIO_ENOENT;
|
||||
|
||||
case EMFILE:
|
||||
return STIO_EMFILE;
|
||||
|
||||
#if defined(ENFILE)
|
||||
case ENFILE:
|
||||
return STIO_ENFILE;
|
||||
#endif
|
||||
|
||||
default:
|
||||
return STIO_ESYSERR;
|
||||
}
|
||||
}
|
||||
|
@ -94,8 +94,11 @@ enum stio_errnum_t
|
||||
STIO_EINVAL,
|
||||
STIO_ENOENT,
|
||||
STIO_ENOSUP, /* not supported */
|
||||
STIO_EMFILE,
|
||||
STIO_ENFILE,
|
||||
|
||||
STIO_EDEVMAKE
|
||||
STIO_EDEVMAKE,
|
||||
STIO_ESYSERR
|
||||
};
|
||||
|
||||
typedef enum stio_errnum_t stio_errnum_t;
|
||||
|
Loading…
Reference in New Issue
Block a user