aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeith Burns <alagalah@gmail.com>2017-10-05 17:35:48 +0000
committerGerrit Code Review <gerrit@fd.io>2017-10-05 17:35:48 +0000
commit574e4afced9f264302a48b1fb8bb4c70be0dfbd1 (patch)
tree30f1c78742a04a4bc10be295ee51ebad0f9310e8
parent529ec1b1c1a76a2ac6c85f5c6d5c180280e139dd (diff)
parent34956cc3d34d6e7b9c7ed5a27d9eebd6fe404280 (diff)
Merge "VCL_LDPRELOAD epoll implementation"
-rw-r--r--vcl-ldpreload/src/libvcl-ldpreload/vcom.c1381
-rw-r--r--vcl-ldpreload/src/libvcl-ldpreload/vcom.h56
-rw-r--r--vcl-ldpreload/src/libvcl-ldpreload/vcom_glibc_socket.h85
-rw-r--r--vcl-ldpreload/src/libvcl-ldpreload/vcom_socket.c1262
-rw-r--r--vcl-ldpreload/src/libvcl-ldpreload/vcom_socket.h259
-rw-r--r--vcl-ldpreload/src/libvcl-ldpreload/vcom_socket_wrapper.c287
-rw-r--r--vcl-ldpreload/src/libvcl-ldpreload/vcom_socket_wrapper.h49
7 files changed, 2143 insertions, 1236 deletions
diff --git a/vcl-ldpreload/src/libvcl-ldpreload/vcom.c b/vcl-ldpreload/src/libvcl-ldpreload/vcom.c
index 37cf936..f997d4d 100644
--- a/vcl-ldpreload/src/libvcl-ldpreload/vcom.c
+++ b/vcl-ldpreload/src/libvcl-ldpreload/vcom.c
@@ -78,7 +78,7 @@ int
vcom_set_app_name (char *__app_name)
{
return snprintf (vcom_app_name, MAX_VCOM_APP_NAME, "vcom-%s-%d",
- __app_name, getpid ()) < 0 ? -1 : 0;
+ __app_name, getpid ()) < 0 ? -1 : 0;
}
static char *
@@ -112,21 +112,21 @@ vcom_init ()
if (!is_vcom_init)
{
if (vppcom_app_create (vcom_get_app_name ()) != 0)
- {
- printf ("\n[%d] vcom_init...failed!\n", pid);
- if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] vcom_init: vppcom_app_create failed!\n", pid);
- return -1;
- }
+ {
+ printf ("\n[%d] vcom_init...failed!\n", pid);
+ if (VCOM_DEBUG > 0)
+ fprintf (stderr,
+ "[%d] vcom_init: vppcom_app_create failed!\n", pid);
+ return -1;
+ }
if (vcom_socket_main_init () != 0)
- {
- printf ("\n[%d] vcom_init...failed!\n", pid);
- if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] vcom_init: vcom_socket_main_init failed!\n", pid);
- return -1;
- }
+ {
+ printf ("\n[%d] vcom_init...failed!\n", pid);
+ if (VCOM_DEBUG > 0)
+ fprintf (stderr,
+ "[%d] vcom_init: vcom_socket_main_init failed!\n", pid);
+ return -1;
+ }
is_vcom_init = 1;
printf ("\n[%d] vcom_init...done!\n", pid);
@@ -154,6 +154,13 @@ is_vcom_socket_fd (int fd)
return vcom_socket_is_vcom_fd (fd);
}
+static inline int
+is_vcom_epfd (int epfd)
+{
+ return vcom_socket_is_vcom_epfd (epfd);
+}
+
+
/*
*
* Generic glibc fd api
@@ -193,20 +200,20 @@ close (int __fd)
int rv;
pid_t pid = getpid ();
- if (is_vcom_socket_fd (__fd))
+ if (is_vcom_socket_fd (__fd) || is_vcom_epfd (__fd))
{
if (VCOM_DEBUG > 0)
- vcom_socket_main_show ();
+ vcom_socket_main_show ();
rv = vcom_close (__fd);
if (VCOM_DEBUG > 0)
- fprintf (stderr, "[%d] close: " "'%04d'='%04d'\n", pid, rv, __fd);
+ fprintf (stderr, "[%d] close: " "'%04d'='%04d'\n", pid, rv, __fd);
if (VCOM_DEBUG > 0)
- vcom_socket_main_show ();
+ vcom_socket_main_show ();
if (rv != 0)
- {
- errno = -rv;
- return -1;
- }
+ {
+ errno = -rv;
+ return -1;
+ }
return 0;
}
return libc_close (__fd);
@@ -238,23 +245,23 @@ read (int __fd, void *__buf, size_t __nbytes)
if (is_vcom_socket_fd (__fd))
{
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d][%lu (0x%lx)] read:1 "
- "'%04d'='%04d', '%p', '%04d'\n",
- pid, (unsigned long) tid, (unsigned long) tid,
- (int) size, __fd, __buf, (int) __nbytes);
+ fprintf (stderr,
+ "[%d][%lu (0x%lx)] read:1 "
+ "'%04d'='%04d', '%p', '%04d'\n",
+ pid, (unsigned long) tid, (unsigned long) tid,
+ (int) size, __fd, __buf, (int) __nbytes);
size = vcom_read (__fd, __buf, __nbytes);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d][%lu (0x%lx)] read:2 "
- "'%04d'='%04d', '%p', '%04d'\n",
- pid, (unsigned long) tid, (unsigned long) tid,
- (int) size, __fd, __buf, (int) __nbytes);
+ fprintf (stderr,
+ "[%d][%lu (0x%lx)] read:2 "
+ "'%04d'='%04d', '%p', '%04d'\n",
+ pid, (unsigned long) tid, (unsigned long) tid,
+ (int) size, __fd, __buf, (int) __nbytes);
if (size < 0)
- {
- errno = -size;
- return -1;
- }
+ {
+ errno = -size;
+ return -1;
+ }
return size;
}
return libc_read (__fd, __buf, __nbytes);
@@ -285,23 +292,23 @@ write (int __fd, const void *__buf, size_t __n)
if (is_vcom_socket_fd (__fd))
{
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d][%lu (0x%lx)] write:1 "
- "'%04d'='%04d', '%p', '%04d'\n",
- pid, (unsigned long) tid, (unsigned long) tid,
- (int) size, __fd, __buf, (int) __n);
+ fprintf (stderr,
+ "[%d][%lu (0x%lx)] write:1 "
+ "'%04d'='%04d', '%p', '%04d'\n",
+ pid, (unsigned long) tid, (unsigned long) tid,
+ (int) size, __fd, __buf, (int) __n);
size = vcom_write (__fd, __buf, __n);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d][%lu (0x%lx)] write:2 "
- "'%04d'='%04d', '%p', '%04d'\n",
- pid, (unsigned long) tid, (unsigned long) tid,
- (int) size, __fd, __buf, (int) __n);
+ fprintf (stderr,
+ "[%d][%lu (0x%lx)] write:2 "
+ "'%04d'='%04d', '%p', '%04d'\n",
+ pid, (unsigned long) tid, (unsigned long) tid,
+ (int) size, __fd, __buf, (int) __n);
if (size < 0)
- {
- errno = -size;
- return -1;
- }
+ {
+ errno = -size;
+ return -1;
+ }
return size;
}
return libc_write (__fd, __buf, __n);
@@ -350,14 +357,14 @@ fcntl (int __fd, int __cmd, ...)
{
rv = vcom_fcntl_va (__fd, __cmd, ap);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] fcntl: "
- "'%04d'='%04d', '%04d'\n", pid, rv, __fd, __cmd);
+ fprintf (stderr,
+ "[%d] fcntl: "
+ "'%04d'='%04d', '%04d'\n", pid, rv, __fd, __cmd);
if (rv < 0)
- {
- errno = -rv;
- rv = -1;
- }
+ {
+ errno = -rv;
+ rv = -1;
+ }
goto out;
}
rv = libc_vfcntl (__fd, __cmd, ap);
@@ -392,10 +399,10 @@ out:
*/
static inline int
vcom_fd_clear (int __nfds,
- int *__new_nfds,
- fd_set * __restrict __readfds,
- fd_set * __restrict __writefds,
- fd_set * __restrict __exceptfds)
+ int *__new_nfds,
+ fd_set * __restrict __readfds,
+ fd_set * __restrict __writefds,
+ fd_set * __restrict __exceptfds)
{
int fd;
/* invalid max_fd is -1 */
@@ -464,14 +471,14 @@ vcom_fd_clear (int __nfds,
*/
static inline int
vcom_fd_set (int __nfds,
- /* dest */
- int *__new_nfds,
- fd_set * __restrict __readfds,
- fd_set * __restrict __writefds, fd_set * __restrict __exceptfds,
- /* src */
- fd_set * __restrict __saved_readfds,
- fd_set * __restrict __saved_writefds,
- fd_set * __restrict __saved_exceptfds)
+ /* dest */
+ int *__new_nfds,
+ fd_set * __restrict __readfds,
+ fd_set * __restrict __writefds, fd_set * __restrict __exceptfds,
+ /* src */
+ fd_set * __restrict __saved_readfds,
+ fd_set * __restrict __saved_writefds,
+ fd_set * __restrict __saved_exceptfds)
{
int fd;
/* invalid max_fd is -1 */
@@ -536,21 +543,21 @@ vcom_fd_set (int __nfds,
*/
static inline void
vcom_fd_set_split (
- /* src, select sets */
- int nfds,
- fd_set * __restrict readfds,
- fd_set * __restrict writefds,
- fd_set * __restrict exceptfds,
- /* dest1, vcom sets */
- int *vcom_nfds,
- fd_set * __restrict vcom_readfds,
- fd_set * __restrict vcom_writefds,
- fd_set * __restrict vcom_exceptfds, int *vcom_nfd,
- /* dest2, libc sets */
- int *libc_nfds,
- fd_set * __restrict libc_readfds,
- fd_set * __restrict libc_writefds,
- fd_set * __restrict libc_exceptfds, int *libc_nfd)
+ /* src, select sets */
+ int nfds,
+ fd_set * __restrict readfds,
+ fd_set * __restrict writefds,
+ fd_set * __restrict exceptfds,
+ /* dest1, vcom sets */
+ int *vcom_nfds,
+ fd_set * __restrict vcom_readfds,
+ fd_set * __restrict vcom_writefds,
+ fd_set * __restrict vcom_exceptfds, int *vcom_nfd,
+ /* dest2, libc sets */
+ int *libc_nfds,
+ fd_set * __restrict libc_readfds,
+ fd_set * __restrict libc_writefds,
+ fd_set * __restrict libc_exceptfds, int *libc_nfd)
{
int fd;
@@ -624,21 +631,21 @@ vcom_fd_set_split (
*/
static inline void
vcom_fd_set_merge (
- /* dest, select sets */
- int *nfds,
- fd_set * __restrict readfds,
- fd_set * __restrict writefds,
- fd_set * __restrict exceptfds, int *nfd,
- /* src1, vcom sets */
- int vcom_nfds,
- fd_set * __restrict vcom_readfds,
- fd_set * __restrict vcom_writefds,
- fd_set * __restrict vcom_exceptfds, int vcom_nfd,
- /* src2, libc sets */
- int libc_nfds,
- fd_set * __restrict libc_readfds,
- fd_set * __restrict libc_writefds,
- fd_set * __restrict libc_exceptfds, int libc_nfd)
+ /* dest, select sets */
+ int *nfds,
+ fd_set * __restrict readfds,
+ fd_set * __restrict writefds,
+ fd_set * __restrict exceptfds, int *nfd,
+ /* src1, vcom sets */
+ int vcom_nfds,
+ fd_set * __restrict vcom_readfds,
+ fd_set * __restrict vcom_writefds,
+ fd_set * __restrict vcom_exceptfds, int vcom_nfd,
+ /* src2, libc sets */
+ int libc_nfds,
+ fd_set * __restrict libc_readfds,
+ fd_set * __restrict libc_writefds,
+ fd_set * __restrict libc_exceptfds, int libc_nfd)
{
int fd;
/* invalid max_fd is -1 */
@@ -699,13 +706,13 @@ vcom_fd_set_merge (
/* source(vcom) to dest(select) rwe fd sets */
FD_RWE_SETS_OR (readfds, writefds, exceptfds,
- vcom_readfds, vcom_writefds, vcom_exceptfds,
- fd, vcom_nfds, max_fd, nfd2);
+ vcom_readfds, vcom_writefds, vcom_exceptfds,
+ fd, vcom_nfds, max_fd, nfd2);
/* source(libc) to dest(select) rwe fd sets */
FD_RWE_SETS_OR (readfds, writefds, exceptfds,
- libc_readfds, libc_writefds, libc_exceptfds,
- fd, libc_nfds, max_fd, nfd2);
+ libc_readfds, libc_writefds, libc_exceptfds,
+ fd, libc_nfds, max_fd, nfd2);
#undef FD_RWE_SETS_OR
#undef FD_BIT_OR
@@ -731,10 +738,10 @@ fd_set_iszero (fd_set * __restrict fds)
for (fd = 0; fd < FD_SETSIZE; fd++)
{
if (FD_ISSET (fd, fds))
- {
- /* non-empty fds */
- return 0;
- }
+ {
+ /* non-empty fds */
+ return 0;
+ }
}
/* empty fds */
return 1;
@@ -806,7 +813,7 @@ timeval_compare (const struct timeval *lhs, const struct timeval *rhs)
}
extern void set_normalized_timespec (struct timespec *ts, time_t sec,
- s64 nsec);
+ s64 nsec);
static inline struct timespec
@@ -814,7 +821,7 @@ timespec_add (struct timespec lhs, struct timespec rhs)
{
struct timespec ts_delta;
set_normalized_timespec (&ts_delta, lhs.tv_sec + rhs.tv_sec,
- lhs.tv_nsec + rhs.tv_nsec);
+ lhs.tv_nsec + rhs.tv_nsec);
return ts_delta;
}
@@ -826,7 +833,7 @@ timespec_sub (struct timespec lhs, struct timespec rhs)
{
struct timespec ts_delta;
set_normalized_timespec (&ts_delta, lhs.tv_sec - rhs.tv_sec,
- lhs.tv_nsec - rhs.tv_nsec);
+ lhs.tv_nsec - rhs.tv_nsec);
return ts_delta;
}
@@ -889,19 +896,19 @@ set_normalized_timespec (struct timespec *ts, time_t sec, s64 nsec)
static inline int
vcom_select_impl (int vcom_nfds, fd_set * __restrict vcom_readfds,
- fd_set * __restrict vcom_writefds,
- fd_set * __restrict vcom_exceptfds,
- struct timeval *__restrict timeout)
+ fd_set * __restrict vcom_writefds,
+ fd_set * __restrict vcom_exceptfds,
+ struct timeval *__restrict timeout)
{
return vcom_socket_select (vcom_nfds, vcom_readfds,
- vcom_writefds, vcom_exceptfds, timeout);
+ vcom_writefds, vcom_exceptfds, timeout);
}
int
vcom_select (int __nfds, fd_set * __restrict __readfds,
- fd_set * __restrict __writefds,
- fd_set * __restrict __exceptfds,
- struct timeval *__restrict __timeout)
+ fd_set * __restrict __writefds,
+ fd_set * __restrict __exceptfds,
+ struct timeval *__restrict __timeout)
{
int rv;
int rv2 = 0;
@@ -942,17 +949,17 @@ vcom_select (int __nfds, fd_set * __restrict __readfds,
/* validate tv_sec */
/* bogus */
if (!vcom_timerisvalid (__timeout))
- {
- rv = -EINVAL;
- goto select_done;
- }
+ {
+ rv = -EINVAL;
+ goto select_done;
+ }
/* validate tv_usec */
/* TBD: */
/* init timeout_ts */
VCOM_TIMEVAL_TO_TIMESPEC (__timeout, &timeout_ts);
set_normalized_timespec (&timeout_ts,
- timeout_ts.tv_sec, timeout_ts.tv_nsec);
+ timeout_ts.tv_sec, timeout_ts.tv_nsec);
}
rv = clock_gettime (CLOCK_MONOTONIC, &start_time);
@@ -967,17 +974,17 @@ vcom_select (int __nfds, fd_set * __restrict __readfds,
if (__timeout)
{
if (timerisset (__timeout))
- {
- end_time = timespec_add (start_time, timeout_ts);
- }
+ {
+ end_time = timespec_add (start_time, timeout_ts);
+ }
else
- {
- /*
- * if both fields of the timeout structure are zero,
- * then select returns immediately
- * */
- end_time = start_time;
- }
+ {
+ /*
+ * if both fields of the timeout structure are zero,
+ * then select returns immediately
+ * */
+ end_time = start_time;
+ }
}
else
{
@@ -1014,17 +1021,17 @@ vcom_select (int __nfds, fd_set * __restrict __readfds,
(!__exceptfds || fd_set_iszero (__exceptfds)))
{
if (__timeout)
- {
- rv = libc_select (__nfds,
- __readfds, __writefds, __exceptfds, __timeout);
- if (rv == -1)
- rv = -errno;
- }
+ {
+ rv = libc_select (__nfds,
+ __readfds, __writefds, __exceptfds, __timeout);
+ if (rv == -1)
+ rv = -errno;
+ }
else
- {
- /* TBD: block indefinitely or return -EINVAL */
- rv = -EINVAL;
- }
+ {
+ /* TBD: block indefinitely or return -EINVAL */
+ rv = -EINVAL;
+ }
goto select_done;
}
@@ -1057,24 +1064,24 @@ vcom_select (int __nfds, fd_set * __restrict __readfds,
libc_nfd = -1;
vcom_fd_set_split (
- /* src, select sets */
- __nfds, __readfds, __writefds, __exceptfds,
- /* dest1, vcom sets */
- __readfds || __writefds || __exceptfds ?
- &vcom_nfds : NULL,
- __readfds ? &vcom_readfds : NULL,
- __writefds ? &vcom_writefds : NULL,
- __exceptfds ? &vcom_exceptfds : NULL,
- __readfds || __writefds || __exceptfds ?
- &vcom_nfd : NULL,
- /* dest2, libc sets */
- __readfds || __writefds || __exceptfds ?
- &libc_nfds : NULL,
- __readfds ? &libc_readfds : NULL,
- __writefds ? &libc_writefds : NULL,
- __exceptfds ? &libc_exceptfds : NULL,
- __readfds || __writefds || __exceptfds ?
- &libc_nfd : NULL);
+ /* src, select sets */
+ __nfds, __readfds, __writefds, __exceptfds,
+ /* dest1, vcom sets */
+ __readfds || __writefds || __exceptfds ?
+ &vcom_nfds : NULL,
+ __readfds ? &vcom_readfds : NULL,
+ __writefds ? &vcom_writefds : NULL,
+ __exceptfds ? &vcom_exceptfds : NULL,
+ __readfds || __writefds || __exceptfds ?
+ &vcom_nfd : NULL,
+ /* dest2, libc sets */
+ __readfds || __writefds || __exceptfds ?
+ &libc_nfds : NULL,
+ __readfds ? &libc_readfds : NULL,
+ __writefds ? &libc_writefds : NULL,
+ __exceptfds ? &libc_exceptfds : NULL,
+ __readfds || __writefds || __exceptfds ?
+ &libc_nfd : NULL);
/*
* polling loop
@@ -1098,52 +1105,52 @@ vcom_select (int __nfds, fd_set * __restrict __readfds,
/* select on vcom fds */
if (vcom_nfds)
- {
- vcom_nfd = vcom_select_impl (vcom_nfds,
- __readfds ? &vcom_readfds : NULL,
- __writefds ? &vcom_writefds : NULL,
- __exceptfds ? &vcom_exceptfds : NULL,
- &tv);
- if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] select vcom: "
- "'%04d'='%04d'\n", pid, vcom_nfd, vcom_nfds);
-
- if (vcom_nfd < 0)
- {
- rv = vcom_nfd;
- goto select_done;
- }
- }
+ {
+ vcom_nfd = vcom_select_impl (vcom_nfds,
+ __readfds ? &vcom_readfds : NULL,
+ __writefds ? &vcom_writefds : NULL,
+ __exceptfds ? &vcom_exceptfds : NULL,
+ &tv);
+ if (VCOM_DEBUG > 0)
+ fprintf (stderr,
+ "[%d] select vcom: "
+ "'%04d'='%04d'\n", pid, vcom_nfd, vcom_nfds);
+
+ if (vcom_nfd < 0)
+ {
+ rv = vcom_nfd;
+ goto select_done;
+ }
+ }
/* select on libc fds */
if (libc_nfds)
- {
- libc_nfd = libc_select (libc_nfds,
- __readfds ? &libc_readfds : NULL,
- __writefds ? &libc_writefds : NULL,
- __exceptfds ? &libc_exceptfds : NULL, &tv);
- if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] select libc: "
- "'%04d'='%04d'\n", pid, libc_nfd, libc_nfds);
-
- if (libc_nfd < 0)
- {
- /* tv becomes undefined */
- libc_nfd = errno;
- rv = libc_nfd;
- goto select_done;
- }
- }
+ {
+ libc_nfd = libc_select (libc_nfds,
+ __readfds ? &libc_readfds : NULL,
+ __writefds ? &libc_writefds : NULL,
+ __exceptfds ? &libc_exceptfds : NULL, &tv);
+ if (VCOM_DEBUG > 0)
+ fprintf (stderr,
+ "[%d] select libc: "
+ "'%04d'='%04d'\n", pid, libc_nfd, libc_nfds);
+
+ if (libc_nfd < 0)
+ {
+ /* tv becomes undefined */
+ libc_nfd = errno;
+ rv = libc_nfd;
+ goto select_done;
+ }
+ }
/* check if any file descriptors changed status */
if ((vcom_nfds && vcom_nfd > 0) || (libc_nfds && libc_nfd > 0))
- {
- /* zero the sets before merge and exit */
+ {
+ /* zero the sets before merge and exit */
- /*
- * F fd set
- */
+ /*
+ * F fd set
+ */
#define _(F) \
if ((F)) \
{ \
@@ -1151,60 +1158,60 @@ vcom_select (int __nfds, fd_set * __restrict __readfds,
}
- _(__readfds);
- _(__writefds);
- _(__exceptfds);
+ _(__readfds);
+ _(__writefds);
+ _(__exceptfds);
#undef _
- new_nfds = 0;
- new_nfd = -1;
-
- /*
- * on exit, sets are modified in place to indicate which
- * file descriptors actually changed status
- * */
- vcom_fd_set_merge (
- /* dest, select sets */
- __readfds || __writefds || __exceptfds ?
- &new_nfds : NULL,
- __readfds,
- __writefds,
- __exceptfds,
- __readfds || __writefds || __exceptfds ?
- &new_nfd : NULL,
- /* src1, vcom sets */
- vcom_nfds,
- __readfds ? &vcom_readfds : NULL,
- __writefds ? &vcom_writefds : NULL,
- __exceptfds ? &vcom_exceptfds : NULL, vcom_nfd,
- /* src2, libc sets */
- libc_nfds,
- __readfds ? &libc_readfds : NULL,
- __writefds ? &libc_writefds : NULL,
- __exceptfds ? &libc_exceptfds : NULL, libc_nfd);
- /*
- * return the number of file descriptors contained in the
- * three returned sets
- * */
- rv = 0;
- /*
- * for documentation
- *
- * if(vcom_nfd > 0)
- * rv += vcom_nfd;
- * if(libc_nfd > 0)
- * rv += libc_nfd;
- */
-
- rv = new_nfd == -1 ? 0 : new_nfd;
- goto select_done;
- }
+ new_nfds = 0;
+ new_nfd = -1;
+
+ /*
+ * on exit, sets are modified in place to indicate which
+ * file descriptors actually changed status
+ * */
+ vcom_fd_set_merge (
+ /* dest, select sets */
+ __readfds || __writefds || __exceptfds ?
+ &new_nfds : NULL,
+ __readfds,
+ __writefds,
+ __exceptfds,
+ __readfds || __writefds || __exceptfds ?
+ &new_nfd : NULL,
+ /* src1, vcom sets */
+ vcom_nfds,
+ __readfds ? &vcom_readfds : NULL,
+ __writefds ? &vcom_writefds : NULL,
+ __exceptfds ? &vcom_exceptfds : NULL, vcom_nfd,
+ /* src2, libc sets */
+ libc_nfds,
+ __readfds ? &libc_readfds : NULL,
+ __writefds ? &libc_writefds : NULL,
+ __exceptfds ? &libc_exceptfds : NULL, libc_nfd);
+ /*
+ * return the number of file descriptors contained in the
+ * three returned sets
+ * */
+ rv = 0;
+ /*
+ * for documentation
+ *
+ * if(vcom_nfd > 0)
+ * rv += vcom_nfd;
+ * if(libc_nfd > 0)
+ * rv += libc_nfd;
+ */
+
+ rv = new_nfd == -1 ? 0 : new_nfd;
+ goto select_done;
+ }
rv = clock_gettime (CLOCK_MONOTONIC, &now);
if (rv == -1)
- {
- rv = -errno;
- goto select_done;
- }
+ {
+ rv = -errno;
+ goto select_done;
+ }
}
while (no_timeout || timespec_compare (&now, &end_time) < 0);
@@ -1221,27 +1228,27 @@ select_done:
if (__timeout)
{
if (vcom_timerisvalid (__timeout))
- {
- /* timeout expired */
- if (timedout)
- {
- timerclear (__timeout);
- }
- else if (!first_clock_gettime_failed)
- {
- rv2 = clock_gettime (CLOCK_MONOTONIC, &now);
- if (rv2 == -1)
- {
- rv = -errno;
- }
- else
- {
- struct timespec ts_delta;
- ts_delta = timespec_sub (end_time, now);
- VCOM_TIMESPEC_TO_TIMEVAL (__timeout, &ts_delta);
- }
- }
- }
+ {
+ /* timeout expired */
+ if (timedout)
+ {
+ timerclear (__timeout);
+ }
+ else if (!first_clock_gettime_failed)
+ {
+ rv2 = clock_gettime (CLOCK_MONOTONIC, &now);
+ if (rv2 == -1)
+ {
+ rv = -errno;
+ }
+ else
+ {
+ struct timespec ts_delta;
+ ts_delta = timespec_sub (end_time, now);
+ VCOM_TIMESPEC_TO_TIMEVAL (__timeout, &ts_delta);
+ }
+ }
+ }
}
if (VCOM_DEBUG > 0)
fprintf (stderr, "[%d] vselect2: " "'%04d',='%04d'\n", pid, rv, __nfds);
@@ -1251,9 +1258,9 @@ select_done:
int
vcom_select_internal (int __nfds, fd_set * __restrict __readfds,
- fd_set * __restrict __writefds,
- fd_set * __restrict __exceptfds,
- struct timeval *__restrict __timeout)
+ fd_set * __restrict __writefds,
+ fd_set * __restrict __exceptfds,
+ struct timeval *__restrict __timeout)
{
int rv;
int new_nfds = 0;
@@ -1277,10 +1284,10 @@ vcom_select_internal (int __nfds, fd_set * __restrict __readfds,
/* validate tv_sec */
/* bogus */
if (__timeout->tv_sec < 0 || __timeout->tv_usec < 0)
- {
- errno = EINVAL;
- return -1;
- }
+ {
+ errno = EINVAL;
+ return -1;
+ }
/* validate tv_usec */
/* TBD: */
@@ -1333,28 +1340,28 @@ vcom_select_internal (int __nfds, fd_set * __restrict __readfds,
/* have kernel fds */
if (new_nfds)
rv = libc_select (new_nfds, __readfds,
- __writefds, __exceptfds, __timeout);
+ __writefds, __exceptfds, __timeout);
if (new_nfds && rv == -1)
{
/* on error, the file descriptor sets are unmodified */
if (__readfds)
- *__readfds = saved_readfds;
+ *__readfds = saved_readfds;
if (__writefds)
- *__writefds = saved_writefds;
+ *__writefds = saved_writefds;
if (__exceptfds)
- *__exceptfds = saved_exceptfds;
+ *__exceptfds = saved_exceptfds;
return rv;
}
else if ((new_nfds && rv != -1) || (rv == -2))
{
/* restore vcom fds */
nfd = vcom_fd_set (__nfds,
- &new_nfds,
- __readfds,
- __writefds,
- __exceptfds,
- &saved_readfds, &saved_writefds, &saved_exceptfds);
+ &new_nfds,
+ __readfds,
+ __writefds,
+ __exceptfds,
+ &saved_readfds, &saved_writefds, &saved_exceptfds);
rv = nfd;
}
@@ -1365,8 +1372,8 @@ vcom_select_internal (int __nfds, fd_set * __restrict __readfds,
int
select (int __nfds, fd_set * __restrict __readfds,
- fd_set * __restrict __writefds,
- fd_set * __restrict __exceptfds, struct timeval *__restrict __timeout)
+ fd_set * __restrict __writefds,
+ fd_set * __restrict __exceptfds, struct timeval *__restrict __timeout)
{
int rv = 0;
pid_t pid = getpid ();
@@ -1395,10 +1402,10 @@ select (int __nfds, fd_set * __restrict __readfds,
* */
int
vcom_pselect (int __nfds, fd_set * __restrict __readfds,
- fd_set * __restrict __writefds,
- fd_set * __restrict __exceptfds,
- const struct timespec *__restrict __timeout,
- const __sigset_t * __restrict __sigmask)
+ fd_set * __restrict __writefds,
+ fd_set * __restrict __exceptfds,
+ const struct timespec *__restrict __timeout,
+ const __sigset_t * __restrict __sigmask)
{
int fd;
int vcom_nfds = 0;
@@ -1406,37 +1413,37 @@ vcom_pselect (int __nfds, fd_set * __restrict __readfds,
for (fd = 0; fd < __nfds; fd++)
{
if (__readfds && FD_ISSET (fd, __readfds))
- {
- if (is_vcom_socket_fd (fd))
- {
- vcom_nfds++;
- }
- }
+ {
+ if (is_vcom_socket_fd (fd))
+ {
+ vcom_nfds++;
+ }
+ }
if (__writefds && FD_ISSET (fd, __writefds))
- {
- if (is_vcom_socket_fd (fd))
- {
- vcom_nfds++;
- }
- }
+ {
+ if (is_vcom_socket_fd (fd))
+ {
+ vcom_nfds++;
+ }
+ }
if (__exceptfds && FD_ISSET (fd, __exceptfds))
- {
- if (is_vcom_socket_fd (fd))
- {
- FD_CLR (fd, __exceptfds);
- }
- }
+ {
+ if (is_vcom_socket_fd (fd))
+ {
+ FD_CLR (fd, __exceptfds);
+ }
+ }
}
return vcom_nfds;
}
int
pselect (int __nfds, fd_set * __restrict __readfds,
- fd_set * __restrict __writefds,
- fd_set * __restrict __exceptfds,
- const struct timespec *__restrict __timeout,
- const __sigset_t * __restrict __sigmask)
+ fd_set * __restrict __writefds,
+ fd_set * __restrict __exceptfds,
+ const struct timespec *__restrict __timeout,
+ const __sigset_t * __restrict __sigmask)
{
int rv;
int new_nfds = 0;
@@ -1460,10 +1467,10 @@ pselect (int __nfds, fd_set * __restrict __readfds,
/* validate tv_sec */
/* bogus */
if (__timeout->tv_sec < 0 || __timeout->tv_nsec < 0)
- {
- errno = EINVAL;
- return -1;
- }
+ {
+ errno = EINVAL;
+ return -1;
+ }
/* validate tv_usec */
/* TBD: */
@@ -1515,29 +1522,29 @@ pselect (int __nfds, fd_set * __restrict __readfds,
rv = -2;
if (new_nfds)
rv = libc_pselect (new_nfds,
- __readfds,
- __writefds, __exceptfds, __timeout, __sigmask);
+ __readfds,
+ __writefds, __exceptfds, __timeout, __sigmask);
if (new_nfds && rv == -1)
{
/* on error, the file descriptor sets are unmodified */
if (__readfds)
- *__readfds = saved_readfds;
+ *__readfds = saved_readfds;
if (__writefds)
- *__writefds = saved_writefds;
+ *__writefds = saved_writefds;
if (__exceptfds)
- *__exceptfds = saved_exceptfds;
+ *__exceptfds = saved_exceptfds;
return rv;
}
else if ((new_nfds && rv != -1) || (rv == -2))
{
/* restore vcom fds */
nfd = vcom_fd_set (__nfds,
- &new_nfds,
- __readfds,
- __writefds,
- __exceptfds,
- &saved_readfds, &saved_writefds, &saved_exceptfds);
+ &new_nfds,
+ __readfds,
+ __writefds,
+ __exceptfds,
+ &saved_readfds, &saved_writefds, &saved_exceptfds);
rv = nfd;
}
@@ -1586,32 +1593,32 @@ socket (int __domain, int __type, int __protocol)
case AF_INET6:
/* handle types implemented by vpp */
switch (__type & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
- {
- case SOCK_STREAM:
- case SOCK_DGRAM:
- if (VCOM_DEBUG > 0)
- vcom_socket_main_show ();
- rv = vcom_socket (__domain, __type, __protocol);
- if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d][%lu (0x%lx)] socket: "
- "'%04d'= D='%04d', T='%04d', P='%04d'\n",
- pid, (unsigned long) tid, (unsigned long) tid,
- rv, __domain, __type, __protocol);
- if (VCOM_DEBUG > 0)
- vcom_socket_main_show ();
- if (rv < 0)
- {
- errno = -rv;
- return -1;
- }
- return rv;
- break;
-
- default:
- goto CALL_GLIBC_SOCKET_API;
- break;
- }
+ {
+ case SOCK_STREAM:
+ case SOCK_DGRAM:
+ if (VCOM_DEBUG > 0)
+ vcom_socket_main_show ();
+ rv = vcom_socket (__domain, __type, __protocol);
+ if (VCOM_DEBUG > 0)
+ fprintf (stderr,
+ "[%d][%lu (0x%lx)] socket: "
+ "'%04d'= D='%04d', T='%04d', P='%04d'\n",
+ pid, (unsigned long) tid, (unsigned long) tid,
+ rv, __domain, __type, __protocol);
+ if (VCOM_DEBUG > 0)
+ vcom_socket_main_show ();
+ if (rv < 0)
+ {
+ errno = -rv;
+ return -1;
+ }
+ return rv;
+ break;
+
+ default:
+ goto CALL_GLIBC_SOCKET_API;
+ break;
+ }
break;
@@ -1655,27 +1662,27 @@ socketpair (int __domain, int __type, int __protocol, int __fds[2])
case AF_INET6:
/* handle types implemented by vpp */
switch (__type)
- {
- case SOCK_STREAM:
- case SOCK_DGRAM:
- rv = vcom_socketpair (__domain, __type, __protocol, __fds);
- if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] socketpair: "
- "'%04d'= D='%04d', T='%04d', P='%04d'\n",
- pid, rv, __domain, __type, __protocol);
- if (rv < 0)
- {
- errno = -rv;
- return -1;
- }
- return 0;
- break;
-
- default:
- goto CALL_GLIBC_SOCKET_API;
- break;
- }
+ {
+ case SOCK_STREAM:
+ case SOCK_DGRAM:
+ rv = vcom_socketpair (__domain, __type, __protocol, __fds);
+ if (VCOM_DEBUG > 0)
+ fprintf (stderr,
+ "[%d] socketpair: "
+ "'%04d'= D='%04d', T='%04d', P='%04d'\n",
+ pid, rv, __domain, __type, __protocol);
+ if (rv < 0)
+ {
+ errno = -rv;
+ return -1;
+ }
+ return 0;
+ break;
+
+ default:
+ goto CALL_GLIBC_SOCKET_API;
+ break;
+ }
break;
@@ -1707,11 +1714,11 @@ vcom_bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
{
case AF_INET:
if (__len != sizeof (struct sockaddr_in))
- return -EINVAL;
+ return -EINVAL;
break;
case AF_INET6:
if (__len != sizeof (struct sockaddr_in6))
- return -EINVAL;
+ return -EINVAL;
break;
default:
@@ -1747,15 +1754,15 @@ bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
rv = vcom_bind (__fd, __addr, __len);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] bind: "
- "'%04d'='%04d', '%p', '%04d'\n",
- pid, rv, __fd, __addr, __len);
+ fprintf (stderr,
+ "[%d] bind: "
+ "'%04d'='%04d', '%p', '%04d'\n",
+ pid, rv, __fd, __addr, __len);
if (rv != 0)
- {
- errno = -rv;
- return -1;
- }
+ {
+ errno = -rv;
+ return -1;
+ }
return 0;
}
return libc_bind (__fd, __addr, __len);
@@ -1766,7 +1773,7 @@ bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
* */
int
vcom_getsockname (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __len)
+ socklen_t * __restrict __len)
{
if (vcom_init () != 0)
{
@@ -1786,14 +1793,14 @@ getsockname (int __fd, __SOCKADDR_ARG __addr, socklen_t * __restrict __len)
{
rv = vcom_getsockname (__fd, __addr, __len);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] getsockname: "
- "'%04d'='%04d', '%p', '%p'\n", pid, rv, __fd, __addr, __len);
+ fprintf (stderr,
+ "[%d] getsockname: "
+ "'%04d'='%04d', '%p', '%p'\n", pid, rv, __fd, __addr, __len);
if (rv != 0)
- {
- errno = -rv;
- return -1;
- }
+ {
+ errno = -rv;
+ return -1;
+ }
return 0;
}
return libc_getsockname (__fd, __addr, __len);
@@ -1822,11 +1829,11 @@ vcom_connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
{
case AF_INET:
if (__len != INET_ADDRSTRLEN)
- return -1;
+ return -1;
break;
case AF_INET6:
if (__len != INET6_ADDRSTRLEN)
- return -1;
+ return -1;
break;
default:
@@ -1861,16 +1868,16 @@ connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
{
rv = vcom_connect (__fd, __addr, __len);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d][%lu (0x%lx)] connect: "
- "'%04d'='%04d', '%p', '%04d'\n",
- pid, (unsigned long) tid, (unsigned long) tid,
- rv, __fd, __addr, __len);
+ fprintf (stderr,
+ "[%d][%lu (0x%lx)] connect: "
+ "'%04d'='%04d', '%p', '%04d'\n",
+ pid, (unsigned long) tid, (unsigned long) tid,
+ rv, __fd, __addr, __len);
if (rv != 0)
- {
- errno = -rv;
- return -1;
- }
+ {
+ errno = -rv;
+ return -1;
+ }
return 0;
}
@@ -1883,7 +1890,7 @@ connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
* */
int
vcom_getpeername (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __len)
+ socklen_t * __restrict __len)
{
if (vcom_init () != 0)
{
@@ -1903,14 +1910,14 @@ getpeername (int __fd, __SOCKADDR_ARG __addr, socklen_t * __restrict __len)
{
rv = vcom_getpeername (__fd, __addr, __len);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] getpeername: "
- "'%04d'='%04d', '%p', '%p'\n", pid, rv, __fd, __addr, __len);
+ fprintf (stderr,
+ "[%d] getpeername: "
+ "'%04d'='%04d', '%p', '%p'\n", pid, rv, __fd, __addr, __len);
if (rv != 0)
- {
- errno = -rv;
- return -1;
- }
+ {
+ errno = -rv;
+ return -1;
+ }
return 0;
}
return libc_getpeername (__fd, __addr, __len);
@@ -1943,15 +1950,15 @@ send (int __fd, const void *__buf, size_t __n, int __flags)
{
size = vcom_send (__fd, __buf, __n, __flags);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] send: "
- "'%04d'='%04d', '%p', '%04d', '%04x'\n",
- pid, (int) size, __fd, __buf, (int) __n, __flags);
+ fprintf (stderr,
+ "[%d] send: "
+ "'%04d'='%04d', '%p', '%04d', '%04x'\n",
+ pid, (int) size, __fd, __buf, (int) __n, __flags);
if (size < 0)
- {
- errno = -size;
- return -1;
- }
+ {
+ errno = -size;
+ return -1;
+ }
return size;
}
return libc_send (__fd, __buf, __n, __flags);
@@ -1984,15 +1991,15 @@ recv (int __fd, void *__buf, size_t __n, int __flags)
{
size = vcom_recv (__fd, __buf, __n, __flags);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] recv: "
- "'%04d'='%04d', '%p', '%04d', '%04x'\n",
- pid, (int) size, __fd, __buf, (int) __n, __flags);
+ fprintf (stderr,
+ "[%d] recv: "
+ "'%04d'='%04d', '%p', '%04d', '%04x'\n",
+ pid, (int) size, __fd, __buf, (int) __n, __flags);
if (size < 0)
- {
- errno = -size;
- return -1;
- }
+ {
+ errno = -size;
+ return -1;
+ }
return size;
}
return libc_recv (__fd, __buf, __n, __flags);
@@ -2006,7 +2013,7 @@ recv (int __fd, void *__buf, size_t __n, int __flags)
* */
ssize_t
vcom_sendto (int __fd, const void *__buf, size_t __n, int __flags,
- __CONST_SOCKADDR_ARG __addr, socklen_t __addr_len)
+ __CONST_SOCKADDR_ARG __addr, socklen_t __addr_len)
{
if (vcom_init () != 0)
{
@@ -2018,7 +2025,7 @@ vcom_sendto (int __fd, const void *__buf, size_t __n, int __flags,
ssize_t
sendto (int __fd, const void *__buf, size_t __n, int __flags,
- __CONST_SOCKADDR_ARG __addr, socklen_t __addr_len)
+ __CONST_SOCKADDR_ARG __addr, socklen_t __addr_len)
{
ssize_t size;
pid_t pid = getpid ();
@@ -2027,17 +2034,17 @@ sendto (int __fd, const void *__buf, size_t __n, int __flags,
{
size = vcom_sendto (__fd, __buf, __n, __flags, __addr, __addr_len);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] sendto: "
- "'%04d'='%04d', '%p', '%04d', '%04x', "
- "'%p', '%04d'\n",
- pid, (int) size, __fd, __buf, (int) __n, __flags,
- __addr, __addr_len);
+ fprintf (stderr,
+ "[%d] sendto: "
+ "'%04d'='%04d', '%p', '%04d', '%04x', "
+ "'%p', '%04d'\n",
+ pid, (int) size, __fd, __buf, (int) __n, __flags,
+ __addr, __addr_len);
if (size < 0)
- {
- errno = -size;
- return -1;
- }
+ {
+ errno = -size;
+ return -1;
+ }
return size;
}
return libc_sendto (__fd, __buf, __n, __flags, __addr, __addr_len);
@@ -2054,8 +2061,8 @@ sendto (int __fd, const void *__buf, size_t __n, int __flags,
* */
ssize_t
vcom_recvfrom (int __fd, void *__restrict __buf, size_t __n,
- int __flags,
- __SOCKADDR_ARG __addr, socklen_t * __restrict __addr_len)
+ int __flags,
+ __SOCKADDR_ARG __addr, socklen_t * __restrict __addr_len)
{
if (vcom_init () != 0)
{
@@ -2067,8 +2074,8 @@ vcom_recvfrom (int __fd, void *__restrict __buf, size_t __n,
ssize_t
recvfrom (int __fd, void *__restrict __buf, size_t __n,
- int __flags,
- __SOCKADDR_ARG __addr, socklen_t * __restrict __addr_len)
+ int __flags,
+ __SOCKADDR_ARG __addr, socklen_t * __restrict __addr_len)
{
ssize_t size;
pid_t pid = getpid ();
@@ -2077,17 +2084,17 @@ recvfrom (int __fd, void *__restrict __buf, size_t __n,
{
size = vcom_recvfrom (__fd, __buf, __n, __flags, __addr, __addr_len);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] recvfrom: "
- "'%04d'='%04d', '%p', '%04d', '%04x', "
- "'%p', '%p'\n",
- pid, (int) size, __fd, __buf, (int) __n, __flags,
- __addr, __addr_len);
+ fprintf (stderr,
+ "[%d] recvfrom: "
+ "'%04d'='%04d', '%p', '%04d', '%04x', "
+ "'%p', '%p'\n",
+ pid, (int) size, __fd, __buf, (int) __n, __flags,
+ __addr, __addr_len);
if (size < 0)
- {
- errno = -size;
- return -1;
- }
+ {
+ errno = -size;
+ return -1;
+ }
return size;
}
return libc_recvfrom (__fd, __buf, __n, __flags, __addr, __addr_len);
@@ -2120,15 +2127,15 @@ sendmsg (int __fd, const struct msghdr * __message, int __flags)
{
size = vcom_sendmsg (__fd, __message, __flags);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] sendmsg: "
- "'%04d'='%04d', '%p', '%04x'\n",
- pid, (int) size, __fd, __message, __flags);
+ fprintf (stderr,
+ "[%d] sendmsg: "
+ "'%04d'='%04d', '%p', '%04x'\n",
+ pid, (int) size, __fd, __message, __flags);
if (size < 0)
- {
- errno = -size;
- return -1;
- }
+ {
+ errno = -size;
+ return -1;
+ }
return size;
}
return libc_sendmsg (__fd, __message, __flags);
@@ -2144,7 +2151,7 @@ sendmsg (int __fd, const struct msghdr * __message, int __flags)
* */
int
vcom_sendmmsg (int __fd, struct mmsghdr *__vmessages,
- unsigned int __vlen, int __flags)
+ unsigned int __vlen, int __flags)
{
if (vcom_init () != 0)
{
@@ -2156,7 +2163,7 @@ vcom_sendmmsg (int __fd, struct mmsghdr *__vmessages,
int
sendmmsg (int __fd, struct mmsghdr *__vmessages,
- unsigned int __vlen, int __flags)
+ unsigned int __vlen, int __flags)
{
ssize_t size;
pid_t pid = getpid ();
@@ -2165,15 +2172,15 @@ sendmmsg (int __fd, struct mmsghdr *__vmessages,
{
size = vcom_sendmmsg (__fd, __message, __vlen, __flags);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] sendmmsg: "
- "'%04d'='%04d', '%p', '%04d', '%04x'\n",
- pid, (int) size, __fd, __vmessages, __vlen, __flags);
+ fprintf (stderr,
+ "[%d] sendmmsg: "
+ "'%04d'='%04d', '%p', '%04d', '%04x'\n",
+ pid, (int) size, __fd, __vmessages, __vlen, __flags);
if (size < 0)
- {
- errno = -size;
- return -1;
- }
+ {
+ errno = -size;
+ return -1;
+ }
return size;
}
return libc_sendmmsg (__fd, __message, __vlen, __flags);
@@ -2208,15 +2215,15 @@ recvmsg (int __fd, struct msghdr * __message, int __flags)
{
size = vcom_recvmsg (__fd, __message, __flags);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] recvmsg: "
- "'%04d'='%04d', '%p', '%04x'\n",
- pid, (int) size, __fd, __message, __flags);
+ fprintf (stderr,
+ "[%d] recvmsg: "
+ "'%04d'='%04d', '%p', '%04x'\n",
+ pid, (int) size, __fd, __message, __flags);
if (size < 0)
- {
- errno = -size;
- return -1;
- }
+ {
+ errno = -size;
+ return -1;
+ }
return size;
}
return libc_recvmsg (__fd, __message, __flags);
@@ -2231,7 +2238,7 @@ recvmsg (int __fd, struct msghdr * __message, int __flags)
* */
int
vcom_recvmmsg (int __fd, struct mmsghdr *__vmessages,
- unsigned int __vlen, int __flags, struct timespec *__tmo)
+ unsigned int __vlen, int __flags, struct timespec *__tmo)
{
if (vcom_init () != 0)
{
@@ -2243,7 +2250,7 @@ vcom_recvmmsg (int __fd, struct mmsghdr *__vmessages,
int
recvmmsg (int __fd, struct mmsghdr *__vmessages,
- unsigned int __vlen, int __flags, struct timespec *__tmo)
+ unsigned int __vlen, int __flags, struct timespec *__tmo)
{
ssize_t size;
pid_t pid = getpid ();
@@ -2252,16 +2259,16 @@ recvmmsg (int __fd, struct mmsghdr *__vmessages,
{
size = vcom_recvmmsg (__fd, __message, __vlen, __flags, __tmo);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] recvmmsg: "
- "'%04d'='%04d', '%p', "
- "'%04d', '%04x', '%p'\n",
- pid, (int) size, __fd, __vmessages, __vlen, __flags, __tmo);
+ fprintf (stderr,
+ "[%d] recvmmsg: "
+ "'%04d'='%04d', '%p', "
+ "'%04d', '%04x', '%p'\n",
+ pid, (int) size, __fd, __vmessages, __vlen, __flags, __tmo);
if (size < 0)
- {
- errno = -size;
- return -1;
- }
+ {
+ errno = -size;
+ return -1;
+ }
return size;
}
return libc_recvmmsg (__fd, __message, __vlen, __flags, __tmo);
@@ -2277,7 +2284,7 @@ recvmmsg (int __fd, struct mmsghdr *__vmessages,
* */
int
vcom_getsockopt (int __fd, int __level, int __optname,
- void *__restrict __optval, socklen_t * __restrict __optlen)
+ void *__restrict __optval, socklen_t * __restrict __optlen)
{
if (vcom_init () != 0)
{
@@ -2285,12 +2292,12 @@ vcom_getsockopt (int __fd, int __level, int __optname,
}
return vcom_socket_getsockopt (__fd, __level, __optname,
- __optval, __optlen);
+ __optval, __optlen);
}
int
getsockopt (int __fd, int __level, int __optname,
- void *__restrict __optval, socklen_t * __restrict __optlen)
+ void *__restrict __optval, socklen_t * __restrict __optlen)
{
int rv;
pid_t pid = getpid ();
@@ -2299,16 +2306,16 @@ getsockopt (int __fd, int __level, int __optname,
{
rv = vcom_getsockopt (__fd, __level, __optname, __optval, __optlen);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] getsockopt: "
- "'%04d'='%04d', '%04d', '%04d', "
- "'%p', '%p'\n",
- pid, rv, __fd, __level, __optname, __optval, __optlen);
+ fprintf (stderr,
+ "[%d] getsockopt: "
+ "'%04d'='%04d', '%04d', '%04d', "
+ "'%p', '%p'\n",
+ pid, rv, __fd, __level, __optname, __optval, __optlen);
if (rv != 0)
- {
- errno = -rv;
- return -1;
- }
+ {
+ errno = -rv;
+ return -1;
+ }
return 0;
}
return libc_getsockopt (__fd, __level, __optname, __optval, __optlen);
@@ -2321,7 +2328,7 @@ getsockopt (int __fd, int __level, int __optname,
* */
int
vcom_setsockopt (int __fd, int __level, int __optname,
- const void *__optval, socklen_t __optlen)
+ const void *__optval, socklen_t __optlen)
{
if (vcom_init () != 0)
{
@@ -2329,12 +2336,12 @@ vcom_setsockopt (int __fd, int __level, int __optname,
}
return vcom_socket_setsockopt (__fd, __level, __optname,
- __optval, __optlen);
+ __optval, __optlen);
}
int
setsockopt (int __fd, int __level, int __optname,
- const void *__optval, socklen_t __optlen)
+ const void *__optval, socklen_t __optlen)
{
int rv;
pid_t pid = getpid ();
@@ -2343,16 +2350,16 @@ setsockopt (int __fd, int __level, int __optname,
{
rv = vcom_setsockopt (__fd, __level, __optname, __optval, __optlen);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] setsockopt: "
- "'%04d'='%04d', '%04d', '%04d', "
- "'%p', '%04d'\n",
- pid, rv, __fd, __level, __optname, __optval, __optlen);
+ fprintf (stderr,
+ "[%d] setsockopt: "
+ "'%04d'='%04d', '%04d', '%04d', "
+ "'%p', '%04d'\n",
+ pid, rv, __fd, __level, __optname, __optval, __optlen);
if (rv != 0)
- {
- errno = -rv;
- return -1;
- }
+ {
+ errno = -rv;
+ return -1;
+ }
return 0;
}
return libc_setsockopt (__fd, __level, __optname, __optval, __optlen);
@@ -2385,14 +2392,14 @@ listen (int __fd, int __n)
{
rv = vcom_listen (__fd, __n);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] listen: "
- "'%04d'='%04d', '%04d'\n", pid, rv, __fd, __n);
+ fprintf (stderr,
+ "[%d] listen: "
+ "'%04d'='%04d', '%04d'\n", pid, rv, __fd, __n);
if (rv != 0)
- {
- errno = -rv;
- return -1;
- }
+ {
+ errno = -rv;
+ return -1;
+ }
return 0;
}
return libc_listen (__fd, __n);
@@ -2409,7 +2416,7 @@ listen (int __fd, int __n)
* */
int
vcom_accept (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __addr_len)
+ socklen_t * __restrict __addr_len)
{
if (vcom_init () != 0)
@@ -2429,27 +2436,27 @@ accept (int __fd, __SOCKADDR_ARG __addr, socklen_t * __restrict __addr_len)
if (is_vcom_socket_fd (__fd))
{
if (VCOM_DEBUG > 0)
- vcom_socket_main_show ();
+ vcom_socket_main_show ();
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d][%lu (0x%lx)] accept1: "
- "'%04d'='%04d', '%p', '%p'\n",
- pid, (unsigned long) tid, (unsigned long) tid,
- rv, __fd, __addr, __addr_len);
+ fprintf (stderr,
+ "[%d][%lu (0x%lx)] accept1: "
+ "'%04d'='%04d', '%p', '%p'\n",
+ pid, (unsigned long) tid, (unsigned long) tid,
+ rv, __fd, __addr, __addr_len);
rv = vcom_accept (__fd, __addr, __addr_len);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d][%lu (0x%lx)] accept2: "
- "'%04d'='%04d', '%p', '%p'\n",
- pid, (unsigned long) tid, (unsigned long) tid,
- rv, __fd, __addr, __addr_len);
+ fprintf (stderr,
+ "[%d][%lu (0x%lx)] accept2: "
+ "'%04d'='%04d', '%p', '%p'\n",
+ pid, (unsigned long) tid, (unsigned long) tid,
+ rv, __fd, __addr, __addr_len);
if (VCOM_DEBUG > 0)
- vcom_socket_main_show ();
+ vcom_socket_main_show ();
if (rv < 0)
- {
- errno = -rv;
- return -1;
- }
+ {
+ errno = -rv;
+ return -1;
+ }
return rv;
}
return libc_accept (__fd, __addr, __addr_len);
@@ -2464,7 +2471,7 @@ accept (int __fd, __SOCKADDR_ARG __addr, socklen_t * __restrict __addr_len)
* */
int
vcom_accept4 (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __addr_len, int __flags)
+ socklen_t * __restrict __addr_len, int __flags)
{
if (vcom_init () != 0)
@@ -2477,7 +2484,7 @@ vcom_accept4 (int __fd, __SOCKADDR_ARG __addr,
int
accept4 (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __addr_len, int __flags)
+ socklen_t * __restrict __addr_len, int __flags)
{
int rv;
pid_t pid = getpid ();
@@ -2485,20 +2492,20 @@ accept4 (int __fd, __SOCKADDR_ARG __addr,
if (is_vcom_socket_fd (__fd))
{
if (VCOM_DEBUG > 0)
- vcom_socket_main_show ();
+ vcom_socket_main_show ();
rv = vcom_accept4 (__fd, __addr, __addr_len, __flags);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] accept4: "
- "'%04d'='%04d', '%p', '%p', '%04x'\n",
- pid, rv, __fd, __addr, __addr_len, __flags);
+ fprintf (stderr,
+ "[%d] accept4: "
+ "'%04d'='%04d', '%p', '%p', '%04x'\n",
+ pid, rv, __fd, __addr, __addr_len, __flags);
if (VCOM_DEBUG > 0)
- vcom_socket_main_show ();
+ vcom_socket_main_show ();
if (rv < 0)
- {
- errno = -rv;
- return -1;
- }
+ {
+ errno = -rv;
+ return -1;
+ }
return rv;
}
return libc_accept4 (__fd, __addr, __addr_len, __flags);
@@ -2534,19 +2541,273 @@ shutdown (int __fd, int __how)
{
rv = vcom_shutdown (__fd, __how);
if (VCOM_DEBUG > 0)
- fprintf (stderr,
- "[%d] shutdown: "
- "'%04d'='%04d', '%04d'\n", pid, rv, __fd, __how);
+ fprintf (stderr,
+ "[%d] shutdown: "
+ "'%04d'='%04d', '%04d'\n", pid, rv, __fd, __how);
if (rv != 0)
- {
- errno = -rv;
- return -1;
- }
+ {
+ errno = -rv;
+ return -1;
+ }
return 0;
}
return libc_shutdown (__fd, __how);
}
+int
+vcom_epoll_create (int __size)
+{
+
+ if (vcom_init () != 0)
+ {
+ return -1;
+ }
+
+ if (__size <= 0)
+ {
+ return -EINVAL;
+ }
+
+ /* __size argument is ignored "thereafter" */
+ return vcom_epoll_create1(0);
+}
+
+/*
+ * __size argument is ignored, but must be greater than zero
+ */
+int
+epoll_create (int __size)
+{
+ int rv = 0;
+
+ rv = vcom_epoll_create(__size);
+ if (rv < 0)
+ {
+ errno = -rv;
+ return -1;
+ }
+ return rv;
+}
+
+int
+vcom_epoll_create1 (int __flags)
+{
+ if (vcom_init () != 0)
+ {
+ return -1;
+ }
+
+ if (__flags < 0)
+ {
+ return -EINVAL;
+ }
+ if (__flags & ~EPOLL_CLOEXEC)
+ {
+ return -EINVAL;
+ }
+ /* __flags can be either zero or EPOLL_CLOEXEC */
+ /* implementation */
+ return vcom_socket_epoll_create1(__flags);
+}
+
+/*
+ * __flags can be either zero or EPOLL_CLOEXEC
+ * */
+int
+epoll_create1 (int __flags)
+{
+ int rv = 0;
+
+ rv = vcom_epoll_create1(__flags);
+ if (rv < 0)
+ {
+ errno = -rv;
+ return -1;
+ }
+ return rv;
+}
+
+int
+vcom_epoll_ctl (int __epfd, int __op, int __fd,
+ struct epoll_event *__event)
+{
+ if (vcom_init () != 0)
+ {
+ return -1;
+ }
+
+ /* implementation */
+ return vcom_socket_epoll_ctl (__epfd, __op, __fd,
+ __event);
+}
+
+static inline int
+ep_op_has_event (int op)
+{
+ return op != EPOLL_CTL_DEL;
+}
+
+int
+epoll_ctl (int __epfd, int __op, int __fd,
+ struct epoll_event *__event)
+{
+ int rv;
+ pid_t pid = getpid ();
+
+ if ((ep_op_has_event (__op) && !__event))
+ {
+ errno = EFAULT;
+ return -1;
+ }
+ if (is_vcom_epfd (__epfd))
+ {
+ /* TBD: currently limiting epoll to support only vcom fds */
+ if (is_vcom_socket_fd (__fd))
+ {
+ rv = vcom_epoll_ctl (__epfd, __op, __fd,
+ __event);
+ if (VCOM_DEBUG > 0)
+ fprintf (stderr,
+ "[%d] epoll_ctl: "
+ "'%04d'='%04d', '%04d', '%04d'\n", pid, rv, __epfd, __op, __fd);
+ if (rv != 0)
+ {
+ errno = -rv;
+ return -1;
+ }
+ return 0;
+ }
+ else
+ {
+ /* TBD: currently epoll does not support kernel fds */
+ errno = EBADF;
+ return -1;
+ }
+ }
+ else
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ return 0;
+}
+
+int
+vcom_epoll_wait (int __epfd, struct epoll_event *__events,
+ int __maxevents, int __timeout)
+{
+ if (vcom_init () != 0)
+ {
+ return -1;
+ }
+
+ return vcom_epoll_pwait(__epfd, __events,
+ __maxevents, __timeout,
+ NULL);
+}
+
+int
+epoll_wait (int __epfd, struct epoll_event *__events,
+ int __maxevents, int __timeout)
+{
+ int rv;
+ pid_t pid = getpid ();
+
+ if (__maxevents <=0 || __maxevents > EP_MAX_EVENTS)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (is_vcom_epfd (__epfd))
+ {
+ rv = vcom_epoll_wait (__epfd, __events,
+ __maxevents, __timeout);
+ if (VCOM_DEBUG > 0)
+ fprintf (stderr,
+ "[%d] epoll_wait: "
+ "'%04d'='%04d', '%p', "
+ "'%04d', '%04d'\n",
+ pid,
+ rv, __epfd, __events,
+ __maxevents, __timeout);
+ if (rv != 0)
+ {
+ errno = -rv;
+ return -1;
+ }
+ return 0;
+ }
+ else
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ return 0;
+}
+
+
+int
+vcom_epoll_pwait (int __epfd, struct epoll_event *__events,
+ int __maxevents, int __timeout,
+ const __sigset_t *__ss)
+{
+ if (vcom_init () != 0)
+ {
+ return -1;
+ }
+
+ /* implementation */
+ return vcom_socket_epoll_pwait (__epfd, __events,
+ __maxevents, __timeout,
+ __ss);
+}
+
+int
+epoll_pwait (int __epfd, struct epoll_event *__events,
+ int __maxevents, int __timeout,
+ const __sigset_t *__ss)
+{
+ int rv;
+ pid_t pid = getpid ();
+
+ if (__maxevents <=0 || __maxevents > EP_MAX_EVENTS)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (is_vcom_epfd (__epfd))
+ {
+ rv = vcom_epoll_pwait (__epfd, __events,
+ __maxevents, __timeout,
+ __ss);
+ if (VCOM_DEBUG > 0)
+ fprintf (stderr,
+ "[%d] epoll_pwait: "
+ "'%04d'='%04d', '%p', "
+ "'%04d', '%04d', "
+ "'%p'\n",
+ pid,
+ rv, __epfd, __events,
+ __maxevents, __timeout,
+ __ss);
+ if (rv != 0)
+ {
+ errno = -rv;
+ return -1;
+ }
+ return 0;
+ }
+ else
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ return 0;
+}
+
void CONSTRUCTOR_ATTRIBUTE vcom_constructor (void);
void DESTRUCTOR_ATTRIBUTE vcom_destructor (void);
diff --git a/vcl-ldpreload/src/libvcl-ldpreload/vcom.h b/vcl-ldpreload/src/libvcl-ldpreload/vcom.h
index 445d8af..d751fe1 100644
--- a/vcl-ldpreload/src/libvcl-ldpreload/vcom.h
+++ b/vcl-ldpreload/src/libvcl-ldpreload/vcom.h
@@ -54,17 +54,17 @@ extern int vcom_fcntl (int __fd, int __cmd, ...);
*/
extern int
vcom_select (int __nfds, fd_set * __restrict __readfds,
- fd_set * __restrict __writefds,
- fd_set * __restrict __exceptfds,
- struct timeval *__restrict __timeout);
+ fd_set * __restrict __writefds,
+ fd_set * __restrict __exceptfds,
+ struct timeval *__restrict __timeout);
#ifdef __USE_XOPEN2K
extern int
vcom_pselect (int __nfds, fd_set * __restrict __readfds,
- fd_set * __restrict __writefds,
- fd_set * __restrict __exceptfds,
- const struct timespec *__restrict __timeout,
- const __sigset_t * __restrict __sigmask);
+ fd_set * __restrict __writefds,
+ fd_set * __restrict __exceptfds,
+ const struct timespec *__restrict __timeout,
+ const __sigset_t * __restrict __sigmask);
#endif
/*
@@ -85,14 +85,14 @@ vcom_bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);
extern int __THROW
vcom_getsockname (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __len);
+ socklen_t * __restrict __len);
extern int
vcom_connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);
extern int __THROW
vcom_getpeername (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __len);
+ socklen_t * __restrict __len);
extern ssize_t
vcom_send (int __fd, const void *__buf, size_t __n, int __flags);
@@ -101,12 +101,12 @@ extern ssize_t vcom_recv (int __fd, void *__buf, size_t __n, int __flags);
extern ssize_t
vcom_sendto (int __fd, const void *__buf, size_t __n,
- int __flags, __CONST_SOCKADDR_ARG __addr, socklen_t __addr_len);
+ int __flags, __CONST_SOCKADDR_ARG __addr, socklen_t __addr_len);
extern ssize_t
vcom_recvfrom (int __fd, void *__restrict __buf,
- size_t __n, int __flags,
- __SOCKADDR_ARG __addr, socklen_t * __restrict __addr_len);
+ size_t __n, int __flags,
+ __SOCKADDR_ARG __addr, socklen_t * __restrict __addr_len);
extern ssize_t
vcom_sendmsg (int __fd, const struct msghdr *__message, int __flags);
@@ -114,7 +114,7 @@ vcom_sendmsg (int __fd, const struct msghdr *__message, int __flags);
#ifdef __USE_GNU
extern int
sendmmsg (int __fd, struct mmsghdr *__vmessages,
- unsigned int __vlen, int __flags);
+ unsigned int __vlen, int __flags);
#endif
extern ssize_t vcom_recvmsg (int __fd, struct msghdr *__message, int __flags);
@@ -122,22 +122,22 @@ extern ssize_t vcom_recvmsg (int __fd, struct msghdr *__message, int __flags);
#ifdef __USE_GNU
extern int
vcom_recvmmsg (int __fd, struct mmsghdr *__vmessages,
- unsigned int __vlen, int __flags, struct timespec *__tmo);
+ unsigned int __vlen, int __flags, struct timespec *__tmo);
#endif
extern int __THROW
vcom_getsockopt (int __fd, int __level, int __optname,
- void *__restrict __optval, socklen_t * __restrict __optlen);
+ void *__restrict __optval, socklen_t * __restrict __optlen);
extern int __THROW
vcom_setsockopt (int __fd, int __level, int __optname,
- const void *__optval, socklen_t __optlen);
+ const void *__optval, socklen_t __optlen);
extern int __THROW vcom_listen (int __fd, int __n);
extern int
vcom_accept (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __addr_len);
+ socklen_t * __restrict __addr_len);
#ifdef __USE_GNU
/*
@@ -147,11 +147,31 @@ vcom_accept (int __fd, __SOCKADDR_ARG __addr,
/* TBD: implemented later */
extern int
vcom_accept4 (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __addr_len, int __flags);
+ socklen_t * __restrict __addr_len, int __flags);
#endif
extern int __THROW vcom_shutdown (int __fd, int __how);
+extern int __THROW
+vcom_epoll_create (int __size);
+
+extern int __THROW
+vcom_epoll_create1 (int __flags);
+
+extern int __THROW
+vcom_epoll_ctl (int __epfd, int __op, int __fd,
+ struct epoll_event *__event);
+
+extern int
+vcom_epoll_wait (int __epfd, struct epoll_event *__events,
+ int __maxevents, int __timeout);
+
+extern int
+vcom_epoll_pwait (int __epfd, struct epoll_event *__events,
+ int __maxevents, int __timeout,
+ const __sigset_t *__ss);
+
+
#endif /* included_vcom_h */
/*
diff --git a/vcl-ldpreload/src/libvcl-ldpreload/vcom_glibc_socket.h b/vcl-ldpreload/src/libvcl-ldpreload/vcom_glibc_socket.h
index 3e43a42..3ca1951 100644
--- a/vcl-ldpreload/src/libvcl-ldpreload/vcom_glibc_socket.h
+++ b/vcl-ldpreload/src/libvcl-ldpreload/vcom_glibc_socket.h
@@ -22,6 +22,7 @@
#include <arpa/inet.h>
#include <fcntl.h>
+#include <sys/epoll.h>
/*
*
* Generic glibc fd api
@@ -78,9 +79,9 @@ extern int fcntl (int __fd, int __cmd, ...);
__THROW. */
extern int
select (int __nfds, fd_set * __restrict __readfds,
- fd_set * __restrict __writefds,
- fd_set * __restrict __exceptfds,
- struct timeval *__restrict __timeout);
+ fd_set * __restrict __writefds,
+ fd_set * __restrict __exceptfds,
+ struct timeval *__restrict __timeout);
#ifdef __USE_XOPEN2K
/* Same as above only that the TIMEOUT value is given with higher
@@ -91,10 +92,10 @@ select (int __nfds, fd_set * __restrict __readfds,
__THROW. */
extern int
pselect (int __nfds, fd_set * __restrict __readfds,
- fd_set * __restrict __writefds,
- fd_set * __restrict __exceptfds,
- const struct timespec *__restrict __timeout,
- const __sigset_t * __restrict __sigmask);
+ fd_set * __restrict __writefds,
+ fd_set * __restrict __exceptfds,
+ const struct timespec *__restrict __timeout,
+ const __sigset_t * __restrict __sigmask);
#endif
@@ -162,7 +163,7 @@ extern ssize_t recv (int __fd, void *__buf, size_t __n, int __flags);
__THROW. */
extern ssize_t
sendto (int __fd, const void *__buf, size_t __n,
- int __flags, __CONST_SOCKADDR_ARG __addr, socklen_t __addr_len);
+ int __flags, __CONST_SOCKADDR_ARG __addr, socklen_t __addr_len);
/* Read N bytes into BUF through socket FD.
If ADDR is not NULL, fill in *ADDR_LEN bytes of it with tha address of
@@ -173,8 +174,8 @@ sendto (int __fd, const void *__buf, size_t __n,
__THROW. */
extern ssize_t
recvfrom (int __fd, void *__restrict __buf,
- size_t __n, int __flags,
- __SOCKADDR_ARG __addr, socklen_t * __restrict __addr_len);
+ size_t __n, int __flags,
+ __SOCKADDR_ARG __addr, socklen_t * __restrict __addr_len);
/* Send a message described MESSAGE on socket FD.
Returns the number of bytes sent, or -1 for errors.
@@ -192,7 +193,7 @@ sendmsg (int __fd, const struct msghdr *__message, int __flags);
__THROW. */
extern int
sendmmsg (int __fd, struct mmsghdr *__vmessages,
- unsigned int __vlen, int __flags);
+ unsigned int __vlen, int __flags);
#endif
/* Receive a message as described by MESSAGE from socket FD.
@@ -210,7 +211,7 @@ extern ssize_t recvmsg (int __fd, struct msghdr *__message, int __flags);
__THROW. */
extern int
recvmmsg (int __fd, struct mmsghdr *__vmessages,
- unsigned int __vlen, int __flags, struct timespec *__tmo);
+ unsigned int __vlen, int __flags, struct timespec *__tmo);
#endif
@@ -219,14 +220,14 @@ recvmmsg (int __fd, struct mmsghdr *__vmessages,
actual length. Returns 0 on success, -1 for errors. */
extern int __THROW
getsockopt (int __fd, int __level, int __optname,
- void *__restrict __optval, socklen_t * __restrict __optlen);
+ void *__restrict __optval, socklen_t * __restrict __optlen);
/* Set socket FD's option OPTNAME at protocol level LEVEL
to *OPTVAL (which is OPTLEN bytes long).
Returns 0 on success, -1 for errors. */
extern int __THROW
setsockopt (int __fd, int __level, int __optname,
- const void *__optval, socklen_t __optlen);
+ const void *__optval, socklen_t __optlen);
/* Prepare to accept connections on socket FD.
N connection requests will be queued before further requests are refused.
@@ -252,7 +253,7 @@ accept (int __fd, __SOCKADDR_ARG __addr, socklen_t * __restrict __addr_len);
/* TBD: implemented later */
extern int
accept4 (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __addr_len, int __flags);
+ socklen_t * __restrict __addr_len, int __flags);
#endif
/* Shut down all or part of the connection open on socket FD.
@@ -263,6 +264,60 @@ accept4 (int __fd, __SOCKADDR_ARG __addr,
Returns 0 on success, -1 for errors. */
extern int __THROW shutdown (int __fd, int __how);
+
+/*
+ * glibc APIs from <sys/epoll.h>
+ */
+
+/* Creates an epoll instance. Returns an fd for the new instance.
+ The "size" parameter is a hint specifying the number of file
+ descriptors to be associated with the new instance. The fd
+ returned by epoll_create() should be closed with close(). */
+extern int __THROW
+epoll_create (int __size);
+
+/* Same as epoll_create but with an FLAGS parameter. The unused SIZE
+ parameter has been dropped. */
+extern int __THROW
+epoll_create1 (int __flags);
+
+/* Manipulate an epoll instance "epfd". Returns 0 in case of success,
+ -1 in case of error ( the "errno" variable will contain the
+ specific error code ) The "op" parameter is one of the EPOLL_CTL_*
+ constants defined above. The "fd" parameter is the target of the
+ operation. The "event" parameter describes which events the caller
+ is interested in and any associated user data. */
+extern int __THROW
+epoll_ctl (int __epfd, int __op, int __fd,
+ struct epoll_event *__event);
+
+#define INT_MAX ((int)(~0U>>1))
+#define EP_MAX_EVENTS (INT_MAX / sizeof(struct epoll_event))
+
+/* Wait for events on an epoll instance "epfd". Returns the number of
+ triggered events returned in "events" buffer. Or -1 in case of
+ error with the "errno" variable set to the specific error code. The
+ "events" parameter is a buffer that will contain triggered
+ events. The "maxevents" is the maximum number of events to be
+ returned ( usually size of "events" ). The "timeout" parameter
+ specifies the maximum wait time in milliseconds (-1 == infinite).
+
+ This function is a cancellation point and therefore not marked with
+ __THROW. */
+extern int
+epoll_wait (int __epfd, struct epoll_event *__events,
+ int __maxevents, int __timeout);
+
+/* Same as epoll_wait, but the thread's signal mask is temporarily
+ and atomically replaced with the one provided as parameter.
+
+ This function is a cancellation point and therefore not marked with
+ __THROW. */
+extern int
+epoll_pwait (int __epfd, struct epoll_event *__events,
+ int __maxevents, int __timeout,
+ const __sigset_t *__ss);
+
#endif /* included_vcom_glibc_socket_h */
/*
diff --git a/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket.c b/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket.c
index 8430ab1..42dff9b 100644
--- a/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket.c
+++ b/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket.c
@@ -40,15 +40,26 @@ typedef struct vcom_socket_main_t_
/* Hash table for socketidx to fd mapping */
uword *sockidx_by_fd;
+ /* vcom_epoll pool */
+ vcom_epoll_t *vepolls;
+
+ /* Hash table for epollidx to epfd mapping */
+ uword *epollidx_by_epfd;
+
+ /* common epitem poll for all epfd */
+ /* TBD: epitem poll per epfd */
+ /* vcom_epitem pool */
+ vcom_epitem_t *vepitems;
+
+ /* Hash table for epitemidx to epfdfd mapping */
+ uword *epollidx_by_epfdfd;
+
} vcom_socket_main_t;
vcom_socket_main_t vcom_socket_main;
-/*
- * Public API functions
- */
-int
+static int
vcom_socket_open_socket (int domain, int type, int protocol)
{
int rv = -1;
@@ -61,22 +72,22 @@ vcom_socket_open_socket (int domain, int type, int protocol)
/* get socket type and
* handle the socket types supported by vpp */
switch (type & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
- {
- case SOCK_STREAM:
- case SOCK_DGRAM:
- /* the type argument serves a second purpose,
- * in addition to specifying a socket type,
- * it may include the bitwise OR of any of
- * SOCK_NONBLOCK and SOCK_CLOEXEC, to modify
- * the behavior of socket. */
- rv = libc_socket (domain, type, protocol);
- if (rv == -1)
- rv = -errno;
- break;
-
- default:
- break;
- }
+ {
+ case SOCK_STREAM:
+ case SOCK_DGRAM:
+ /* the type argument serves a second purpose,
+ * in addition to specifying a socket type,
+ * it may include the bitwise OR of any of
+ * SOCK_NONBLOCK and SOCK_CLOEXEC, to modify
+ * the behavior of socket. */
+ rv = libc_socket (domain, type, protocol);
+ if (rv == -1)
+ rv = -errno;
+ break;
+
+ default:
+ break;
+ }
break;
@@ -87,7 +98,29 @@ vcom_socket_open_socket (int domain, int type, int protocol)
return rv;
}
-int
+static int
+vcom_socket_open_epoll (int flags)
+{
+ int rv = -1;
+
+ if (flags < 0)
+ {
+ return -EINVAL;
+ }
+ if (flags && (flags & ~EPOLL_CLOEXEC))
+ {
+ return -EINVAL;
+ }
+
+ /* flags can be either zero or EPOLL_CLOEXEC */
+ rv = libc_epoll_create1 (flags);
+ if (rv == -1)
+ rv = -errno;
+
+ return rv;
+}
+
+static int
vcom_socket_close_socket (int fd)
{
int rv;
@@ -99,6 +132,22 @@ vcom_socket_close_socket (int fd)
return rv;
}
+static int
+vcom_socket_close_epoll (int epfd)
+{
+ int rv;
+
+ rv = libc_close (epfd);
+ if (rv == -1)
+ rv = -errno;
+
+ return rv;
+}
+
+/*
+ * Public API functions
+ */
+
int
vcom_socket_main_init (void)
{
@@ -112,6 +161,10 @@ vcom_socket_main_init (void)
/* TBD: define FD_MAXSIZE and use it here */
pool_alloc (vsm->vsockets, FD_SETSIZE);
vsm->sockidx_by_fd = hash_create (0, sizeof (i32));
+
+ pool_alloc (vsm->vepolls, FD_SETSIZE);
+ vsm->epollidx_by_epfd = hash_create (0, sizeof (i32));
+
vsm->init = 1;
}
@@ -124,6 +177,8 @@ vcom_socket_main_destroy (void)
vcom_socket_main_t *vsm = &vcom_socket_main;
vcom_socket_t *vsock;
+ vcom_epoll_t *vepoll;
+
if (VCOM_DEBUG > 0)
printf ("vcom_socket_main_destroy\n");
@@ -160,6 +215,39 @@ vcom_socket_main_destroy (void)
pool_free (vsm->vsockets);
hash_free (vsm->sockidx_by_fd);
+
+ /*
+ * from active list of vepolls,
+ * close epoll and vppcom_epoll
+ * */
+
+ /* *INDENT-OFF* */
+ pool_foreach (vepoll, vsm->vepolls,
+ ({
+ if (vepoll->type == EPOLL_TYPE_VPPCOM_BOUND)
+ {
+ vppcom_session_close (vepoll->vep_idx);
+ vcom_socket_close_epoll (vepoll->epfd); /* TBD: */
+ vepoll_init (vepoll);
+ }
+ }));
+ /* *INDENT-ON* */
+
+ /*
+ * return vepoll element to the pool
+ * */
+
+ /* *INDENT-OFF* */
+ pool_flush (vepoll, vsm->vepolls,
+ ({
+ // vepoll_init(vepoll);
+ ;
+ }));
+ /* *INDENT-ON* */
+
+ pool_free (vsm->vepolls);
+ hash_free (vsm->epollidx_by_epfd);
+
vsm->init = 0;
}
}
@@ -170,6 +258,8 @@ vcom_socket_main_show (void)
vcom_socket_main_t *vsm = &vcom_socket_main;
vcom_socket_t *vsock;
+ vcom_epoll_t *vepoll;
+
if (vsm->init)
{
/* from active list of vsockets,
@@ -184,10 +274,25 @@ vcom_socket_main_show (void)
vcom_socket_type_str (vsock->type));
}));
/* *INDENT-ON* */
+
+ /* from active list of vepolls,
+ * close epoll and vppcom session */
+
+ /* *INDENT-OFF* */
+ pool_foreach (vepoll, vsm->vepolls,
+ ({
+ printf(
+ "epfd='%04d', vep_idx='%08x', "
+ "type='%-30s', "
+ "flags='%d', count='%d', close='%d'\n",
+ vepoll->epfd, vepoll->vep_idx,
+ vcom_socket_epoll_type_str (vepoll->type),
+ vepoll->flags, vepoll->count, vepoll->close);
+ }));
+ /* *INDENT-ON* */
}
}
-
int
vcom_socket_is_vcom_fd (int fd)
{
@@ -201,7 +306,25 @@ vcom_socket_is_vcom_fd (int fd)
{
vsock = pool_elt_at_index (vsm->vsockets, p[0]);
if (vsock && vsock->type == SOCKET_TYPE_VPPCOM_BOUND)
- return 1;
+ return 1;
+ }
+ return 0;
+}
+
+int
+vcom_socket_is_vcom_epfd (int epfd)
+{
+ vcom_socket_main_t *vsm = &vcom_socket_main;
+ uword *p;
+ vcom_epoll_t *vepoll;
+
+ p = hash_get (vsm->epollidx_by_epfd, epfd);
+
+ if (p)
+ {
+ vepoll = pool_elt_at_index (vsm->vepolls, p[0]);
+ if (vepoll && vepoll->type == EPOLL_TYPE_VPPCOM_BOUND)
+ return 1;
}
return 0;
}
@@ -219,20 +342,38 @@ vcom_socket_get_sid (int fd)
{
vsock = pool_elt_at_index (vsm->vsockets, p[0]);
if (vsock && vsock->type == SOCKET_TYPE_VPPCOM_BOUND)
- return vsock->sid;
+ return vsock->sid;
}
return INVALID_SESSION_ID;
}
-int
-vcom_socket_close (int __fd)
+static inline int
+vcom_socket_get_vep_idx (int epfd)
+{
+ vcom_socket_main_t *vsm = &vcom_socket_main;
+ uword *p;
+ vcom_epoll_t *vepoll;
+
+ p = hash_get (vsm->epollidx_by_epfd, epfd);
+
+ if (p)
+ {
+ vepoll = pool_elt_at_index (vsm->vepolls, p[0]);
+ if (vepoll && vepoll->type == EPOLL_TYPE_VPPCOM_BOUND)
+ return vepoll->vep_idx;
+ }
+ return INVALID_VEP_IDX;
+}
+
+static int
+vcom_socket_close_vsock (int fd)
{
int rv = -1;
vcom_socket_main_t *vsm = &vcom_socket_main;
uword *p;
vcom_socket_t *vsock;
- p = hash_get (vsm->sockidx_by_fd, __fd);
+ p = hash_get (vsm->sockidx_by_fd, fd);
if (!p)
return -EBADF;
@@ -247,9 +388,79 @@ vcom_socket_close (int __fd)
rv = vcom_socket_close_socket (vsock->fd);
vsocket_init (vsock);
- hash_unset (vsm->sockidx_by_fd, __fd);
+ hash_unset (vsm->sockidx_by_fd, fd);
pool_put (vsm->vsockets, vsock);
+ /*
+ * TBD:
+ * close all epoll instances that are marked as "close"
+ * of which this fd is the last remaining member
+ * */
+
+ return rv;
+}
+
+int
+vcom_socket_close_vepoll (int epfd)
+{
+ int rv = -1;
+ vcom_socket_main_t *vsm = &vcom_socket_main;
+ uword *p;
+ vcom_epoll_t *vepoll;
+
+ p = hash_get (vsm->epollidx_by_epfd, epfd);
+ if (!p)
+ return -EBADF;
+
+ vepoll = pool_elt_at_index (vsm->vepolls, p[0]);
+ if (!vepoll)
+ return -EBADF;
+
+ if (vepoll->type != EPOLL_TYPE_VPPCOM_BOUND)
+ return -EINVAL;
+
+ if (vepoll->count)
+ {
+ if (!vepoll->close)
+ {
+ vepoll->close = 1;
+ return 0;
+ }
+ else
+ {
+ return -EBADF;
+ }
+ }
+
+ /* count is zero */
+ rv = vppcom_session_close (vepoll->vep_idx);
+ rv = vcom_socket_close_epoll (vepoll->epfd);
+
+ vepoll_init (vepoll);
+ hash_unset (vsm->epollidx_by_epfd, epfd);
+ pool_put (vsm->vepolls, vepoll);
+
+ return rv;
+}
+
+int
+vcom_socket_close (int __fd)
+{
+ int rv;
+
+ if (vcom_socket_is_vcom_fd (__fd))
+ {
+ rv = vcom_socket_close_vsock (__fd);
+ }
+ else if (vcom_socket_is_vcom_epfd (__fd))
+ {
+ rv = vcom_socket_close_vepoll (__fd);
+ }
+ else
+ {
+ rv = -EBADF;
+ }
+
return rv;
}
@@ -288,9 +499,9 @@ vcom_socket_read (int __fd, void *__buf, size_t __nbytes)
if (!(rv & O_NONBLOCK))
{
do
- {
- rv = vppcom_session_read (vsock->sid, __buf, __nbytes);
- }
+ {
+ rv = vppcom_session_read (vsock->sid, __buf, __nbytes);
+ }
while (rv == -EAGAIN || rv == -EWOULDBLOCK);
return rv;
}
@@ -433,16 +644,16 @@ vcom_socket_fcntl_va (int __fd, int __cmd, va_list __ap)
static inline int
vcom_socket_fds_2_sid_fds (
- /* dest */
- int *vcom_nsid_fds,
- fd_set * __restrict vcom_rd_sid_fds,
- fd_set * __restrict vcom_wr_sid_fds,
- fd_set * __restrict vcom_ex_sid_fds,
- /* src */
- int vcom_nfds,
- fd_set * __restrict vcom_readfds,
- fd_set * __restrict vcom_writefds,
- fd_set * __restrict vcom_exceptfds)
+ /* dest */
+ int *vcom_nsid_fds,
+ fd_set * __restrict vcom_rd_sid_fds,
+ fd_set * __restrict vcom_wr_sid_fds,
+ fd_set * __restrict vcom_ex_sid_fds,
+ /* src */
+ int vcom_nfds,
+ fd_set * __restrict vcom_readfds,
+ fd_set * __restrict vcom_writefds,
+ fd_set * __restrict vcom_exceptfds)
{
int rv = 0;
int fd;
@@ -507,17 +718,17 @@ done:
*/
static inline int
vcom_socket_sid_fds_2_fds (
- /* dest */
- int *new_vcom_nfds,
- int vcom_nfds,
- fd_set * __restrict vcom_readfds,
- fd_set * __restrict vcom_writefds,
- fd_set * __restrict vcom_exceptfds,
- /* src */
- int vcom_nsid_fds,
- fd_set * __restrict vcom_rd_sid_fds,
- fd_set * __restrict vcom_wr_sid_fds,
- fd_set * __restrict vcom_ex_sid_fds)
+ /* dest */
+ int *new_vcom_nfds,
+ int vcom_nfds,
+ fd_set * __restrict vcom_readfds,
+ fd_set * __restrict vcom_writefds,
+ fd_set * __restrict vcom_exceptfds,
+ /* src */
+ int vcom_nsid_fds,
+ fd_set * __restrict vcom_rd_sid_fds,
+ fd_set * __restrict vcom_wr_sid_fds,
+ fd_set * __restrict vcom_ex_sid_fds)
{
int rv = 0;
int fd;
@@ -604,9 +815,9 @@ done:
*/
int
vcom_socket_select (int vcom_nfds, fd_set * __restrict vcom_readfds,
- fd_set * __restrict vcom_writefds,
- fd_set * __restrict vcom_exceptfds,
- struct timeval *__restrict timeout)
+ fd_set * __restrict vcom_writefds,
+ fd_set * __restrict vcom_exceptfds,
+ struct timeval *__restrict timeout)
{
int rv = -EBADF;
pid_t pid = getpid ();
@@ -634,17 +845,17 @@ vcom_socket_select (int vcom_nfds, fd_set * __restrict vcom_readfds,
if (timeout)
{
if (timeout->tv_sec == 0 && timeout->tv_usec == 0)
- {
- /* polling: vppcom_select returns immediately */
- time_to_wait = (double) 0;
- }
+ {
+ /* polling: vppcom_select returns immediately */
+ time_to_wait = (double) 0;
+ }
else
- {
- /*TBD: use timeval api */
- time_to_wait = (double) timeout->tv_sec +
- (double) timeout->tv_usec / (double) 1000000 +
- (double) (timeout->tv_usec % 1000000) / (double) 1000000;
- }
+ {
+ /*TBD: use timeval api */
+ time_to_wait = (double) timeout->tv_sec +
+ (double) timeout->tv_usec / (double) 1000000 +
+ (double) (timeout->tv_usec % 1000000) / (double) 1000000;
+ }
}
else
{
@@ -675,20 +886,20 @@ vcom_socket_select (int vcom_nfds, fd_set * __restrict vcom_readfds,
/* populate read, write and except sid_sets */
vcom_nsid = vcom_socket_fds_2_sid_fds (
- /* dest */
- vcom_readfds || vcom_writefds
- || vcom_exceptfds ? (int *)
- &vcom_nsid_fds : NULL,
- vcom_readfds ? &vcom_rd_sid_fds :
- NULL,
- vcom_writefds ? &vcom_wr_sid_fds :
- NULL,
- vcom_exceptfds ? &vcom_ex_sid_fds :
- NULL,
- /* src */
- vcom_nfds,
- vcom_readfds,
- vcom_writefds, vcom_exceptfds);
+ /* dest */
+ vcom_readfds || vcom_writefds
+ || vcom_exceptfds ? (int *)
+ &vcom_nsid_fds : NULL,
+ vcom_readfds ? &vcom_rd_sid_fds :
+ NULL,
+ vcom_writefds ? &vcom_wr_sid_fds :
+ NULL,
+ vcom_exceptfds ? &vcom_ex_sid_fds :
+ NULL,
+ /* src */
+ vcom_nfds,
+ vcom_readfds,
+ vcom_writefds, vcom_exceptfds);
if (vcom_nsid < 0)
{
return vcom_nsid;
@@ -699,15 +910,15 @@ vcom_socket_select (int vcom_nfds, fd_set * __restrict vcom_readfds,
}
rv = vppcom_select (vcom_nsid_fds,
- vcom_readfds ? (unsigned long *) &vcom_rd_sid_fds :
- NULL,
- vcom_writefds ? (unsigned long *) &vcom_wr_sid_fds :
- NULL,
- vcom_exceptfds ? (unsigned long *) &vcom_ex_sid_fds :
- NULL, time_to_wait);
+ vcom_readfds ? (unsigned long *) &vcom_rd_sid_fds :
+ NULL,
+ vcom_writefds ? (unsigned long *) &vcom_wr_sid_fds :
+ NULL,
+ vcom_exceptfds ? (unsigned long *) &vcom_ex_sid_fds :
+ NULL, time_to_wait);
if (VCOM_DEBUG > 0)
fprintf (stderr, "[%d] vppcom_select: "
- "'%04d'='%04d'\n", pid, rv, (int) vcom_nsid_fds);
+ "'%04d'='%04d'\n", pid, rv, (int) vcom_nsid_fds);
/* check if any file descriptors changed status */
if (rv > 0)
@@ -723,28 +934,28 @@ vcom_socket_select (int vcom_nfds, fd_set * __restrict vcom_readfds,
* vcom_socket_sid_fds_2_fds
*/
new_vcom_nfd = vcom_socket_sid_fds_2_fds (
- /* dest */
- &new_vcom_nfds,
- vcom_nfds,
- vcom_readfds,
- vcom_writefds,
- vcom_exceptfds,
- /* src */
- vcom_nsid_fds,
- vcom_readfds ?
- &vcom_rd_sid_fds : NULL,
- vcom_writefds ?
- &vcom_wr_sid_fds : NULL,
- vcom_exceptfds ?
- &vcom_ex_sid_fds : NULL);
+ /* dest */
+ &new_vcom_nfds,
+ vcom_nfds,
+ vcom_readfds,
+ vcom_writefds,
+ vcom_exceptfds,
+ /* src */
+ vcom_nsid_fds,
+ vcom_readfds ?
+ &vcom_rd_sid_fds : NULL,
+ vcom_writefds ?
+ &vcom_wr_sid_fds : NULL,
+ vcom_exceptfds ?
+ &vcom_ex_sid_fds : NULL);
if (new_vcom_nfd < 0)
- {
- return new_vcom_nfd;
- }
+ {
+ return new_vcom_nfd;
+ }
if (new_vcom_nfds < 0)
- {
- return -EINVAL;
- }
+ {
+ return -EINVAL;
+ }
rv = new_vcom_nfd;
}
return rv;
@@ -772,9 +983,9 @@ vcom_socket_socket (int __domain, int __type, int __protocol)
}
sid = vppcom_session_create (VPPCOM_VRF_DEFAULT,
- (type == SOCK_DGRAM) ?
- VPPCOM_PROTO_UDP : VPPCOM_PROTO_TCP,
- is_nonblocking);
+ (type == SOCK_DGRAM) ?
+ VPPCOM_PROTO_UDP : VPPCOM_PROTO_TCP,
+ is_nonblocking);
if (sid < 0)
{
rv = sid;
@@ -782,6 +993,8 @@ vcom_socket_socket (int __domain, int __type, int __protocol)
}
pool_get (vsm->vsockets, vsock);
+ vsocket_init (vsock);
+
sockidx = vsock - vsm->vsockets;
hash_set (vsm->sockidx_by_fd, fd, sockidx);
@@ -796,7 +1009,7 @@ out:
int
vcom_socket_socketpair (int __domain, int __type, int __protocol,
- int __fds[2])
+ int __fds[2])
{
/* TBD: */
return 0;
@@ -833,9 +1046,9 @@ vcom_socket_bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
{
case AF_INET:
if (__len != sizeof (struct sockaddr_in))
- {
- return -EINVAL;
- }
+ {
+ return -EINVAL;
+ }
ep.is_ip4 = VPPCOM_IS_IP4;
ep.ip = (u8 *) & ((const struct sockaddr_in *) __addr)->sin_addr;
ep.port = (u16) ((const struct sockaddr_in *) __addr)->sin_port;
@@ -843,9 +1056,9 @@ vcom_socket_bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
case AF_INET6:
if (__len != sizeof (struct sockaddr_in6))
- {
- return -EINVAL;
- }
+ {
+ return -EINVAL;
+ }
ep.is_ip4 = VPPCOM_IS_IP6;
ep.ip = (u8 *) & ((const struct sockaddr_in6 *) __addr)->sin6_addr;
ep.port = (u16) ((const struct sockaddr_in6 *) __addr)->sin6_port;
@@ -863,9 +1076,9 @@ vcom_socket_bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
{
rv = libc_bind (__fd, __addr, __len);
if (rv != 0)
- {
- rv = -errno;
- }
+ {
+ rv = -errno;
+ }
}
return rv;
}
@@ -879,7 +1092,7 @@ vppcom_session_getsockname (int sid, vppcom_endpt_t * ep)
int
vcom_socket_getsockname (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __len)
+ socklen_t * __restrict __len)
{
int rv = -1;
vcom_socket_main_t *vsm = &vcom_socket_main;
@@ -924,24 +1137,24 @@ vcom_socket_getsockname (int __fd, __SOCKADDR_ARG __addr,
if (rv == 0)
{
if (ep.vrf == VPPCOM_VRF_DEFAULT)
- {
- __addr->sa_family = ep.is_ip4 == VPPCOM_IS_IP4 ? AF_INET : AF_INET6;
- switch (__addr->sa_family)
- {
- case AF_INET:
- ((struct sockaddr_in *) __addr)->sin_port = ep.port;
- *__len = sizeof (struct sockaddr_in);
- break;
-
- case AF_INET6:
- ((struct sockaddr_in6 *) __addr)->sin6_port = ep.port;
- *__len = sizeof (struct sockaddr_in6);
- break;
-
- default:
- break;
- }
- }
+ {
+ __addr->sa_family = ep.is_ip4 == VPPCOM_IS_IP4 ? AF_INET : AF_INET6;
+ switch (__addr->sa_family)
+ {
+ case AF_INET:
+ ((struct sockaddr_in *) __addr)->sin_port = ep.port;
+ *__len = sizeof (struct sockaddr_in);
+ break;
+
+ case AF_INET6:
+ ((struct sockaddr_in6 *) __addr)->sin6_port = ep.port;
+ *__len = sizeof (struct sockaddr_in6);
+ break;
+
+ default:
+ break;
+ }
+ }
}
#endif
@@ -965,27 +1178,27 @@ vcom_socket_connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
ep.vrf = VPPCOM_VRF_DEFAULT;
switch (__addr->sa_family)
- {
- case AF_INET:
- ep.is_ip4 = VPPCOM_IS_IP4;
- ep.ip =
- (uint8_t *) & ((const struct sockaddr_in *) __addr)->sin_addr;
- ep.port =
- (uint16_t) ((const struct sockaddr_in *) __addr)->sin_port;
- break;
-
- case AF_INET6:
- ep.is_ip4 = VPPCOM_IS_IP6;
- ep.ip =
- (uint8_t *) & ((const struct sockaddr_in6 *) __addr)->sin6_addr;
- ep.port =
- (uint16_t) ((const struct sockaddr_in6 *) __addr)->sin6_port;
- break;
-
- default:
- return -1;
- break;
- }
+ {
+ case AF_INET:
+ ep.is_ip4 = VPPCOM_IS_IP4;
+ ep.ip =
+ (uint8_t *) & ((const struct sockaddr_in *) __addr)->sin_addr;
+ ep.port =
+ (uint16_t) ((const struct sockaddr_in *) __addr)->sin_port;
+ break;
+
+ case AF_INET6:
+ ep.is_ip4 = VPPCOM_IS_IP6;
+ ep.ip =
+ (uint8_t *) & ((const struct sockaddr_in6 *) __addr)->sin6_addr;
+ ep.port =
+ (uint16_t) ((const struct sockaddr_in6 *) __addr)->sin6_port;
+ break;
+
+ default:
+ return -1;
+ break;
+ }
rv = vppcom_session_connect (vsock->sid, &ep);
}
@@ -1001,7 +1214,7 @@ vppcom_session_getpeername (int sid, vppcom_endpt_t * ep)
int
vcom_socket_getpeername (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __len)
+ socklen_t * __restrict __len)
{
int rv = -1;
vcom_socket_main_t *vsm = &vcom_socket_main;
@@ -1060,24 +1273,24 @@ vcom_socket_getpeername (int __fd, __SOCKADDR_ARG __addr,
if (rv == 0)
{
if (ep.vrf == VPPCOM_VRF_DEFAULT)
- {
- __addr->sa_family = ep.is_ip4 == VPPCOM_IS_IP4 ? AF_INET : AF_INET6;
- switch (__addr->sa_family)
- {
- case AF_INET:
- ((struct sockaddr_in *) __addr)->sin_port = ep.port;
- *__len = sizeof (struct sockaddr_in);
- break;
-
- case AF_INET6:
- ((struct sockaddr_in6 *) __addr)->sin6_port = ep.port;
- *__len = sizeof (struct sockaddr_in6);
- break;
-
- default:
- break;
- }
- }
+ {
+ __addr->sa_family = ep.is_ip4 == VPPCOM_IS_IP4 ? AF_INET : AF_INET6;
+ switch (__addr->sa_family)
+ {
+ case AF_INET:
+ ((struct sockaddr_in *) __addr)->sin_port = ep.port;
+ *__len = sizeof (struct sockaddr_in);
+ break;
+
+ case AF_INET6:
+ ((struct sockaddr_in6 *) __addr)->sin6_port = ep.port;
+ *__len = sizeof (struct sockaddr_in6);
+ break;
+
+ default:
+ break;
+ }
+ }
}
#endif
@@ -1120,34 +1333,34 @@ vcom_socket_is_connection_mode_socket (int __fd)
{
vsock = pool_elt_at_index (vsm->vsockets, p[0]);
if (vsock && vsock->type == SOCKET_TYPE_VPPCOM_BOUND)
- {
- optlen = sizeof (type);
- rv = libc_getsockopt (__fd, SOL_SOCKET, SO_TYPE, &type, &optlen);
- if (rv != 0)
- {
- return 0;
- }
- /* get socket type */
- switch (type & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
- {
- case SOCK_STREAM:
- case SOCK_SEQPACKET:
- return 1;
- break;
-
- default:
- return 0;
- break;
- }
- }
+ {
+ optlen = sizeof (type);
+ rv = libc_getsockopt (__fd, SOL_SOCKET, SO_TYPE, &type, &optlen);
+ if (rv != 0)
+ {
+ return 0;
+ }
+ /* get socket type */
+ switch (type & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
+ {
+ case SOCK_STREAM:
+ case SOCK_SEQPACKET:
+ return 1;
+ break;
+
+ default:
+ return 0;
+ break;
+ }
+ }
}
return 0;
}
ssize_t
vvppcom_session_sendto (int __sid, const void *__buf, size_t __n,
- int __flags, __CONST_SOCKADDR_ARG __addr,
- socklen_t __addr_len)
+ int __flags, __CONST_SOCKADDR_ARG __addr,
+ socklen_t __addr_len)
{
int rv = -1;
/* TBD add new vpp api */
@@ -1158,8 +1371,8 @@ vvppcom_session_sendto (int __sid, const void *__buf, size_t __n,
ssize_t
vcom_socket_sendto (int __fd, const void *__buf, size_t __n,
- int __flags, __CONST_SOCKADDR_ARG __addr,
- socklen_t __addr_len)
+ int __flags, __CONST_SOCKADDR_ARG __addr,
+ socklen_t __addr_len)
{
int rv = -1;
vcom_socket_main_t *vsm = &vcom_socket_main;
@@ -1187,33 +1400,33 @@ vcom_socket_sendto (int __fd, const void *__buf, size_t __n,
/* ignore __addr and _addr_len */
/* and EISCONN may be returned when they are not NULL and 0 */
if ((__addr != NULL) || (__addr_len != 0))
- {
- return -EISCONN;
- }
+ {
+ return -EISCONN;
+ }
}
else
{
if (!__addr || __addr_len < 0)
- {
- return -EDESTADDRREQ;
- }
+ {
+ return -EDESTADDRREQ;
+ }
/* not a vppcom supported address family */
if ((__addr->sa_family != AF_INET) || (__addr->sa_family != AF_INET6))
- {
- return -EINVAL;
- }
+ {
+ return -EINVAL;
+ }
}
rv = vvppcom_session_sendto (vsock->sid, (void *) __buf, (int) __n,
- __flags, __addr, __addr_len);
+ __flags, __addr, __addr_len);
return rv;
}
/* TBD: move it to vppcom */
static ssize_t
vppcom_session_recvfrom (int __sid, void *__restrict __buf, size_t __n,
- int __flags, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __addr_len)
+ int __flags, __SOCKADDR_ARG __addr,
+ socklen_t * __restrict __addr_len)
{
int rv = -1;
@@ -1224,8 +1437,8 @@ vppcom_session_recvfrom (int __sid, void *__restrict __buf, size_t __n,
ssize_t
vcom_socket_recvfrom (int __fd, void *__restrict __buf, size_t __n,
- int __flags, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __addr_len)
+ int __flags, __SOCKADDR_ARG __addr,
+ socklen_t * __restrict __addr_len)
{
int rv = -1;
vcom_socket_main_t *vsm = &vcom_socket_main;
@@ -1254,7 +1467,7 @@ vcom_socket_recvfrom (int __fd, void *__restrict __buf, size_t __n,
}
rv = vppcom_session_recvfrom (vsock->sid, __buf, __n,
- __flags, __addr, __addr_len);
+ __flags, __addr, __addr_len);
return rv;
}
@@ -1289,9 +1502,9 @@ vcom_socket_sendmsg (int __fd, const struct msghdr * __message, int __flags)
/* ignore __addr and _addr_len */
/* and EISCONN may be returned when they are not NULL and 0 */
if ((__message->msg_name != NULL) || (__message->msg_namelen != 0))
- {
- return -EISCONN;
- }
+ {
+ return -EISCONN;
+ }
}
else
{
@@ -1309,7 +1522,7 @@ vcom_socket_sendmsg (int __fd, const struct msghdr * __message, int __flags)
#ifdef __USE_GNU
int
vcom_socket_sendmmsg (int __fd, struct mmsghdr *__vmessages,
- unsigned int __vlen, int __flags)
+ unsigned int __vlen, int __flags)
{
/* TBD: define a new vppcom api */
@@ -1360,8 +1573,8 @@ vcom_socket_recvmsg (int __fd, struct msghdr * __message, int __flags)
#ifdef __USE_GNU
int
vcom_socket_recvmmsg (int __fd, struct mmsghdr *__vmessages,
- unsigned int __vlen, int __flags,
- struct timespec *__tmo)
+ unsigned int __vlen, int __flags,
+ struct timespec *__tmo)
{
/* TBD: define a new vppcom api */
return 0;
@@ -1371,7 +1584,7 @@ vcom_socket_recvmmsg (int __fd, struct mmsghdr *__vmessages,
/* TBD: move it to vppcom */
static int
vppcom_getsockopt (int __sid, int __level, int __optname,
- void *__restrict __optval, socklen_t * __restrict __optlen)
+ void *__restrict __optval, socklen_t * __restrict __optlen)
{
/* 1. for socket level options that are NOT socket attributes
* and that has corresponding vpp options get from vppcom */
@@ -1385,8 +1598,8 @@ vppcom_getsockopt (int __sid, int __level, int __optname,
int
vcom_socket_getsockopt (int __fd, int __level, int __optname,
- void *__restrict __optval,
- socklen_t * __restrict __optlen)
+ void *__restrict __optval,
+ socklen_t * __restrict __optlen)
{
int rv = -1;
vcom_socket_main_t *vsm = &vcom_socket_main;
@@ -1417,7 +1630,7 @@ vcom_socket_getsockopt (int __fd, int __level, int __optname,
/* handle options at socket level */
case SOL_SOCKET:
switch (__optname)
- {
+ {
/*
* 1. for socket level options that are socket attributes,
* get from libc_getsockopt.
@@ -1426,65 +1639,65 @@ vcom_socket_getsockopt (int __fd, int __level, int __optname,
* get from vppcom.
* 3. for socket level options unimplemented
* return -ENOPROTOOPT */
- case SO_DEBUG:
- case SO_DONTROUTE:
- case SO_BROADCAST:
- case SO_SNDBUF:
- case SO_RCVBUF:
- case SO_REUSEADDR:
- case SO_REUSEPORT:
- case SO_KEEPALIVE:
- case SO_TYPE:
- case SO_PROTOCOL:
- case SO_DOMAIN:
- case SO_ERROR:
- case SO_OOBINLINE:
- case SO_NO_CHECK:
- case SO_PRIORITY:
- case SO_LINGER:
- case SO_BSDCOMPAT:
- case SO_TIMESTAMP:
- case SO_TIMESTAMPNS:
- case SO_TIMESTAMPING:
- case SO_RCVTIMEO:
- case SO_SNDTIMEO:
- case SO_RCVLOWAT:
- case SO_SNDLOWAT:
- case SO_PASSCRED:
- case SO_PEERCRED:
- case SO_PEERNAME:
- case SO_ACCEPTCONN:
- case SO_PASSSEC:
- case SO_PEERSEC:
- case SO_MARK:
- case SO_RXQ_OVFL:
- case SO_WIFI_STATUS:
- case SO_PEEK_OFF:
- case SO_NOFCS:
- case SO_BINDTODEVICE:
- case SO_GET_FILTER:
- case SO_LOCK_FILTER:
- case SO_BPF_EXTENSIONS:
- case SO_SELECT_ERR_QUEUE:
+ case SO_DEBUG:
+ case SO_DONTROUTE:
+ case SO_BROADCAST:
+ case SO_SNDBUF:
+ case SO_RCVBUF:
+ case SO_REUSEADDR:
+ case SO_REUSEPORT:
+ case SO_KEEPALIVE:
+ case SO_TYPE:
+ case SO_PROTOCOL:
+ case SO_DOMAIN:
+ case SO_ERROR:
+ case SO_OOBINLINE:
+ case SO_NO_CHECK:
+ case SO_PRIORITY:
+ case SO_LINGER:
+ case SO_BSDCOMPAT:
+ case SO_TIMESTAMP:
+ case SO_TIMESTAMPNS:
+ case SO_TIMESTAMPING:
+ case SO_RCVTIMEO:
+ case SO_SNDTIMEO:
+ case SO_RCVLOWAT:
+ case SO_SNDLOWAT:
+ case SO_PASSCRED:
+ case SO_PEERCRED:
+ case SO_PEERNAME:
+ case SO_ACCEPTCONN:
+ case SO_PASSSEC:
+ case SO_PEERSEC:
+ case SO_MARK:
+ case SO_RXQ_OVFL:
+ case SO_WIFI_STATUS:
+ case SO_PEEK_OFF:
+ case SO_NOFCS:
+ case SO_BINDTODEVICE:
+ case SO_GET_FILTER:
+ case SO_LOCK_FILTER:
+ case SO_BPF_EXTENSIONS:
+ case SO_SELECT_ERR_QUEUE:
#ifdef CONFIG_NET_RX_BUSY_POLL
- case SO_BUSY_POLL:
+ case SO_BUSY_POLL:
#endif
- case SO_MAX_PACING_RATE:
- case SO_INCOMING_CPU:
- rv = libc_getsockopt (__fd, __level, __optname, __optval, __optlen);
- if (rv != 0)
- {
- rv = -errno;
- return rv;
- }
- break;
-
- default:
- /* We implement the SO_SNDLOWAT etc to not be settable
- * (1003.1g 7).
- */
- return -ENOPROTOOPT;
- }
+ case SO_MAX_PACING_RATE:
+ case SO_INCOMING_CPU:
+ rv = libc_getsockopt (__fd, __level, __optname, __optval, __optlen);
+ if (rv != 0)
+ {
+ rv = -errno;
+ return rv;
+ }
+ break;
+
+ default:
+ /* We implement the SO_SNDLOWAT etc to not be settable
+ * (1003.1g 7).
+ */
+ return -ENOPROTOOPT;
+ }
break;
@@ -1492,7 +1705,7 @@ vcom_socket_getsockopt (int __fd, int __level, int __optname,
/* 1. handle options that are NOT socket level options,
* but have corresponding vpp otions. */
rv = vppcom_getsockopt (vsock->sid, __level, __optname,
- __optval, __optlen);
+ __optval, __optlen);
return rv;
#if 0
@@ -1507,7 +1720,7 @@ vcom_socket_getsockopt (int __fd, int __level, int __optname,
/* TBD: move it to vppcom */
int
vppcom_setsockopt (int __fd, int __level, int __optname,
- const void *__optval, socklen_t __optlen)
+ const void *__optval, socklen_t __optlen)
{
/* 1. for socket level options that are NOT socket attributes
* and that has corresponding vpp options set it from vppcom */
@@ -1521,7 +1734,7 @@ vppcom_setsockopt (int __fd, int __level, int __optname,
int
vcom_socket_setsockopt (int __fd, int __level, int __optname,
- const void *__optval, socklen_t __optlen)
+ const void *__optval, socklen_t __optlen)
{
int rv = -1;
vcom_socket_main_t *vsm = &vcom_socket_main;
@@ -1547,9 +1760,9 @@ vcom_socket_setsockopt (int __fd, int __level, int __optname,
{
rv = libc_setsockopt (__fd, __level, __optname, __optval, __optlen);
if (rv != 0)
- {
- rv = -errno;
- }
+ {
+ rv = -errno;
+ }
return rv;
}
@@ -1564,77 +1777,77 @@ vcom_socket_setsockopt (int __fd, int __level, int __optname,
/* handle options at socket level */
case SOL_SOCKET:
switch (__optname)
- {
- /*
- * 1. for socket level options that are socket attributes,
- * set it from libc_getsockopt
- * 2. for socket level options that are NOT socket
- * attributes and that has corresponding vpp options
- * set it from vppcom
- * 3. for socket level options unimplemented
- * return -ENOPROTOOPT */
- case SO_DEBUG:
- case SO_DONTROUTE:
- case SO_BROADCAST:
- case SO_SNDBUF:
- case SO_RCVBUF:
- case SO_REUSEADDR:
- case SO_REUSEPORT:
- case SO_KEEPALIVE:
- case SO_TYPE:
- case SO_PROTOCOL:
- case SO_DOMAIN:
- case SO_ERROR:
- case SO_OOBINLINE:
- case SO_NO_CHECK:
- case SO_PRIORITY:
- case SO_LINGER:
- case SO_BSDCOMPAT:
- case SO_TIMESTAMP:
- case SO_TIMESTAMPNS:
- case SO_TIMESTAMPING:
- case SO_RCVTIMEO:
- case SO_SNDTIMEO:
- case SO_RCVLOWAT:
- case SO_SNDLOWAT:
- case SO_PASSCRED:
- case SO_PEERCRED:
- case SO_PEERNAME:
- case SO_ACCEPTCONN:
- case SO_PASSSEC:
- case SO_PEERSEC:
- case SO_MARK:
- case SO_RXQ_OVFL:
- case SO_WIFI_STATUS:
- case SO_PEEK_OFF:
- case SO_NOFCS:
- /*
- * SO_BINDTODEVICE already handled as
- * "Options without arguments" */
- /* case SO_BINDTODEVICE: */
- case SO_GET_FILTER:
- case SO_LOCK_FILTER:
- case SO_BPF_EXTENSIONS:
- case SO_SELECT_ERR_QUEUE:
+ {
+ /*
+ * 1. for socket level options that are socket attributes,
+ * set it from libc_getsockopt
+ * 2. for socket level options that are NOT socket
+ * attributes and that has corresponding vpp options
+ * set it from vppcom
+ * 3. for socket level options unimplemented
+ * return -ENOPROTOOPT */
+ case SO_DEBUG:
+ case SO_DONTROUTE:
+ case SO_BROADCAST:
+ case SO_SNDBUF:
+ case SO_RCVBUF:
+ case SO_REUSEADDR:
+ case SO_REUSEPORT:
+ case SO_KEEPALIVE:
+ case SO_TYPE:
+ case SO_PROTOCOL:
+ case SO_DOMAIN:
+ case SO_ERROR:
+ case SO_OOBINLINE:
+ case SO_NO_CHECK:
+ case SO_PRIORITY:
+ case SO_LINGER:
+ case SO_BSDCOMPAT:
+ case SO_TIMESTAMP:
+ case SO_TIMESTAMPNS:
+ case SO_TIMESTAMPING:
+ case SO_RCVTIMEO:
+ case SO_SNDTIMEO:
+ case SO_RCVLOWAT:
+ case SO_SNDLOWAT:
+ case SO_PASSCRED:
+ case SO_PEERCRED:
+ case SO_PEERNAME:
+ case SO_ACCEPTCONN:
+ case SO_PASSSEC:
+ case SO_PEERSEC:
+ case SO_MARK:
+ case SO_RXQ_OVFL:
+ case SO_WIFI_STATUS:
+ case SO_PEEK_OFF:
+ case SO_NOFCS:
+ /*
+ * SO_BINDTODEVICE already handled as
+ * "Options without arguments" */
+ /* case SO_BINDTODEVICE: */
+ case SO_GET_FILTER:
+ case SO_LOCK_FILTER:
+ case SO_BPF_EXTENSIONS:
+ case SO_SELECT_ERR_QUEUE:
#ifdef CONFIG_NET_RX_BUSY_POLL
- case SO_BUSY_POLL:
+ case SO_BUSY_POLL:
#endif
- case SO_MAX_PACING_RATE:
- case SO_INCOMING_CPU:
- rv = libc_setsockopt (__fd, __level, __optname, __optval, __optlen);
- if (rv != 0)
- {
- rv = -errno;
- return rv;
- }
- break;
-
- default:
- /* We implement the SO_SNDLOWAT etc to not be settable
- * (1003.1g 7).
- */
- return -ENOPROTOOPT;
- }
+ case SO_MAX_PACING_RATE:
+ case SO_INCOMING_CPU:
+ rv = libc_setsockopt (__fd, __level, __optname, __optval, __optlen);
+ if (rv != 0)
+ {
+ rv = -errno;
+ return rv;
+ }
+ break;
+
+ default:
+ /* We implement the SO_SNDLOWAT etc to not be settable
+ * (1003.1g 7).
+ */
+ return -ENOPROTOOPT;
+ }
break;
@@ -1642,7 +1855,7 @@ vcom_socket_setsockopt (int __fd, int __level, int __optname,
/* 1. handle options that are NOT socket level options,
* but have corresponding vpp otions. */
rv = vppcom_setsockopt (vsock->sid, __level, __optname,
- __optval, __optlen);
+ __optval, __optlen);
return rv;
#if 0
/* 2. unhandled options */
@@ -1675,8 +1888,8 @@ vcom_socket_listen (int __fd, int __n)
static int
vcom_socket_connected_socket (int __fd, int __sid,
- int *__domain,
- int *__type, int *__protocol, int flags)
+ int *__domain,
+ int *__type, int *__protocol, int flags)
{
int rv = -1;
vcom_socket_main_t *vsm = &vcom_socket_main;
@@ -1719,6 +1932,8 @@ vcom_socket_connected_socket (int __fd, int __sid,
}
pool_get (vsm->vsockets, vsock);
+ vsocket_init (vsock);
+
sockidx = vsock - vsm->vsockets;
hash_set (vsm->sockidx_by_fd, fd, sockidx);
@@ -1734,7 +1949,7 @@ out:
*/
static int
vcom_socket_accept_flags (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __addr_len, int flags)
+ socklen_t * __restrict __addr_len, int flags)
{
int rv = -1;
vcom_socket_main_t *vsm = &vcom_socket_main;
@@ -1792,43 +2007,43 @@ vcom_socket_accept_flags (int __fd, __SOCKADDR_ARG __addr,
rv = vcom_fcntl (vsock->fd, F_GETFL, 0);
if (rv < 0)
- {
- return rv;
- }
+ {
+ return rv;
+ }
/* is blocking */
if (!(rv & O_NONBLOCK))
- {
- /* socket is not marked as nonblocking
- * and no pending connections are present
- * on the queue, accept () blocks the caller
- * until a connection is present.
- */
- rv = vppcom_session_accept (vsock->sid, &ep,
- -1.0 /* wait forever */ );
- }
+ {
+ /* socket is not marked as nonblocking
+ * and no pending connections are present
+ * on the queue, accept () blocks the caller
+ * until a connection is present.
+ */
+ rv = vppcom_session_accept (vsock->sid, &ep,
+ -1.0 /* wait forever */ );
+ }
else
- {
- /* The file descriptor refers to a socket and has been
- * marked nonblocking(O_NONBLOCK) and the accept would
- * block.
- * */
- /* is non blocking */
- rv = vppcom_session_accept (vsock->sid, &ep, 0);
- /* If the socket is marked nonblocking and
- * no pending connections are present on the
- * queue, accept fails with the error
- * EAGAIN or EWOULDBLOCK
- */
- if (rv == VPPCOM_ETIMEDOUT)
- {
- rv = VPPCOM_EAGAIN;
- }
- }
+ {
+ /* The file descriptor refers to a socket and has been
+ * marked nonblocking(O_NONBLOCK) and the accept would
+ * block.
+ * */
+ /* is non blocking */
+ rv = vppcom_session_accept (vsock->sid, &ep, 0);
+ /* If the socket is marked nonblocking and
+ * no pending connections are present on the
+ * queue, accept fails with the error
+ * EAGAIN or EWOULDBLOCK
+ */
+ if (rv == VPPCOM_ETIMEDOUT)
+ {
+ rv = VPPCOM_EAGAIN;
+ }
+ }
if (rv < 0)
- {
- return rv;
- }
+ {
+ return rv;
+ }
sid = rv;
@@ -1837,11 +2052,11 @@ vcom_socket_accept_flags (int __fd, __SOCKADDR_ARG __addr,
* update vsockets and sockidx_by_fd table
* */
fd = vcom_socket_connected_socket (__fd, sid,
- &domain, &type, &protocol, flags);
+ &domain, &type, &protocol, flags);
if (fd < 0)
- {
- return fd;
- }
+ {
+ return fd;
+ }
rv = fd;
@@ -1850,87 +2065,87 @@ vcom_socket_accept_flags (int __fd, __SOCKADDR_ARG __addr,
* provided is too small, in this case, __addr_len will
* return a value greater than was supplied to the call.*/
if (__addr)
- {
- if (ep.is_cut_thru)
- {
- /* TBD populate __addr and __addr_len */
- switch (domain)
- {
- case AF_INET:
- ((struct sockaddr_in *) __addr)->sin_family = AF_INET;
- ((struct sockaddr_in *) __addr)->sin_port = ep.port;
- memcpy (&((struct sockaddr_in *) __addr)->sin_addr,
- addr8, sizeof (struct in_addr));
- /* TBD: populate __addr_len */
- if (__addr_len)
- {
- *__addr_len = sizeof (struct sockaddr_in);
- }
- break;
-
- case AF_INET6:
- ((struct sockaddr_in6 *) __addr)->sin6_family = AF_INET6;
- ((struct sockaddr_in6 *) __addr)->sin6_port = ep.port;
- memcpy (((struct sockaddr_in6 *) __addr)->sin6_addr.
- __in6_u.__u6_addr8, addr8,
- sizeof (struct in6_addr));
- /* TBD: populate __addr_len */
- if (__addr_len)
- {
- *__addr_len = sizeof (struct sockaddr_in6);
- }
- break;
-
- default:
- return -EAFNOSUPPORT;
- }
- }
- else
- {
- switch (ep.is_ip4)
- {
- case VPPCOM_IS_IP4:
- ((struct sockaddr_in *) __addr)->sin_family = AF_INET;
- ((struct sockaddr_in *) __addr)->sin_port = ep.port;
- memcpy (&((struct sockaddr_in *) __addr)->sin_addr,
- addr8, sizeof (struct in_addr));
- /* TBD: populate __addr_len */
- if (__addr_len)
- {
- *__addr_len = sizeof (struct sockaddr_in);
- }
- break;
-
- case VPPCOM_IS_IP6:
- ((struct sockaddr_in6 *) __addr)->sin6_family = AF_INET6;
- ((struct sockaddr_in6 *) __addr)->sin6_port = ep.port;
- memcpy (((struct sockaddr_in6 *) __addr)->sin6_addr.
- __in6_u.__u6_addr8, addr8,
- sizeof (struct in6_addr));
- /* TBD: populate __addr_len */
- if (__addr_len)
- {
- *__addr_len = sizeof (struct sockaddr_in6);
- }
- break;
-
- default:
- return -EAFNOSUPPORT;
- }
- }
- }
+ {
+ if (ep.is_cut_thru)
+ {
+ /* TBD populate __addr and __addr_len */
+ switch (domain)
+ {
+ case AF_INET:
+ ((struct sockaddr_in *) __addr)->sin_family = AF_INET;
+ ((struct sockaddr_in *) __addr)->sin_port = ep.port;
+ memcpy (&((struct sockaddr_in *) __addr)->sin_addr,
+ addr8, sizeof (struct in_addr));
+ /* TBD: populate __addr_len */
+ if (__addr_len)
+ {
+ *__addr_len = sizeof (struct sockaddr_in);
+ }
+ break;
+
+ case AF_INET6:
+ ((struct sockaddr_in6 *) __addr)->sin6_family = AF_INET6;
+ ((struct sockaddr_in6 *) __addr)->sin6_port = ep.port;
+ memcpy (((struct sockaddr_in6 *) __addr)->sin6_addr.
+ __in6_u.__u6_addr8, addr8,
+ sizeof (struct in6_addr));
+ /* TBD: populate __addr_len */
+ if (__addr_len)
+ {
+ *__addr_len = sizeof (struct sockaddr_in6);
+ }
+ break;
+
+ default:
+ return -EAFNOSUPPORT;
+ }
+ }
+ else
+ {
+ switch (ep.is_ip4)
+ {
+ case VPPCOM_IS_IP4:
+ ((struct sockaddr_in *) __addr)->sin_family = AF_INET;
+ ((struct sockaddr_in *) __addr)->sin_port = ep.port;
+ memcpy (&((struct sockaddr_in *) __addr)->sin_addr,
+ addr8, sizeof (struct in_addr));
+ /* TBD: populate __addr_len */
+ if (__addr_len)
+ {
+ *__addr_len = sizeof (struct sockaddr_in);
+ }
+ break;
+
+ case VPPCOM_IS_IP6:
+ ((struct sockaddr_in6 *) __addr)->sin6_family = AF_INET6;
+ ((struct sockaddr_in6 *) __addr)->sin6_port = ep.port;
+ memcpy (((struct sockaddr_in6 *) __addr)->sin6_addr.
+ __in6_u.__u6_addr8, addr8,
+ sizeof (struct in6_addr));
+ /* TBD: populate __addr_len */
+ if (__addr_len)
+ {
+ *__addr_len = sizeof (struct sockaddr_in6);
+ }
+ break;
+
+ default:
+ return -EAFNOSUPPORT;
+ }
+ }
+ }
else
- {
- /* when __addr is NULL, nothing is filled in,
- * in this case, __addr_len is not used,
- * and should also be null
- * */
- if (__addr_len)
- {
- /* TBD: return proper error code */
- return -1;
- }
- }
+ {
+ /* when __addr is NULL, nothing is filled in,
+ * in this case, __addr_len is not used,
+ * and should also be null
+ * */
+ if (__addr_len)
+ {
+ /* TBD: return proper error code */
+ return -1;
+ }
+ }
}
return rv;
@@ -1938,7 +2153,7 @@ vcom_socket_accept_flags (int __fd, __SOCKADDR_ARG __addr,
int
vcom_socket_accept (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __addr_len)
+ socklen_t * __restrict __addr_len)
{
/* set flags to 0 for accept() */
return vcom_socket_accept_flags (__fd, __addr, __addr_len, 0);
@@ -1947,7 +2162,7 @@ vcom_socket_accept (int __fd, __SOCKADDR_ARG __addr,
#ifdef __USE_GNU
int
vcom_socket_accept4 (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __addr_len, int __flags)
+ socklen_t * __restrict __addr_len, int __flags)
{
/* SOCK_NONBLOCK and SOCK_CLOEXEC can be bitwise ORed in flags */
return vcom_socket_accept_flags (__fd, __addr, __addr_len, __flags);
@@ -1974,23 +2189,86 @@ vcom_socket_shutdown (int __fd, int __how)
{
vsock = pool_elt_at_index (vsm->vsockets, p[0]);
switch (__how)
- {
- case SHUT_RD:
- case SHUT_WR:
- case SHUT_RDWR:
- rv = vppcom_session_shutdown (vsock->sid, __how);
- return rv;
- break;
+ {
+ case SHUT_RD:
+ case SHUT_WR:
+ case SHUT_RDWR:
+ rv = vppcom_session_shutdown (vsock->sid, __how);
+ return rv;
+ break;
+
+ default:
+ return -EINVAL;
+ break;
+ }
+ }
- default:
- return -EINVAL;
- break;
- }
+ return rv;
+}
+
+/*
+ * TBD: remove it once vppvom.h is committed.
+ */
+int vppcom_epoll_create (void)
+{
+ return -ENOSYS;
+}
+int
+vcom_socket_epoll_create1 (int __flags)
+{
+ int rv = -1;
+ vcom_socket_main_t *vsm = &vcom_socket_main;
+ vcom_epoll_t *vepoll;
+
+ i32 epfd;
+ i32 vep_idx;
+ i32 epollidx;
+
+ epfd = vcom_socket_open_epoll (__flags);
+ if (epfd < 0)
+ {
+ rv = epfd;
+ goto out;
+ }
+
+ vep_idx = vppcom_epoll_create ( );
+ if (vep_idx < 0)
+ {
+ rv = vep_idx;
+ goto out_close_epoll;
}
+ pool_get (vsm->vepolls, vepoll);
+ vepoll_init (vepoll);
+
+ epollidx = vepoll - vsm->vepolls;
+ hash_set (vsm->epollidx_by_epfd, epfd, epollidx);
+
+ vepoll_set (vepoll, epfd, vep_idx,
+ EPOLL_TYPE_VPPCOM_BOUND, __flags, 0, 0);
+ return epfd;
+
+out_close_epoll:
+ vcom_socket_close_epoll (epfd);
+out:
return rv;
}
+int
+vcom_socket_epoll_ctl (int __epfd, int __op, int __fd,
+ struct epoll_event *__event)
+{
+ return -ENOSYS;
+}
+
+int
+vcom_socket_epoll_pwait (int __epfd, struct epoll_event *__events,
+ int __maxevents, int __timeout,
+ const __sigset_t *__ss)
+{
+ return -ENOSYS;
+}
+
/*
* fd.io coding-style-patch-verification: ON
*
diff --git a/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket.h b/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket.h
index b616002..903f740 100644
--- a/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket.h
+++ b/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket.h
@@ -16,12 +16,17 @@
#ifndef included_vcom_socket_h
#define included_vcom_socket_h
+#include <string.h>
+
#include <libvcl-ldpreload/vcom_glibc_socket.h>
#include <vppinfra/types.h>
#define INVALID_SESSION_ID (~0)
#define INVALID_FD (~0)
+#define INVALID_VEP_IDX INVALID_SESSION_ID
+#define INVALID_EPFD INVALID_FD
+
typedef enum
{
SOCKET_TYPE_UNBOUND = 0,
@@ -29,6 +34,24 @@ typedef enum
SOCKET_TYPE_VPPCOM_BOUND
} vcom_socket_type_t;
+typedef enum
+{
+ EPOLL_TYPE_UNBOUND = 0,
+ EPOLL_TYPE_KERNEL_BOUND,
+ EPOLL_TYPE_VPPCOM_BOUND
+} vcom_epoll_type_t;
+
+typedef enum
+{
+ FD_TYPE_INVALID = 0,
+ FD_TYPE_KERNEL,
+ FD_TYPE_EPOLL,
+ FD_TYPE_VCOM_SOCKET,
+ /* add new types here */
+ /* FD_TYPE_MAX should be the last entry */
+ FD_TYPE_MAX
+} vcom_fd_type_t;
+
typedef struct
{
/* file descriptor -
@@ -46,6 +69,64 @@ typedef struct
} vcom_socket_t;
+typedef struct
+{
+ /* epoll file descriptor -
+ * epfd 0, 1, 2 have special meaning and are reserved,
+ * -1 denote invalid epfd */
+ i32 epfd;
+
+ /* vep idx - -1 denote invalid vep_idx */
+ i32 vep_idx;
+
+ /* epoll type */
+ vcom_epoll_type_t type;
+
+ /* flags - 0 or EPOLL_CLOEXEC */
+ i32 flags;
+
+ /* vcom epoll attributes here */
+
+ /*
+ * 00. count of file descriptors currently registered
+ * on this epoll instance.
+ * 01. number of file descriptors in the epoll set.
+ * 02. EPOLL_CTL_ADD, EPOLL_CTL_MOD, EPOLL_CTL_DEL
+ * update the count.
+ * 03. cached for frequent access.
+ * */
+ i32 count;
+
+ /* close( ) called on this epoll instance */
+ /* 0 - close ( ) not called, 1 - close( ) called. */
+ u32 close;
+
+} vcom_epoll_t;
+
+typedef struct
+{
+ /* "container" of this item */
+ i32 epfd;
+
+ /* fd - file descriptor information this item refers to */
+ i32 fd;
+ /* next and prev fd in the "epoll set" of epfd */
+ i32 next_fd;
+ i32 prev_fd;
+
+ /* vcom fd type */
+ vcom_fd_type_t type;
+
+ /* interested events and the source fd */
+ struct epoll_event event;
+
+ /* ready events and the source fd */
+ struct epoll_event revent;
+
+ /* epitem attributes here */
+
+} vcom_epitem_t;
+
static inline char *
vcom_socket_type_str (vcom_socket_type_t t)
{
@@ -65,15 +146,61 @@ vcom_socket_type_str (vcom_socket_type_t t)
}
}
+static inline char *
+vcom_socket_epoll_type_str (vcom_epoll_type_t t)
+{
+ switch (t)
+ {
+ case EPOLL_TYPE_UNBOUND:
+ return "EPOLL_TYPE_UNBOUND";
+
+ case EPOLL_TYPE_KERNEL_BOUND:
+ return "EPOLL_TYPE_KERNEL_BOUND";
+
+ case EPOLL_TYPE_VPPCOM_BOUND:
+ return "EPOLL_TYPE_VPPCOM_BOUND";
+
+ default:
+ return "EPOLL_TYPE_UNKNOWN";
+ }
+}
+
+static inline char *
+vcom_socket_vcom_fd_type_str (vcom_fd_type_t t)
+{
+ switch (t)
+ {
+ case FD_TYPE_KERNEL:
+ return "FD_TYPE_KERNEL";
+
+ case FD_TYPE_EPOLL:
+ return "FD_TYPE_EPOLL";
+
+ case FD_TYPE_VCOM_SOCKET:
+ return "FD_TYPE_VCOM_SOCKET";
+
+ default:
+ return "FD_TYPE_UNKNOWN";
+ }
+}
+
static inline int
vcom_socket_type_is_vppcom_bound (vcom_socket_type_t t)
{
return t == SOCKET_TYPE_VPPCOM_BOUND;
}
+static inline int
+vcom_socket_epoll_type_is_vppcom_bound (vcom_epoll_type_t t)
+{
+ return t == EPOLL_TYPE_VPPCOM_BOUND;
+}
+
static inline void
vsocket_init (vcom_socket_t * vsock)
{
+ memset (vsock, 0, sizeof (*vsock));
+
vsock->fd = INVALID_FD;
vsock->sid = INVALID_SESSION_ID;
vsock->type = SOCKET_TYPE_UNBOUND;
@@ -81,7 +208,43 @@ vsocket_init (vcom_socket_t * vsock)
}
static inline void
-vsocket_set (vcom_socket_t * vsock, i32 fd, i32 sid, vcom_socket_type_t type)
+vepoll_init (vcom_epoll_t * vepoll)
+{
+ memset (vepoll, 0, sizeof (*vepoll));
+
+ vepoll->epfd = INVALID_EPFD;
+ vepoll->vep_idx = INVALID_VEP_IDX;
+ vepoll->type = EPOLL_TYPE_UNBOUND;
+ vepoll->flags = 0;
+
+ vepoll->count = 0;
+ vepoll->close = 0;
+ /* vcom epoll attributes init here */
+}
+
+static inline void
+vepitem_init (vcom_epitem_t * vepitem)
+{
+ struct epoll_event event = {.events = 0, .data.fd = INVALID_FD};
+
+ memset (vepitem, 0, sizeof (*vepitem));
+
+ vepitem->epfd = INVALID_EPFD;
+
+ vepitem->fd = INVALID_FD;
+ vepitem->next_fd = INVALID_FD;
+ vepitem->prev_fd = INVALID_FD;
+
+ vepitem->type = FD_TYPE_INVALID;
+
+ vepitem->event = event;
+ vepitem->revent = event;
+ /* vepoll attributes init here */
+}
+
+static inline void
+vsocket_set (vcom_socket_t * vsock,
+ i32 fd, i32 sid, vcom_socket_type_t type)
{
vsock->fd = fd;
vsock->sid = sid;
@@ -89,15 +252,52 @@ vsocket_set (vcom_socket_t * vsock, i32 fd, i32 sid, vcom_socket_type_t type)
/* vcom socket attributes set here */
}
+static inline void
+vepoll_set (vcom_epoll_t * vepoll,
+ i32 epfd, i32 vep_idx,
+ vcom_epoll_type_t type, i32 flags, i32 count, u32 close)
+{
+ vepoll->epfd = epfd;
+ vepoll->vep_idx = vep_idx;
+ vepoll->type = type;
+ vepoll->flags = flags;
+
+ vepoll->count = count;
+ vepoll->close = close;
+ /* vcom epoll attributes set here */
+}
+
+static inline void
+vepitem_set (vcom_epitem_t * vepitem,
+ i32 epfd,
+ i32 fd, i32 next_fd, i32 prev_fd,
+ vcom_fd_type_t type,
+ struct epoll_event event, struct epoll_event revent)
+{
+ vepitem->epfd = epfd;
+
+ vepitem->fd = fd;
+ vepitem->next_fd = next_fd;
+ vepitem->prev_fd = prev_fd;
+
+ vepitem->type = type;
+
+ vepitem->event = event;
+ vepitem->revent = revent;
+ /* vcom epitem attributes set here */
+}
+
static inline int
vsocket_is_vppcom_bound (vcom_socket_t * vsock)
{
return vcom_socket_type_is_vppcom_bound (vsock->type);
}
-int vcom_socket_open_socket (int domain, int type, int protocol);
-
-int vcom_socket_close_socket (int fd);
+static inline int
+vepoll_is_vppcom_bound (vcom_epoll_t * vepoll)
+{
+ return vcom_socket_epoll_type_is_vppcom_bound (vepoll->type);
+}
int vcom_socket_main_init (void);
@@ -107,6 +307,9 @@ void vcom_socket_main_show (void);
int vcom_socket_is_vcom_fd (int fd);
+int
+vcom_socket_is_vcom_epfd (int epfd);
+
int vcom_socket_close (int __fd);
ssize_t vcom_socket_read (int __fd, void *__buf, size_t __nbytes);
@@ -117,29 +320,29 @@ int vcom_socket_fcntl_va (int __fd, int __cmd, va_list __ap);
int
vcom_socket_select (int vcom_nfds, fd_set * __restrict vcom_readfds,
- fd_set * __restrict vcom_writefds,
- fd_set * __restrict vcom_exceptfds,
- struct timeval *__restrict timeout);
+ fd_set * __restrict vcom_writefds,
+ fd_set * __restrict vcom_exceptfds,
+ struct timeval *__restrict timeout);
int vcom_socket_socket (int __domain, int __type, int __protocol);
int
vcom_socket_socketpair (int __domain, int __type, int __protocol,
- int __fds[2]);
+ int __fds[2]);
int vcom_socket_bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);
int
vcom_socket_getsockname (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __len);
+ socklen_t * __restrict __len);
int
vcom_socket_connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);
int
vcom_socket_getpeername (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __len);
+ socklen_t * __restrict __len);
ssize_t
vcom_socket_send (int __fd, const void *__buf, size_t __n, int __flags);
@@ -154,13 +357,13 @@ int vcom_socket_is_connection_mode_socket (int __fd);
ssize_t
vcom_socket_sendto (int __fd, const void *__buf, size_t __n,
- int __flags, __CONST_SOCKADDR_ARG __addr,
- socklen_t __addr_len);
+ int __flags, __CONST_SOCKADDR_ARG __addr,
+ socklen_t __addr_len);
ssize_t
vcom_socket_recvfrom (int __fd, void *__restrict __buf, size_t __n,
- int __flags, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __addr_len);
+ int __flags, __SOCKADDR_ARG __addr,
+ socklen_t * __restrict __addr_len);
ssize_t
vcom_socket_sendmsg (int __fd, const struct msghdr *__message, int __flags);
@@ -168,7 +371,7 @@ vcom_socket_sendmsg (int __fd, const struct msghdr *__message, int __flags);
#ifdef __USE_GNU
int
vcom_socket_sendmmsg (int __fd, struct mmsghdr *__vmessages,
- unsigned int __vlen, int __flags);
+ unsigned int __vlen, int __flags);
#endif
ssize_t vcom_socket_recvmsg (int __fd, struct msghdr *__message, int __flags);
@@ -176,33 +379,45 @@ ssize_t vcom_socket_recvmsg (int __fd, struct msghdr *__message, int __flags);
#ifdef __USE_GNU
int
vcom_socket_recvmmsg (int __fd, struct mmsghdr *__vmessages,
- unsigned int __vlen, int __flags,
- struct timespec *__tmo);
+ unsigned int __vlen, int __flags,
+ struct timespec *__tmo);
#endif
int
vcom_socket_getsockopt (int __fd, int __level, int __optname,
- void *__restrict __optval,
- socklen_t * __restrict __optlen);
+ void *__restrict __optval,
+ socklen_t * __restrict __optlen);
int
vcom_socket_setsockopt (int __fd, int __level, int __optname,
- const void *__optval, socklen_t __optlen);
+ const void *__optval, socklen_t __optlen);
int vcom_socket_listen (int __fd, int __n);
int
vcom_socket_accept (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __addr_len);
+ socklen_t * __restrict __addr_len);
#ifdef __USE_GNU
int
vcom_socket_accept4 (int __fd, __SOCKADDR_ARG __addr,
- socklen_t * __restrict __addr_len, int __flags);
+ socklen_t * __restrict __addr_len, int __flags);
#endif
int vcom_socket_shutdown (int __fd, int __how);
+int
+vcom_socket_epoll_create1 (int __flags);
+
+int
+vcom_socket_epoll_ctl (int __epfd, int __op, int __fd,
+ struct epoll_event *__event);
+
+int
+vcom_socket_epoll_pwait (int __epfd, struct epoll_event *__events,
+ int __maxevents, int __timeout,
+ const __sigset_t *__ss);
+
#endif /* included_vcom_socket_h */
/*
diff --git a/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket_wrapper.c b/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket_wrapper.c
index 8fe7e1d..cadac92 100644
--- a/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket_wrapper.c
+++ b/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket_wrapper.c
@@ -103,13 +103,13 @@ static pthread_mutex_t libc_symbol_binding_mutex = PTHREAD_MUTEX_INITIALIZER;
#else
static void
swrap_log (enum swrap_dbglvl_e dbglvl, const char *func,
- const char *format, ...)
+ const char *format, ...)
PRINTF_ATTRIBUTE (3, 4);
#define SWRAP_LOG(dbglvl, ...) swrap_log((dbglvl), __func__, __VA_ARGS__)
static void
swrap_log (enum swrap_dbglvl_e dbglvl,
- const char *func, const char *format, ...)
+ const char *func, const char *format, ...)
{
char buffer[1024];
va_list va;
@@ -122,28 +122,28 @@ PRINTF_ATTRIBUTE (3, 4);
if (lvl >= dbglvl)
{
switch (dbglvl)
- {
- case SWRAP_LOG_ERROR:
- fprintf (stderr,
- "SWRAP_ERROR(%d) - %s: %s\n",
- (int) getpid (), func, buffer);
- break;
- case SWRAP_LOG_WARN:
- fprintf (stderr,
- "SWRAP_WARN(%d) - %s: %s\n",
- (int) getpid (), func, buffer);
- break;
- case SWRAP_LOG_DEBUG:
- fprintf (stderr,
- "SWRAP_DEBUG(%d) - %s: %s\n",
- (int) getpid (), func, buffer);
- break;
- case SWRAP_LOG_TRACE:
- fprintf (stderr,
- "SWRAP_TRACE(%d) - %s: %s\n",
- (int) getpid (), func, buffer);
- break;
- }
+ {
+ case SWRAP_LOG_ERROR:
+ fprintf (stderr,
+ "SWRAP_ERROR(%d) - %s: %s\n",
+ (int) getpid (), func, buffer);
+ break;
+ case SWRAP_LOG_WARN:
+ fprintf (stderr,
+ "SWRAP_WARN(%d) - %s: %s\n",
+ (int) getpid (), func, buffer);
+ break;
+ case SWRAP_LOG_DEBUG:
+ fprintf (stderr,
+ "SWRAP_DEBUG(%d) - %s: %s\n",
+ (int) getpid (), func, buffer);
+ break;
+ case SWRAP_LOG_TRACE:
+ fprintf (stderr,
+ "SWRAP_TRACE(%d) - %s: %s\n",
+ (int) getpid (), func, buffer);
+ break;
+ }
}
}
#endif
@@ -155,18 +155,18 @@ PRINTF_ATTRIBUTE (3, 4);
#ifdef HAVE_ACCEPT4
typedef int (*__libc_accept4) (int sockfd,
- struct sockaddr * addr,
- socklen_t * addrlen, int flags);
+ struct sockaddr * addr,
+ socklen_t * addrlen, int flags);
#else
typedef int (*__libc_accept) (int sockfd,
- struct sockaddr * addr, socklen_t * addrlen);
+ struct sockaddr * addr, socklen_t * addrlen);
#endif
typedef int (*__libc_bind) (int sockfd,
- const struct sockaddr * addr, socklen_t addrlen);
+ const struct sockaddr * addr, socklen_t addrlen);
typedef int (*__libc_close) (int fd);
typedef int (*__libc_connect) (int sockfd,
- const struct sockaddr * addr,
- socklen_t addrlen);
+ const struct sockaddr * addr,
+ socklen_t addrlen);
#if 0
/* TBD: dup and dup2 to be implemented later */
@@ -183,15 +183,15 @@ typedef FILE *(*__libc_fopen64) (const char *name, const char *mode);
typedef int (*__libc_eventfd) (int count, int flags);
#endif
typedef int (*__libc_getpeername) (int sockfd,
- struct sockaddr * addr,
- socklen_t * addrlen);
+ struct sockaddr * addr,
+ socklen_t * addrlen);
typedef int (*__libc_getsockname) (int sockfd,
- struct sockaddr * addr,
- socklen_t * addrlen);
+ struct sockaddr * addr,
+ socklen_t * addrlen);
typedef int (*__libc_getsockopt) (int sockfd,
- int level,
- int optname,
- void *optval, socklen_t * optlen);
+ int level,
+ int optname,
+ void *optval, socklen_t * optlen);
typedef int (*__libc_ioctl) (int d, unsigned long int request, ...);
typedef int (*__libc_listen) (int sockfd, int backlog);
typedef int (*__libc_open) (const char *pathname, int flags, mode_t mode);
@@ -202,53 +202,68 @@ typedef int (*__libc_openat) (int dirfd, const char *path, int flags, ...);
typedef int (*__libc_pipe) (int pipefd[2]);
typedef int (*__libc_read) (int fd, void *buf, size_t count);
typedef ssize_t (*__libc_readv) (int fd, const struct iovec * iov,
- int iovcnt);
+ int iovcnt);
typedef int (*__libc_recv) (int sockfd, void *buf, size_t len, int flags);
typedef int (*__libc_recvfrom) (int sockfd,
- void *buf,
- size_t len,
- int flags,
- struct sockaddr * src_addr,
- socklen_t * addrlen);
+ void *buf,
+ size_t len,
+ int flags,
+ struct sockaddr * src_addr,
+ socklen_t * addrlen);
typedef int (*__libc_recvmsg) (int sockfd, const struct msghdr * msg,
- int flags);
+ int flags);
typedef int (*__libc_send) (int sockfd, const void *buf, size_t len,
- int flags);
+ int flags);
typedef int (*__libc_sendmsg) (int sockfd, const struct msghdr * msg,
- int flags);
+ int flags);
typedef int (*__libc_sendto) (int sockfd, const void *buf, size_t len,
- int flags, const struct sockaddr * dst_addr,
- socklen_t addrlen);
+ int flags, const struct sockaddr * dst_addr,
+ socklen_t addrlen);
typedef int (*__libc_setsockopt) (int sockfd, int level, int optname,
- const void *optval, socklen_t optlen);
+ const void *optval, socklen_t optlen);
#ifdef HAVE_SIGNALFD
typedef int (*__libc_signalfd) (int fd, const sigset_t * mask, int flags);
#endif
typedef int (*__libc_socket) (int domain, int type, int protocol);
typedef int (*__libc_socketpair) (int domain, int type, int protocol,
- int sv[2]);
+ int sv[2]);
#ifdef HAVE_TIMERFD_CREATE
typedef int (*__libc_timerfd_create) (int clockid, int flags);
#endif
typedef ssize_t (*__libc_write) (int fd, const void *buf, size_t count);
typedef ssize_t (*__libc_writev) (int fd, const struct iovec * iov,
- int iovcnt);
+ int iovcnt);
typedef int (*__libc_shutdown) (int fd, int how);
typedef int (*__libc_select) (int __nfds, fd_set * __restrict __readfds,
- fd_set * __restrict __writefds,
- fd_set * __restrict __exceptfds,
- struct timeval * __restrict __timeout);
+ fd_set * __restrict __writefds,
+ fd_set * __restrict __exceptfds,
+ struct timeval * __restrict __timeout);
#ifdef __USE_XOPEN2K
typedef int (*__libc_pselect) (int __nfds, fd_set * __restrict __readfds,
- fd_set * __restrict __writefds,
- fd_set * __restrict __exceptfds,
- const struct timespec * __restrict __timeout,
- const __sigset_t * __restrict __sigmask);
+ fd_set * __restrict __writefds,
+ fd_set * __restrict __exceptfds,
+ const struct timespec * __restrict __timeout,
+ const __sigset_t * __restrict __sigmask);
#endif
+typedef int (*__libc_epoll_create) (int __size);
+
+typedef int (*__libc_epoll_create1) (int __flags);
+
+typedef int (*__libc_epoll_ctl) (int __epfd, int __op, int __fd,
+ struct epoll_event *__event);
+
+typedef int (*__libc_epoll_wait) (int __epfd, struct epoll_event *__events,
+ int __maxevents, int __timeout);
+
+typedef int (*__libc_epoll_pwait) (int __epfd, struct epoll_event *__events,
+ int __maxevents, int __timeout,
+ const __sigset_t *__ss);
+
+
#define SWRAP_SYMBOL_ENTRY(i) \
union { \
__libc_##i f; \
@@ -314,6 +329,11 @@ struct swrap_libc_symbols
#ifdef __USE_XOPEN2K
SWRAP_SYMBOL_ENTRY (pselect);
#endif
+ SWRAP_SYMBOL_ENTRY (epoll_create);
+ SWRAP_SYMBOL_ENTRY (epoll_create1);
+ SWRAP_SYMBOL_ENTRY (epoll_ctl);
+ SWRAP_SYMBOL_ENTRY (epoll_wait);
+ SWRAP_SYMBOL_ENTRY (epoll_pwait);
};
struct swrap
@@ -367,35 +387,35 @@ swrap_load_lib_handle (enum swrap_lib lib)
handle = swrap.libc.handle;
#ifdef LIBC_SO
if (handle == NULL)
- {
- handle = dlopen (LIBC_SO, flags);
+ {
+ handle = dlopen (LIBC_SO, flags);
- swrap.libc.handle = handle;
- }
+ swrap.libc.handle = handle;
+ }
#endif
if (handle == NULL)
- {
- for (i = 10; i >= 0; i--)
- {
- char soname[256] = { 0 };
-
- snprintf (soname, sizeof (soname), "libc.so.%d", i);
- handle = dlopen (soname, flags);
- if (handle != NULL)
- {
- break;
- }
- }
-
- swrap.libc.handle = handle;
- }
+ {
+ for (i = 10; i >= 0; i--)
+ {
+ char soname[256] = { 0 };
+
+ snprintf (soname, sizeof (soname), "libc.so.%d", i);
+ handle = dlopen (soname, flags);
+ if (handle != NULL)
+ {
+ break;
+ }
+ }
+
+ swrap.libc.handle = handle;
+ }
break;
}
if (handle == NULL)
{
SWRAP_LOG (SWRAP_LOG_ERROR,
- "Failed to dlopen library: %s\n", dlerror ());
+ "Failed to dlopen library: %s\n", dlerror ());
exit (-1);
}
@@ -414,12 +434,12 @@ _swrap_bind_symbol (enum swrap_lib lib, const char *fn_name)
if (func == NULL)
{
SWRAP_LOG (SWRAP_LOG_ERROR,
- "Failed to find %s: %s\n", fn_name, dlerror ());
+ "Failed to find %s: %s\n", fn_name, dlerror ());
exit (-1);
}
SWRAP_LOG (SWRAP_LOG_TRACE,
- "Loaded %s from %s", fn_name, swrap_str_lib (lib));
+ "Loaded %s from %s", fn_name, swrap_str_lib (lib));
return func;
}
@@ -443,7 +463,7 @@ _swrap_bind_symbol (enum swrap_lib lib, const char *fn_name)
#ifdef HAVE_ACCEPT4
int
libc_accept4 (int sockfd,
- struct sockaddr *addr, socklen_t * addrlen, int flags)
+ struct sockaddr *addr, socklen_t * addrlen, int flags)
{
swrap_bind_symbol_libc (accept4);
@@ -529,8 +549,8 @@ libc_vfcntl (int fd, int cmd, va_list ap)
}
rc = swrap.libc.symbols._libc_fcntl.f (fd,
- cmd,
- args[0], args[1], args[2], args[3]);
+ cmd,
+ args[0], args[1], args[2], args[3]);
return rc;
}
@@ -553,13 +573,13 @@ libc_getsockname (int sockfd, struct sockaddr *addr, socklen_t * addrlen)
int
libc_getsockopt (int sockfd,
- int level, int optname, void *optval, socklen_t * optlen)
+ int level, int optname, void *optval, socklen_t * optlen)
{
swrap_bind_symbol_libc (getsockopt);
return swrap.libc.symbols._libc_getsockopt.f (sockfd,
- level,
- optname, optval, optlen);
+ level,
+ optname, optval, optlen);
}
int
@@ -588,15 +608,15 @@ libc_recv (int sockfd, void *buf, size_t len, int flags)
int
libc_recvfrom (int sockfd,
- void *buf,
- size_t len,
- int flags, struct sockaddr *src_addr, socklen_t * addrlen)
+ void *buf,
+ size_t len,
+ int flags, struct sockaddr *src_addr, socklen_t * addrlen)
{
swrap_bind_symbol_libc (recvfrom);
return swrap.libc.symbols._libc_recvfrom.f (sockfd,
- buf,
- len, flags, src_addr, addrlen);
+ buf,
+ len, flags, src_addr, addrlen);
}
int
@@ -625,26 +645,26 @@ libc_sendmsg (int sockfd, const struct msghdr *msg, int flags)
int
libc_sendto (int sockfd,
- const void *buf,
- size_t len,
- int flags, const struct sockaddr *dst_addr, socklen_t addrlen)
+ const void *buf,
+ size_t len,
+ int flags, const struct sockaddr *dst_addr, socklen_t addrlen)
{
swrap_bind_symbol_libc (sendto);
return swrap.libc.symbols._libc_sendto.f (sockfd,
- buf,
- len, flags, dst_addr, addrlen);
+ buf,
+ len, flags, dst_addr, addrlen);
}
int
libc_setsockopt (int sockfd,
- int level, int optname, const void *optval, socklen_t optlen)
+ int level, int optname, const void *optval, socklen_t optlen)
{
swrap_bind_symbol_libc (setsockopt);
return swrap.libc.symbols._libc_setsockopt.f (sockfd,
- level,
- optname, optval, optlen);
+ level,
+ optname, optval, optlen);
}
int
@@ -681,34 +701,77 @@ libc_shutdown (int fd, int how)
int
libc_select (int __nfds, fd_set * __restrict __readfds,
- fd_set * __restrict __writefds,
- fd_set * __restrict __exceptfds,
- struct timeval *__restrict __timeout)
+ fd_set * __restrict __writefds,
+ fd_set * __restrict __exceptfds,
+ struct timeval *__restrict __timeout)
{
swrap_bind_symbol_libc (select);
return swrap.libc.symbols._libc_select.f (__nfds, __readfds,
- __writefds,
- __exceptfds, __timeout);
+ __writefds,
+ __exceptfds, __timeout);
}
#ifdef __USE_XOPEN2K
int
libc_pselect (int __nfds, fd_set * __restrict __readfds,
- fd_set * __restrict __writefds,
- fd_set * __restrict __exceptfds,
- const struct timespec *__restrict __timeout,
- const __sigset_t * __restrict __sigmask)
+ fd_set * __restrict __writefds,
+ fd_set * __restrict __exceptfds,
+ const struct timespec *__restrict __timeout,
+ const __sigset_t * __restrict __sigmask)
{
swrap_bind_symbol_libc (pselect);
return swrap.libc.symbols._libc_pselect.f (__nfds, __readfds,
- __writefds,
- __exceptfds,
- __timeout, __sigmask);
+ __writefds,
+ __exceptfds,
+ __timeout, __sigmask);
}
#endif
+int libc_epoll_create (int __size)
+{
+ swrap_bind_symbol_libc (epoll_create);
+
+ return swrap.libc.symbols._libc_epoll_create.f (__size);
+}
+
+int libc_epoll_create1 (int __flags)
+{
+ swrap_bind_symbol_libc (epoll_create1);
+
+ return swrap.libc.symbols._libc_epoll_create1.f (__flags);
+}
+
+int libc_epoll_ctl (int __epfd, int __op, int __fd,
+ struct epoll_event *__event)
+{
+ swrap_bind_symbol_libc (epoll_ctl);
+
+ return swrap.libc.symbols._libc_epoll_ctl.f (__epfd, __op, __fd,
+ __event);
+}
+
+int libc_epoll_wait (int __epfd, struct epoll_event *__events,
+ int __maxevents, int __timeout)
+{
+ swrap_bind_symbol_libc (epoll_wait);
+
+ return swrap.libc.symbols._libc_epoll_wait.f (__epfd, __events,
+ __maxevents, __timeout);
+}
+
+int libc_epoll_pwait (int __epfd, struct epoll_event *__events,
+ int __maxevents, int __timeout,
+ const __sigset_t *__ss)
+{
+ swrap_bind_symbol_libc (epoll_pwait);
+
+ return swrap.libc.symbols._libc_epoll_pwait.f (__epfd, __events,
+ __maxevents, __timeout,
+ __ss);
+}
+
static void
swrap_thread_prepare (void)
{
@@ -739,7 +802,7 @@ swrap_constructor (void)
* This should prevent such deadlocks.
*/
pthread_atfork (&swrap_thread_prepare,
- &swrap_thread_parent, &swrap_thread_child);
+ &swrap_thread_parent, &swrap_thread_child);
}
/****************************
diff --git a/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket_wrapper.h b/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket_wrapper.h
index e3590d6..8ca8bb6 100644
--- a/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket_wrapper.h
+++ b/vcl-ldpreload/src/libvcl-ldpreload/vcom_socket_wrapper.h
@@ -62,6 +62,7 @@
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/select.h>
+#include <sys/epoll.h>
#include <sys/uio.h>
#include <stdlib.h>
@@ -105,7 +106,7 @@
#ifdef HAVE_ACCEPT4
int
libc_accept4 (int sockfd,
- struct sockaddr *addr, socklen_t * addrlen, int flags);
+ struct sockaddr *addr, socklen_t * addrlen, int flags);
#else /* HAVE_ACCEPT4 */
int libc_accept (int sockfd, struct sockaddr *addr, socklen_t * addrlen);
#endif /* HAVE_ACCEPT4 */
@@ -136,7 +137,7 @@ int libc_getsockname (int sockfd, struct sockaddr *addr, socklen_t * addrlen);
int
libc_getsockopt (int sockfd,
- int level, int optname, void *optval, socklen_t * optlen);
+ int level, int optname, void *optval, socklen_t * optlen);
int libc_listen (int sockfd, int backlog);
@@ -146,9 +147,9 @@ int libc_recv (int sockfd, void *buf, size_t len, int flags);
int
libc_recvfrom (int sockfd,
- void *buf,
- size_t len,
- int flags, struct sockaddr *src_addr, socklen_t * addrlen);
+ void *buf,
+ size_t len,
+ int flags, struct sockaddr *src_addr, socklen_t * addrlen);
int libc_recvmsg (int sockfd, struct msghdr *msg, int flags);
@@ -158,14 +159,14 @@ int libc_sendmsg (int sockfd, const struct msghdr *msg, int flags);
int
libc_sendto (int sockfd,
- const void *buf,
- size_t len,
- int flags, const struct sockaddr *dst_addr, socklen_t addrlen);
+ const void *buf,
+ size_t len,
+ int flags, const struct sockaddr *dst_addr, socklen_t addrlen);
int
libc_setsockopt (int sockfd,
- int level, int optname, const void *optval,
- socklen_t optlen);
+ int level, int optname, const void *optval,
+ socklen_t optlen);
int libc_socket (int domain, int type, int protocol);
@@ -177,19 +178,33 @@ int libc_shutdown (int fd, int how);
int
libc_select (int __nfds, fd_set * __restrict __readfds,
- fd_set * __restrict __writefds,
- fd_set * __restrict __exceptfds,
- struct timeval *__restrict __timeout);
+ fd_set * __restrict __writefds,
+ fd_set * __restrict __exceptfds,
+ struct timeval *__restrict __timeout);
#ifdef __USE_XOPEN2K
int
libc_pselect (int __nfds, fd_set * __restrict __readfds,
- fd_set * __restrict __writefds,
- fd_set * __restrict __exceptfds,
- const struct timespec *__restrict __timeout,
- const __sigset_t * __restrict __sigmask);
+ fd_set * __restrict __writefds,
+ fd_set * __restrict __exceptfds,
+ const struct timespec *__restrict __timeout,
+ const __sigset_t * __restrict __sigmask);
#endif
+int libc_epoll_create (int __size);
+
+int libc_epoll_create1 (int __flags);
+
+int libc_epoll_ctl (int __epfd, int __op, int __fd,
+ struct epoll_event *__event);
+
+int libc_epoll_wait (int __epfd, struct epoll_event *__events,
+ int __maxevents, int __timeout);
+
+int libc_epoll_pwait (int __epfd, struct epoll_event *__events,
+ int __maxevents, int __timeout,
+ const __sigset_t *__ss);
+
void swrap_constructor (void);
void swrap_destructor (void);