* RETURN: 0 on success -1 on failure
* */
static inline int
-vcom_init ()
+vcom_init (void)
{
pid_t pid = getpid ();
+ int rv;
if (!is_vcom_init)
{
- if (vppcom_app_create (vcom_get_app_name ()) != 0)
+ rv = vppcom_app_create (vcom_get_app_name ());
+ if (rv)
{
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;
+ return rv;
}
if (vcom_socket_main_init () != 0)
{
if (is_vcom_socket_fd (__fd) || is_vcom_epfd (__fd))
{
if (VCOM_DEBUG > 0)
- vcom_socket_main_show ();
+ fprintf (stderr, "[%d] close: fd %d\n", pid, __fd);
rv = vcom_close (__fd);
if (VCOM_DEBUG > 0)
- fprintf (stderr, "[%d] close: " "'%04d'='%04d'\n", pid, rv, __fd);
- if (VCOM_DEBUG > 0)
- vcom_socket_main_show ();
+ fprintf (stderr, "[%d] close: vcom_close() returned %d\n", pid, rv);
if (rv != 0)
{
errno = -rv;
int
vcom_connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)
{
- int rv = -1;
+ int rv;
- if (vcom_init () != 0)
+ rv = vcom_init ();
+ if (rv)
{
- return -1;
+ return rv;
}
/* validate __len */
{
case AF_INET:
if (__len != INET_ADDRSTRLEN)
- return -1;
+ return -EINVAL;
break;
case AF_INET6:
if (__len != INET6_ADDRSTRLEN)
- return -1;
+ return -EINVAL;
break;
default:
- return -1;
+ return -EAFNOSUPPORT;
break;
}
break;
default:
- return -1;
+ return -EPFNOSUPPORT;
break;
}
{
int rv;
pid_t pid = getpid ();
- pthread_t tid = pthread_self ();
if (is_vcom_socket_fd (__fd))
{
rv = vcom_connect (__fd, __addr, __len);
if (VCOM_DEBUG > 0)
fprintf (stderr,
- "[%d][%lu (0x%lx)] connect: "
+ "[%d] connect: "
"'%04d'='%04d', '%p', '%04d'\n",
- pid, (unsigned long) tid, (unsigned long) tid,
- rv, __fd, __addr, __len);
- if (rv != 0)
+ pid, rv, __fd, __addr, __len);
+ if (rv)
{
errno = -rv;
return -1;
return libc_send (__fd, __buf, __n, __flags);
}
+ssize_t
+sendfile (int __out_fd, int __in_fd, off_t * __offset, size_t __len)
+{
+ ssize_t size;
+
+ if (VCOM_DEBUG > 2)
+ clib_warning ("[%d] __out_fd %d, __in_fd %d, __offset %p, __len %ld",
+ getpid (), __out_fd, __in_fd, __offset, __len);
+
+ if (is_vcom_socket_fd (__out_fd))
+ {
+ /* TBD: refactor this check to be part of is_vcom_socket_fd() */
+ if (vcom_init () != 0)
+ return -1;
+
+ size = vcom_socket_sendfile (__out_fd, __in_fd, __offset, __len);
+ if (VCOM_DEBUG > 2)
+ clib_warning ("[%d] vcom_socket_sendfile (out_fd %d, in_fd %d, "
+ "offset %p (%ld), len %lu) returned %ld",
+ getpid (), __out_fd, __in_fd, __offset,
+ __offset ? *__offset : -1, __len, size);
+ if (size < 0)
+ {
+ errno = -size;
+ return -1;
+ }
+ return size;
+ }
+ if (VCOM_DEBUG > 2)
+ clib_warning ("[%d] calling libc_sendfile!", getpid ());
+ return libc_sendfile (__out_fd, __in_fd, __offset, __len);
+}
+
+ssize_t
+sendfile64 (int __out_fd, int __in_fd, off_t * __offset, size_t __len)
+{
+ return sendfile (__out_fd, __in_fd, __offset, __len);
+}
+
+
/*
* Read N bytes into BUF from socket FD.
* Returns the number read or -1 for errors.
rv =
vcom_socket_epoll_pwait (__epfd, __events, __maxevents, __timeout, NULL);
- if (VCOM_DEBUG > 1)
+ if (VCOM_DEBUG > 2)
fprintf (stderr,
"[%d] epoll_wait: "
"'%04d'='%04d', '%p', "