On Tue, Aug 7, 2018 at 5:49 AM, Charles Myers <[email protected]>
wrote:

> Signed-off-by: Charles Myers <[email protected]>
> ---
>  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 [email protected].
> 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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to