On Tue, Aug 7, 2018 at 5:49 AM, Charles Myers <charles.my...@spirent.com>
wrote:

> Signed-off-by: Charles Myers <charles.my...@spirent.com>
> ---
>  bsd/sys/compat/linux/linux_ioctl.cc | 37 ++++++++++++++++++++++++++++++
> +++----
>  1 file changed, 33 insertions(+), 4 deletions(-)
>
> diff --git a/bsd/sys/compat/linux/linux_ioctl.cc
> b/bsd/sys/compat/linux/linux_ioctl.cc
> index 43a50bb..d49386d 100644
> --- a/bsd/sys/compat/linux/linux_ioctl.cc
> +++ b/bsd/sys/compat/linux/linux_ioctl.cc
> @@ -43,8 +43,8 @@
>  #include <bsd/sys/net/if_dl.h>
>  #include <bsd/sys/net/if_types.h>
>
> -#include <bsd/sys/compat/linux/linux_socket.h>
>  #include <bsd/sys/compat/linux/linux.h>
> +#include <bsd/sys/compat/linux/linux_socket.h>
>
>  #include <osv/file.h>
>  #include <osv/socket.hh>
> @@ -199,6 +199,17 @@ linux_gifhwaddr(struct ifnet *ifp, struct l_ifreq
> *ifr)
>      return (ENOENT);
>  }
>
> +static int
> +linux_sifname(socket_file *fp, struct l_ifreq *data)
> +{
> +    struct bsd_ifreq ifreq;
> +
> +    // FreeBSD ifreq uses a pointer to the new name string instead of
> including it in the struct
> +    memcpy((char *)&ifreq, data->ifr_name, IFNAMSIZ);
>

Wouldn't it be better to use strncpy instead of memcpy? So that if the
string is shorter than IFNAMSIZ we don't try to read beyond its end?


> +    ifreq.ifr_ifru.ifru_data = (caddr_t)(data->ifr_ifru.ifru_newname);
>

Is this the only field in ifreq we need to fill?

+
> +    return fp->bsd_ioctl(SIOCSIFNAME, &ifreq);
> +}
>
>  /*
>   * Fix the interface address field in bsd_ifreq. The bsd stack expects a
> @@ -223,6 +234,16 @@ linux_to_bsd_ifreq(struct bsd_ifreq *ifr_p)
>  }
>
>  /*
> + * FreeBSD ifru_index is short but Linux is an int so need to clear extra
> bits.
>

Doesn't bsd_to_linux_ifreq do among other things, also this?
Maybe not, I'm not familiar with the details.

+ */
> +static inline void
> +bsd_to_linux_ifreq_ifindex(struct bsd_ifreq *ifr_p)
> +{
> +    void *ptr = &ifr_p->ifr_index;
> +    *(int *)(ptr) = ifr_p->ifr_index;
> +}
> +
> +/*
>   * Socket related ioctls
>   */
>
> @@ -241,8 +262,8 @@ linux_ioctl_socket(socket_file *fp, u_long cmd, void
> *data)
>      switch (cmd) {
>      case SIOCSIFADDR:
>      case SIOCSIFNETMASK:
> -    case SIOCSIFDSTADDR:
> -    case SIOCSIFBRDADDR:
> +    case SIOCSIFDSTADDR:
> +    case SIOCSIFBRDADDR:
>          if ((ifp = ifunit_ref((char *)data)) == NULL)
>              return (EINVAL);
>          linux_to_bsd_ifreq((struct bsd_ifreq *)data) ;
> @@ -251,10 +272,16 @@ linux_ioctl_socket(socket_file *fp, u_long cmd, void
> *data)
>
>      case SIOCGIFMTU:
>      case SIOCSIFMTU:
> +        if ((ifp = ifunit_ref((char *)data)) == NULL)
> +            return (EINVAL);
> +        error = fp->bsd_ioctl(cmd, data);
> +        break;
> +
>      case SIOCGIFINDEX:
>          if ((ifp = ifunit_ref((char *)data)) == NULL)
>              return (EINVAL);
>          error = fp->bsd_ioctl(cmd, data);
> +       bsd_to_linux_ifreq_ifindex((struct bsd_ifreq *)data);
>          break;
>
>      case SIOCGIFADDR:
> @@ -278,7 +305,9 @@ linux_ioctl_socket(socket_file *fp, u_long cmd, void
> *data)
>          break;
>
>      case SIOCSIFNAME:
> -        error = ENOIOCTL;
> +        if ((ifp = ifunit_ref((char *)data)) == NULL)
> +            return (EINVAL);
> +        error = linux_sifname(fp, (struct l_ifreq *)data);
>          break;
>
>      case SIOCGIFHWADDR:
> --
> 2.7.4
>
> --
> You received this message because you are subscribed to the Google Groups
> "OSv Development" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to osv-dev+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to osv-dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to