From owner-svn-src-all@freebsd.org Thu Aug 25 20:27:25 2016 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 0A70EBC44C0; Thu, 25 Aug 2016 20:27:25 +0000 (UTC) (envelope-from oshogbo.vx@gmail.com) Received: from mail-wm0-x229.google.com (mail-wm0-x229.google.com [IPv6:2a00:1450:400c:c09::229]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 8DBA21C6D; Thu, 25 Aug 2016 20:27:24 +0000 (UTC) (envelope-from oshogbo.vx@gmail.com) Received: by mail-wm0-x229.google.com with SMTP id i5so89449352wmg.0; Thu, 25 Aug 2016 13:27:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=gL9pBBi+FZAwQotm9iQNnlEDnqx11aEs37DKeW8MWsE=; b=fJg16DWRC7TsQ7iFwKzC2HxsFjAaOG6EUZWwbqFnYY2sTlEO6tgymfpZGN2af9XnD1 sc8CBOMcsryqbZkT6bs7QX4Dp0uhnkaQi6noKdYMecE9OGDqkAwp/ETSV2hV+R3mez7E BC9i7tjAK6oFliUuC30OTuLiRrOK2Hs7u6Wvbj3SStxmMqegZtHsNXs46z1/ELowNH9w GRsRn1waLHbyd80MenJFS2SVlAR8G7UvSj4YKl8tTzIzKQFendd/+glyeS2VfT/OoCrT OCHEymHGqnENZvhbO0EgKTfMn8KbQg+L0dDYwQaK3yBjil5UbskWgS/Jl5ggLHCvWST7 /cNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=gL9pBBi+FZAwQotm9iQNnlEDnqx11aEs37DKeW8MWsE=; b=YmB7TMygVlTbNJFZBJ/pLihCjk6ogi5KJt//m2BWLT/0HvC+FlcTN+Gk3u6RLlwGfU OoNnjFKzfdxJxmPSUZkkB7ShTg9PTgTL7ETdIxLD7F7VRicewF+Jd8vyzqrPHluIVYIp UKLidtnwnO2TumYfsEcXrasSBcN3UVU0WSBrvgq+aHOnV6dbiOhvDutIsbKh/hnn0zBs prf9otQ0Esi2aURr8PmmHYV7Cehwz4DHsGLcLpBFc7Px1eYH6iCtoRvzJsG0IayEXxQJ znspRtiD9z5Sm3fgpsqZ7WDyAaPOI47Kut36Ij3mGPK+aqvFZIU0/UGP2VQHz3mcvWfL GKLA== X-Gm-Message-State: AEkoouvqfd9NFRpbcT9st05twHkdFeRXjHIvNLLKBPQsoJpgXWDhT7U3GTsfwmIKTNsv4aVZAukle4bZHzwZFw== X-Received: by 10.194.107.69 with SMTP id ha5mr8951772wjb.100.1472156842353; Thu, 25 Aug 2016 13:27:22 -0700 (PDT) MIME-Version: 1.0 Sender: oshogbo.vx@gmail.com Received: by 10.28.158.193 with HTTP; Thu, 25 Aug 2016 13:27:21 -0700 (PDT) In-Reply-To: <201608251940.u7PJePv3023083@repo.freebsd.org> References: <201608251940.u7PJePv3023083@repo.freebsd.org> From: Mariusz Zaborski Date: Thu, 25 Aug 2016 22:27:21 +0200 X-Google-Sender-Auth: SRoi5M3K-sibUvGbsPm_jXOe294 Message-ID: Subject: Re: svn commit: r304815 - in head: lib lib/libifc share/examples/libifc share/mk To: Kristof Provost Cc: src-committers , svn-src-all@freebsd.org, svn-src-head@freebsd.org Content-Type: text/plain; charset=UTF-8 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 25 Aug 2016 20:27:25 -0000 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 > + > +#include > +#include > +#include > +#include > +#include > + > + > +#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 > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > + > +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 > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > + > +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 > +#include > +#include > +#include > +#include > +#include > + > + > +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"