Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 25 Aug 2016 22:27:21 +0200
From:      Mariusz Zaborski <oshogbo@freebsd.org>
To:        Kristof Provost <kp@freebsd.org>
Cc:        src-committers <src-committers@freebsd.org>, svn-src-all@freebsd.org,  svn-src-head@freebsd.org
Subject:   Re: svn commit: r304815 - in head: lib lib/libifc share/examples/libifc share/mk
Message-ID:  <CAGOYWV8y33piiSYmU6mcTyqvd_kpObc47X5V5_Co_ogqVwDu5A@mail.gmail.com>
In-Reply-To: <201608251940.u7PJePv3023083@repo.freebsd.org>
References:  <201608251940.u7PJePv3023083@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Some inline comments :)

Cheers,
Mariusz

[...]
> +libifc_handle_t *
> +libifc_open(void)
> +{
> +       struct libifc_handle *h;
> +
> +       h = calloc(1, sizeof(struct libifc_handle));
This can fail, and we are using NULL references.

> +
> +       for (int i = 0; i <= AF_MAX; i++) {
> +               h->sockets[i] = -1;
> +       }
> +
> +       return (h);
> +}
> +
> +
> +void
> +libifc_close(libifc_handle_t *h)
> +{
Missing blank line.
> +       for (int i = 0; i <= AF_MAX; i++) {
> +               if (h->sockets[i] != -1) {
> +                       (void)close(h->sockets[i]);
> +               }
> +       }
> +       free(h);
> +}
[...]
> +int
> +libifc_get_description(libifc_handle_t *h, const char *name, char **description)
> +{
> +       struct ifreq ifr;
> +       char *descr = NULL;
> +       size_t descrlen = 64;
> +
> +       memset(&ifr, 0, sizeof(struct ifreq));
> +       (void)strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
> +       for (;;) {
> +               if ((descr = reallocf(descr, descrlen)) == NULL) {
> +                       h->error.errtype = OTHER;
> +                       h->error.errcode = ENOMEM;
> +                       return (-1);
> +               }
> +
> +               ifr.ifr_buffer.buffer = descr;
> +               ifr.ifr_buffer.length = descrlen;
> +               if (libifc_ioctlwrap(h, AF_LOCAL, SIOCGIFDESCR,
> +                   &ifr) != 0) {
> +                       return (-1);
> +               }
> +
> +               if (ifr.ifr_buffer.buffer == descr) {
> +                       if (strlen(descr) > 0) {
> +                               *description = strdup(descr);
This can fail.
> +                               free(descr);
> +                               return (0);
> +                       }
> +               } else if (ifr.ifr_buffer.length > descrlen) {
> +                       descrlen = ifr.ifr_buffer.length;
> +                       continue;
> +               }
> +               break;
> +       }
> +       free(descr);
> +       h->error.errtype = OTHER;
> +       h->error.errcode = 0;
> +       return (-1);
> +}
> +
> +
[..]

All function bellow has wrong prototypes.

> +int libifc_unset_description(libifc_handle_t *h, const char *name)
> +{
> +       struct ifreq ifr;
> +
> +       memset(&ifr, 0, sizeof(struct ifreq));
> +       (void)strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
> +       ifr.ifr_buffer.length = 0;
> +       ifr.ifr_buffer.buffer = NULL;
> +
> +       if (libifc_ioctlwrap(h, AF_LOCAL, SIOCSIFDESCR, &ifr) < 0) {
> +               return (-1);
> +       }
> +       return (0);
> +}
> +
> +
> +int libifc_set_name(libifc_handle_t *h, const char *name, const char *newname)
> +{
> +       struct ifreq ifr;
> +       char *tmpname;
> +
> +       memset(&ifr, 0, sizeof(struct ifreq));
> +       tmpname = strdup(newname);
> +       if (tmpname == NULL) {
> +               h->error.errtype = OTHER;
> +               h->error.errcode = ENOMEM;
> +               return (-1);
> +       }
> +
> +       (void)strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
> +       ifr.ifr_data = tmpname;
> +
> +       if (libifc_ioctlwrap(h, AF_LOCAL, SIOCSIFNAME, &ifr) != 0) {
> +               free(tmpname);
> +               return (-1);
> +       }
> +       free(tmpname);
> +       return (0);
> +}
> +
> +
> +int libifc_set_mtu(libifc_handle_t *h, const char *name, const int mtu)
> +{
> +       struct ifreq ifr;
> +
> +       memset(&ifr, 0, sizeof(struct ifreq));
> +       (void)strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
> +       ifr.ifr_mtu = mtu;
> +       if (libifc_ioctlwrap(h, AF_LOCAL, SIOCSIFMTU, &ifr) < 0) {
> +               return (-1);
> +       }
> +       return (0);
> +}
> +
> +
> +int libifc_get_mtu(libifc_handle_t *h, const char *name, int *mtu)
> +{
> +       struct ifreq ifr;
> +
> +       memset(&ifr, 0, sizeof(struct ifreq));
> +       (void)strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
> +       if (libifc_ioctlwrap(h, AF_LOCAL, SIOCGIFMTU, &ifr) == -1) {
> +               return (-1);
> +       }
> +       *mtu = ifr.ifr_mtu;
> +       return (0);
> +}
> +
> +
> +int libifc_set_metric(libifc_handle_t *h, const char *name, const int mtu)
> +{
> +       struct ifreq ifr;
> +
> +       memset(&ifr, 0, sizeof(struct ifreq));
> +       (void)strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
> +       ifr.ifr_mtu = mtu;
> +       if (libifc_ioctlwrap(h, AF_LOCAL, SIOCSIFMETRIC, &ifr) < 0) {
> +               return (-1);
> +       }
> +       return (0);
> +}
> +
> +
> +int libifc_get_metric(libifc_handle_t *h, const char *name, int *metric)
> +{
> +       struct ifreq ifr;
> +
> +       memset(&ifr, 0, sizeof(struct ifreq));
> +       (void)strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
> +       if (libifc_ioctlwrap(h, AF_LOCAL, SIOCGIFMETRIC, &ifr) == -1) {
> +               return (-1);
> +       }
> +       *metric = ifr.ifr_metric;
> +       return (0);
> +}
> +
> +
> +int libifc_set_capability(libifc_handle_t *h, const char *name,
> +    const int capability)
> +{
> +       struct ifreq ifr;
> +       struct libifc_capabilities ifcap;
> +       int flags;
> +       int value;
> +
> +       memset(&ifr, 0, sizeof(struct ifreq));
> +       if (libifc_get_capability(h, name, &ifcap) != 0) {
> +               return (-1);
> +       }
> +
> +       value = capability;
> +       flags = ifcap.curcap;
> +       if (value < 0) {
> +               value = -value;
> +               flags &= ~value;
> +       } else {
> +               flags |= value;
> +       }
> +       flags &= ifcap.reqcap;
> +
> +       (void)strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
> +
> +       /*
> +        * TODO: Verify that it's safe to not have ifr.ifr_curcap
> +        * set for this request.
> +        */
> +       ifr.ifr_reqcap = flags;
> +       if (libifc_ioctlwrap(h, AF_LOCAL, SIOCSIFCAP, &ifr) < 0) {
> +               return (-1);
> +       }
> +       return (0);
> +}
> +
> +
> +int libifc_get_capability(libifc_handle_t *h, const char *name,
> +    struct libifc_capabilities *capability)
> +{
> +       struct ifreq ifr;
> +
> +       memset(&ifr, 0, sizeof(struct ifreq));
> +       (void)strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
> +
> +       if (libifc_ioctlwrap(h, AF_LOCAL, SIOCGIFCAP, &ifr) < 0) {
> +               return (-1);
> +       }
> +       capability->curcap = ifr.ifr_curcap;
> +       capability->reqcap = ifr.ifr_reqcap;
> +       return (0);
> +}
> +
> +
> +int libifc_destroy_interface(libifc_handle_t *h, const char *name)
> +{
> +       struct ifreq ifr;
> +
> +       memset(&ifr, 0, sizeof(struct ifreq));
> +       (void)strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
> +
> +       if (libifc_ioctlwrap(h, AF_LOCAL, SIOCIFDESTROY, &ifr) < 0) {
> +               return (-1);
> +       }
> +       return (0);
> +}
> +
> +
> +int libifc_create_interface(libifc_handle_t *h, const char *name, char **ifname)
> +{
> +       struct ifreq ifr;
> +
> +       memset(&ifr, 0, sizeof(struct ifreq));
> +       (void)strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
> +
> +       /*
> +        * TODO:
> +        * Insert special snowflake handling here. See GitHub issue #12 for details.
> +        * In the meantime, hard-nosupport interfaces that need special handling.
> +        */
> +       if ((strncmp(name, "wlan", strlen("wlan")) == 0) ||
> +           (strncmp(name, "vlan", strlen("vlan")) == 0) ||
> +           (strncmp(name, "vxlan", strlen("vxlan")) == 0)) {
> +               h->error.errtype = OTHER;
> +               h->error.errcode = ENOSYS;
> +               return (-1);
> +       }
> +
> +       /* No special handling for this interface type. */
> +
> +       if (libifc_ioctlwrap(h, AF_LOCAL, SIOCIFCREATE2, &ifr) < 0) {
> +               return (-1);
> +       }
> +       *ifname = strdup(ifr.ifr_name);
This can fail as well.

> +       return (0);
> +}
>
> Added: head/lib/libifc/libifc.h
> ==============================================================================
> --- /dev/null   00:00:00 1970   (empty, because file is newly added)
> +++ head/lib/libifc/libifc.h    Thu Aug 25 19:40:25 2016        (r304815)
> @@ -0,0 +1,111 @@
> +/*
> + * Copyright (c) 2016, Marie Helene Kvello-Aune
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without modification,
> + * are permitted provided that the following conditions are met:
> + *
> + * 1. Redistributions of source code must retain the above copyright notice,
> + * thislist of conditions and the following disclaimer.
> + *
> + * 2. Redistributions in binary form must reproduce the above copyright notice,
> + * this list of conditions and the following disclaimer in the documentation and/or
> + * other materials provided with the distribution.
> + *
> + * 3. Neither the name of the copyright holder nor the names of its contributors
> + * may be used to endorse or promote products derived from this software without
> + * specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
> + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
> + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#pragma once
> +
> +typedef enum {
> +       OTHER, IOCTL, SOCKET
> +} libifc_errtype;
> +
> +/*
> + * Opaque definition so calling application can just pass a
> + * pointer to it for library use.
> + */
> +struct libifc_handle;
> +typedef struct libifc_handle   libifc_handle_t;
> +
> +struct libifc_capabilities {
> +       /** Current capabilities (ifconfig prints this as 'options')*/
> +       int curcap;
> +       /** Requested capabilities (ifconfig prints this as 'capabilities')*/
> +       int reqcap;
> +};
> +
> +
> +/** Retrieves a new state object for use in other API calls.
> + * Example usage:
> + *{@code
> + * // Create state object
> + * libifc_handle_t *lifh = libifc_open();
> + *
> + * // Do stuff with it
> + *
> + * // Dispose of the state object
> + * libifc_close(lifh);
> + * lifh = NULL;
> + *}
> + */
This should not be in the man?

>
> Added: head/lib/libifc/libifc_internal.c
> ==============================================================================
> --- /dev/null   00:00:00 1970   (empty, because file is newly added)
> +++ head/lib/libifc/libifc_internal.c   Thu Aug 25 19:40:25 2016        (r304815)
> @@ -0,0 +1,100 @@
> +/*
> + * Copyright (c) 2016, Marie Helene Kvello-Aune
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without modification,
> + * are permitted provided that the following conditions are met:
> + *
> + * 1. Redistributions of source code must retain the above copyright notice,
> + * thislist of conditions and the following disclaimer.
> + *
> + * 2. Redistributions in binary form must reproduce the above copyright notice,
> + * this list of conditions and the following disclaimer in the documentation and/or
> + * other materials provided with the distribution.
> + *
> + * 3. Neither the name of the copyright holder nor the names of its contributors
> + * may be used to endorse or promote products derived from this software without
> + * specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
> + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
> + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +
> +#include <net/if.h>
> +
> +#include <errno.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <sys/ioctl.h>
> +#include <unistd.h>
> +
> +
> +#include "libifc.h" // Needed for libifc_errstate
> +#include "libifc_internal.h"
> +
> +int
> +libifc_ioctlwrap_ret(libifc_handle_t *h, unsigned long request, int rcode)
> +{
> +       if (rcode != 0) {
> +               h->error.errtype = IOCTL;
> +               h->error.ioctl_request = request;
> +               h->error.errcode = errno;
> +       }
> +       return (rcode);
> +}
> +
> +
> +int
> +libifc_ioctlwrap(libifc_handle_t *h, const int addressfamily,
> +    unsigned long request, struct ifreq *ifr)
> +{
> +       int s;
> +
> +       if (libifc_socket(h, addressfamily, &s) != 0) {
> +               return (-1);
> +       }
> +
> +       int rcode = ioctl(s, request, ifr);
> +       return (libifc_ioctlwrap_ret(h, request, rcode));
libifc_ioctlwrap_ret in my opinion should not have last argument.
And we just should check if rcore is valid.
style(9) says that initialization should be done on beginning of function.

> +}
> +
> +
> +/*
> + * Function to get socket for the specified address family.
> + * If the socket doesn't already exist, attempt to create it.
> + */
> +int libifc_socket(libifc_handle_t *h, const int addressfamily, int *s)
> +{
style.
> +       if (addressfamily > AF_MAX) {
> +               h->error.errtype = SOCKET;
> +               h->error.errcode = EINVAL;
> +               return (-1);
> +       }
> +
> +       if (h->sockets[addressfamily] != -1) {
> +               *s = h->sockets[addressfamily];
> +               return (0);
> +       }
> +
> +       /* We don't have a socket of that type available. Create one. */
> +       h->sockets[addressfamily] = socket(addressfamily, SOCK_DGRAM, 0);
> +       if (h->sockets[addressfamily] == -1) {
> +               h->error.errtype = SOCKET;
> +               h->error.errcode = errno;
> +               return (-1);
> +       }
> +
> +       *s = h->sockets[addressfamily];
> +       return (0);
> +}
>
[...]
==============================================================================
> --- /dev/null   00:00:00 1970   (empty, because file is newly added)
> +++ head/share/examples/libifc/ifcreate.c       Thu Aug 25 19:40:25 2016        (r304815)
> @@ -0,0 +1,93 @@
> +/*
> + * Copyright (c) 2016, Marie Helene Kvello-Aune
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without modification,
> + * are permitted provided that the following conditions are met:
> + *
> + * 1. Redistributions of source code must retain the above copyright notice,
> + * thislist of conditions and the following disclaimer.
> + *
> + * 2. Redistributions in binary form must reproduce the above copyright notice,
> + * this list of conditions and the following disclaimer in the documentation and/or
> + * other materials provided with the distribution.
> + *
> + * 3. Neither the name of the copyright holder nor the names of its contributors
> + * may be used to endorse or promote products derived from this software without
> + * specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
> + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
> + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#include <err.h>
> +#include <errno.h>
> +#include <net/if.h>
> +#include <sys/ioctl.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <libifc.h>
> +
> +
> +int main(int argc, char *argv[])
style(9)

> +{
style(9)

> +       if (argc != 2) {
> +               errx(EINVAL, "Invalid number of arguments."
> +                   " Only one argument is accepted, and it should be the name"
> +                   " of the interface to be created.");
> +       }
> +
> +       char *ifname, *ifactualname;
style(9)

> +
> +       /* We have a static number of arguments. Therefore we can do it simple. */
> +       ifname = strdup(argv[1]);
This can fail.

> +
> +       printf("Requested interface name: %s\n", ifname);
> +
> +       libifc_handle_t *lifh = libifc_open();
This can fail right?

> +       if (libifc_create_interface(lifh, ifname, &ifactualname) == 0) {
> +               printf("Successfully created interface '%s'\n", ifactualname);
> +               libifc_close(lifh);
> +               lifh = NULL;
> +               free(ifname);
> +               free(ifactualname);
> +               return (0);
> +       } else {
> +               switch (libifc_err_errtype(lifh)) {
> +               case SOCKET:
> +                       warnx("couldn't create socket. This shouldn't happen.\n");
> +                       break;
> +               case IOCTL:
> +                       if (libifc_err_ioctlreq(lifh) == SIOCIFCREATE2) {
> +                               warnx(
> +                                       "Failed to create interface (SIOCIFCREATE2)\n");
> +                       }
> +                       break;
> +               default:
> +                       warnx(
> +                               "This is a thorough example accommodating for temporary"
> +                               " 'not implemented yet' errors. That's likely what happened"
> +                               " now. If not, your guess is as good as mine. ;)"
> +                               " Error code: %d\n", libifc_err_errno(
> +                                       lifh));
> +                       break;
> +               }
> +
> +               libifc_close(lifh);
> +               lifh = NULL;
> +               free(ifname);
> +               free(ifactualname);
> +               return (-1);
> +       }
> +}
>
> Added: head/share/examples/libifc/ifdestroy.c
> ==============================================================================
> --- /dev/null   00:00:00 1970   (empty, because file is newly added)
> +++ head/share/examples/libifc/ifdestroy.c      Thu Aug 25 19:40:25 2016        (r304815)
> @@ -0,0 +1,87 @@
> +/*
> + * Copyright (c) 2016, Marie Helene Kvello-Aune
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without modification,
> + * are permitted provided that the following conditions are met:
> + *
> + * 1. Redistributions of source code must retain the above copyright notice,
> + * thislist of conditions and the following disclaimer.
> + *
> + * 2. Redistributions in binary form must reproduce the above copyright notice,
> + * this list of conditions and the following disclaimer in the documentation and/or
> + * other materials provided with the distribution.
> + *
> + * 3. Neither the name of the copyright holder nor the names of its contributors
> + * may be used to endorse or promote products derived from this software without
> + * specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
> + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
> + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#include <err.h>
> +#include <errno.h>
> +#include <net/if.h>
> +#include <sys/ioctl.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <libifc.h>
> +
> +
> +int main(int argc, char *argv[])
> +{
> +       if (argc != 2) {
> +               errx(EINVAL, "Invalid number of arguments."
> +                   " Only one argument is accepted, and it should be the name"
> +                   " of the interface to be destroyed.");
> +       }
> +
> +       char *ifname;
style, mentioned before.

> +
> +       /* We have a static number of arguments. Therefore we can do it simple. */
> +       ifname = strdup(argv[1]);
can fail.

> +
> +       printf("Interface name: %s\n", ifname);
> +
> +       libifc_handle_t *lifh = libifc_open();
> +       if (libifc_destroy_interface(lifh, ifname) == 0) {
> +               printf("Successfully destroyed interface '%s'.", ifname);
> +               libifc_close(lifh);
> +               lifh = NULL;
> +               free(ifname);
> +               return (0);
> +       } else {
> +               switch (libifc_err_errtype(lifh)) {
> +               case SOCKET:
> +                       warnx("couldn't create socket. This shouldn't happen.\n");
> +                       break;
> +               case IOCTL:
> +                       if (libifc_err_ioctlreq(lifh) == SIOCIFDESTROY) {
> +                               warnx(
> +                                       "Failed to destroy interface (SIOCIFDESTROY)\n");
> +                       }
> +                       break;
> +               default:
> +                       warnx(
> +                               "Should basically never end up here in this example.\n");
> +                       break;
> +               }
> +
> +               libifc_close(lifh);
> +               lifh = NULL;
> +               free(ifname);
> +               return (-1);
> +       }
> +}
>
> Added: head/share/examples/libifc/setdescription.c
> ==============================================================================
> --- /dev/null   00:00:00 1970   (empty, because file is newly added)
> +++ head/share/examples/libifc/setdescription.c Thu Aug 25 19:40:25 2016        (r304815)
> @@ -0,0 +1,91 @@
> +/*
> + * Copyright (c) 2016, Marie Helene Kvello-Aune
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without modification,
> + * are permitted provided that the following conditions are met:
> + *
> + * 1. Redistributions of source code must retain the above copyright notice,
> + * thislist of conditions and the following disclaimer.
> + *
> + * 2. Redistributions in binary form must reproduce the above copyright notice,
> + * this list of conditions and the following disclaimer in the documentation and/or
> + * other materials provided with the distribution.
> + *
> + * 3. Neither the name of the copyright holder nor the names of its contributors
> + * may be used to endorse or promote products derived from this software without
> + * specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
> + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
> + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * $FreeBSD$
> + */
> +
> +#include <err.h>
> +#include <errno.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <libifc.h>
> +
> +
> +int main(int argc, char *argv[])
> +{
> +       if (argc != 3) {
> +               errx(EINVAL, "Invalid number of arguments."
> +                   " First argument should be interface name, second argument"
> +                   " should be the description to set.");
> +       }
> +
> +       char *ifname, *ifdescr, *curdescr;
style, mentioned before.

> +       /* We have a static number of arguments. Therefore we can do it simple. */
> +       ifname = strdup(argv[1]);
> +       ifdescr = strdup(argv[2]);
can fail.
> +       curdescr = NULL;
> +
> +       printf("Interface name: %s\n", ifname);
> +
> +       libifc_handle_t *lifh = libifc_open();
can fail.
> +       if (libifc_get_description(lifh, ifname, &curdescr) == 0) {
> +               printf("Old description: %s\n", curdescr);
>
> *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
> _______________________________________________
> svn-src-head@freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/svn-src-head
> To unsubscribe, send any mail to "svn-src-head-unsubscribe@freebsd.org"



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAGOYWV8y33piiSYmU6mcTyqvd_kpObc47X5V5_Co_ogqVwDu5A>