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>