vcl: add separate fcntl64 ldp handler
[vpp.git] / src / vcl / ldp.c
index d6e81d6..091c7e5 100644 (file)
@@ -477,13 +477,8 @@ writev (int fd, const struct iovec * iov, int iovcnt)
   return size;
 }
 
-#ifdef HAVE_FCNTL64
-int
-fcntl64 (int fd, int cmd, ...)
-#else
 int
 fcntl (int fd, int cmd, ...)
-#endif
 {
   vls_handle_t vlsh;
   int rv = 0;
@@ -543,6 +538,18 @@ fcntl (int fd, int cmd, ...)
   return rv;
 }
 
+int
+fcntl64 (int fd, int cmd, ...)
+{
+  va_list ap;
+  int rv;
+
+  va_start (ap, cmd);
+  rv = fcntl (fd, cmd, ap);
+  va_end (ap);
+  return rv;
+}
+
 int
 ioctl (int fd, unsigned long int cmd, ...)
 {
@@ -620,12 +627,13 @@ ldp_select_init_maps (fd_set * __restrict original,
     if (vlsh == VLS_INVALID_HANDLE)
       clib_bitmap_set_no_check (*libcb, fd, 1);
     else
-      clib_bitmap_set_no_check (*vclb, vlsh_to_session_index (vlsh), 1);
+      *vclb = clib_bitmap_set (*vclb, vlsh_to_session_index (vlsh), 1);
   }));
   /* *INDENT-ON* */
 
   si_bits_set = clib_bitmap_last_set (*vclb) + 1;
   *si_bits = (si_bits_set > *si_bits) ? si_bits_set : *si_bits;
+  clib_bitmap_validate (*resultb, *si_bits);
 
   libc_bits_set = clib_bitmap_last_set (*libcb) + 1;
   *libc_bits = (libc_bits_set > *libc_bits) ? libc_bits_set : *libc_bits;
@@ -757,15 +765,15 @@ ldp_pselect (int nfds, fd_set * __restrict readfds,
        {
          if (readfds)
            clib_memcpy_fast (ldpw->rd_bitmap, ldpw->si_rd_bitmap,
-                             vec_len (ldpw->rd_bitmap) *
+                             vec_len (ldpw->si_rd_bitmap) *
                              sizeof (clib_bitmap_t));
          if (writefds)
            clib_memcpy_fast (ldpw->wr_bitmap, ldpw->si_wr_bitmap,
-                             vec_len (ldpw->wr_bitmap) *
+                             vec_len (ldpw->si_wr_bitmap) *
                              sizeof (clib_bitmap_t));
          if (exceptfds)
            clib_memcpy_fast (ldpw->ex_bitmap, ldpw->si_ex_bitmap,
-                             vec_len (ldpw->ex_bitmap) *
+                             vec_len (ldpw->si_ex_bitmap) *
                              sizeof (clib_bitmap_t));
 
          rv = vls_select (si_bits, readfds ? ldpw->rd_bitmap : NULL,
@@ -775,6 +783,7 @@ ldp_pselect (int nfds, fd_set * __restrict readfds,
            {
              errno = -rv;
              rv = -1;
+             goto done;
            }
          else if (rv > 0)
            {
@@ -1502,7 +1511,10 @@ recv (int fd, void *buf, size_t n, int flags)
     {
       size = vls_recvfrom (vlsh, buf, n, flags, NULL);
       if (size < 0)
-       errno = -size;
+       {
+         errno = -size;
+         size = -1;
+       }
     }
   else
     {
@@ -1811,8 +1823,8 @@ getsockopt (int fd, int level, int optname,
                rv = -EFAULT;
              break;
            case TCP_CONGESTION:
-             strcpy (optval, "cubic");
              *optlen = strlen ("cubic");
+             strncpy (optval, "cubic", *optlen + 1);
              rv = 0;
              break;
            default: