Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F137129034
D7529.id19347.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
41 KB
Referenced Files
None
Subscribers
None
D7529.id19347.diff
View Options
Index: lib/libifconfig/LICENSE.txt
===================================================================
--- lib/libifconfig/LICENSE.txt
+++ lib/libifconfig/LICENSE.txt
@@ -0,0 +1,58 @@
+/*
+* 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.
+*/
+
+/*
+ * Copyright (c) 1983, 1993
+ * The Regents of the University of California. 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, this list 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.
+ * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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.
+ */
Index: lib/libifconfig/Makefile
===================================================================
--- lib/libifconfig/Makefile
+++ lib/libifconfig/Makefile
@@ -0,0 +1,17 @@
+# $FreeBSD$
+
+PACKAGE=lib${LIB}
+LIB= ifconfig
+
+SHLIBDIR?= /lib
+SHLIB_MAJOR= 1
+SRCS= src/libifconfig.c src/libifconfig_internal.c
+
+INCSDIR= ${INCLUDEDIR}
+INCS= src/libifconfig.h
+
+#MAN= libifconfig.3
+
+CFLAGS+=-I${.CURDIR}
+
+.include <bsd.lib.mk>
Index: lib/libifconfig/examples/Makefile
===================================================================
--- lib/libifconfig/examples/Makefile
+++ lib/libifconfig/examples/Makefile
@@ -0,0 +1,5 @@
+default:
+ $(CC) -Wall -fPIC -lifconfig -g -o example_setdescription setdescription.c
+ $(CC) -Wall -fPIC -lifconfig -g -o example_setmtu setmtu.c
+ $(CC) -Wall -fPIC -lifconfig -g -o example_ifdestroy ifdestroy.c
+ $(CC) -Wall -fPIC -lifconfig -g -o example_ifcreate ifcreate.c
Index: lib/libifconfig/examples/ifcreate.c
===================================================================
--- lib/libifconfig/examples/ifcreate.c
+++ lib/libifconfig/examples/ifcreate.c
@@ -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.
+ */
+
+#include <err.h>
+#include <errno.h>
+#include <net/if.h>
+#include <sys/ioctl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <libifconfig.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 created.");
+ }
+
+ char *ifname, *ifactualname;
+
+ /* We have a static number of arguments. Therefore we can do it simple. */
+ ifname = strdup(argv[1]);
+
+ printf("Requested interface name: %s\n", ifname);
+
+ libifc_handle_t *lifh = libifc_open();
+ 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 accomodating 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);
+ }
+}
Index: lib/libifconfig/examples/ifdestroy.c
===================================================================
--- lib/libifconfig/examples/ifdestroy.c
+++ lib/libifconfig/examples/ifdestroy.c
@@ -0,0 +1,85 @@
+/*
+ * 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.
+ */
+
+#include <err.h>
+#include <errno.h>
+#include <net/if.h>
+#include <sys/ioctl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <libifconfig.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;
+
+ /* We have a static number of arguments. Therefore we can do it simple. */
+ ifname = strdup(argv[1]);
+
+ 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);
+ }
+}
Index: lib/libifconfig/examples/setdescription.c
===================================================================
--- lib/libifconfig/examples/setdescription.c
+++ lib/libifconfig/examples/setdescription.c
@@ -0,0 +1,89 @@
+/*
+ * 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.
+ */
+
+#include <err.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <libifconfig.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;
+ /* We have a static number of arguments. Therefore we can do it simple. */
+ ifname = strdup(argv[1]);
+ ifdescr = strdup(argv[2]);
+ curdescr = NULL;
+
+ printf("Interface name: %s\n", ifname);
+
+ libifc_handle_t *lifh = libifc_open();
+ if (libifc_get_description(lifh, ifname, &curdescr) == 0) {
+ printf("Old description: %s\n", curdescr);
+ }
+
+ printf("New description: %s\n\n", ifdescr);
+
+ if (libifc_set_description(lifh, ifname, ifdescr) == 0) {
+ printf("New description successfully set.\n");
+ } else {
+ switch (libifc_err_errtype(lifh)) {
+ case SOCKET:
+ err(libifc_err_errno(lifh), "Socket error");
+ break;
+ case IOCTL:
+ err(libifc_err_errno(
+ lifh), "IOCTL(%lu) error",
+ libifc_err_ioctlreq(lifh));
+ break;
+ case OTHER:
+ err(libifc_err_errno(lifh), "Other error");
+ break;
+ }
+ }
+
+ free(ifname);
+ free(ifdescr);
+ free(curdescr);
+ ifname = NULL;
+ ifdescr = NULL;
+ curdescr = NULL;
+
+ libifc_close(lifh);
+ return (0);
+}
Index: lib/libifconfig/examples/setmtu.c
===================================================================
--- lib/libifconfig/examples/setmtu.c
+++ lib/libifconfig/examples/setmtu.c
@@ -0,0 +1,92 @@
+/*
+ * 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.
+ */
+
+#include <err.h>
+#include <errno.h>
+#include <net/if.h>
+#include <sys/ioctl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <libifconfig.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 MTU to set.");
+ }
+
+ char *ifname, *ptr;
+ int mtu;
+
+ /* We have a static number of arguments. Therefore we can do it simple. */
+ ifname = strdup(argv[1]);
+ mtu = (int)strtol(argv[2], &ptr, 10);
+
+ printf("Interface name: %s\n", ifname);
+ printf("New MTU: %d", mtu);
+
+ libifc_handle_t *lifh = libifc_open();
+ if (libifc_set_mtu(lifh, ifname, mtu) == 0) {
+ printf("Successfully changed MTU of %s to %d\n", ifname, mtu);
+ 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) == SIOCSIFMTU) {
+ warnx("Failed to set MTU (SIOCSIFMTU)\n");
+ } else {
+ warnx(
+ "Failed to set MTU due to error in unexpected ioctl() call %lu. Error code: %i.\n",
+ libifc_err_ioctlreq(lifh),
+ libifc_err_errno(lifh));
+ }
+ break;
+ default:
+ warnx(
+ "Should basically never end up here in this example.\n");
+ break;
+ }
+
+ libifc_close(lifh);
+ lifh = NULL;
+ free(ifname);
+ return (-1);
+ }
+}
Index: lib/libifconfig/src/libifconfig.h
===================================================================
--- lib/libifconfig/src/libifconfig.h
+++ lib/libifconfig/src/libifconfig.h
@@ -0,0 +1,109 @@
+/*
+ * 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.
+ */
+
+#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;
+ *}
+ */
+libifc_handle_t *libifc_open(void);
+
+/** Frees resources held in the provided state object.
+ * @param h The state object to close.
+ * @see #libifc_open(void)
+ */
+void libifc_close(libifc_handle_t *h);
+
+/** Identifies what kind of error occured. */
+libifc_errtype libifc_err_errtype(libifc_handle_t *h);
+
+/** Retrieves the errno associated with the error, if any. */
+int libifc_err_errno(libifc_handle_t *h);
+
+/** If error type was IOCTL, this identifies which request failed. */
+unsigned long libifc_err_ioctlreq(libifc_handle_t *h);
+
+int libifc_get_description(libifc_handle_t *h, const char *name,
+ char **description);
+int libifc_set_description(libifc_handle_t *h, const char *name,
+ const char *newdescription);
+int libifc_unset_description(libifc_handle_t *h, const char *name);
+int libifc_set_name(libifc_handle_t *h, const char *name, const char *newname);
+int libifc_set_mtu(libifc_handle_t *h, const char *name, const int mtu);
+int libifc_get_mtu(libifc_handle_t *h, const char *name, int *mtu);
+
+int libifc_set_metric(libifc_handle_t *h, const char *name, const int metric);
+int libifc_get_metric(libifc_handle_t *h, const char *name, int *metric);
+
+int libifc_set_capability(libifc_handle_t *h, const char *name,
+ const int capability);
+int libifc_get_capability(libifc_handle_t *h, const char *name,
+ struct libifc_capabilities *capability);
+
+/** Destroy a virtual interface
+ * @param name Interface to destroy
+ */
+int libifc_destroy_interface(libifc_handle_t *h, const char *name);
+
+/** Creates a (virtual) interface
+ * @param name Name of interface to create. Example: bridge or bridge42
+ * @param name ifname Is set to actual name of created interface
+ */
+int libifc_create_interface(libifc_handle_t *h, const char *name,
+ char **ifname);
Index: lib/libifconfig/src/libifconfig.c
===================================================================
--- lib/libifconfig/src/libifconfig.c
+++ lib/libifconfig/src/libifconfig.c
@@ -0,0 +1,400 @@
+/*
+ * 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.
+ */
+
+/*
+ * Copyright (c) 1983, 1993
+ * The Regents of the University of California. 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, this list 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.
+ * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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.
+ */
+
+#include <sys/ioctl.h>
+
+#include <net/if.h>
+
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "libifconfig.h"
+#include "libifconfig_internal.h"
+
+
+libifc_handle_t *
+libifc_open()
+{
+ struct libifc_handle *h;
+
+ h = calloc(1, sizeof(struct libifc_handle));
+ return (h);
+}
+
+
+void
+libifc_close(libifc_handle_t *h)
+{
+ if (h->sockets.sdkeys != NULL) {
+ free(h->sockets.sdkeys);
+ h->sockets.sdkeys = NULL;
+ }
+ if (h->sockets.sdvals != NULL) {
+ for (int i = 0; i < h->sockets.sdindex; i++) {
+ (void)close(h->sockets.sdvals[i]);
+ }
+ free(h->sockets.sdvals);
+ h->sockets.sdvals = NULL;
+ }
+ h->sockets.sdindex = 0;
+ free(h);
+}
+
+
+libifc_errtype
+libifc_err_errtype(libifc_handle_t *h)
+{
+ return (h->error.errtype);
+}
+
+
+int
+libifc_err_errno(libifc_handle_t *h)
+{
+ return (h->error.errcode);
+}
+
+
+unsigned long
+libifc_err_ioctlreq(libifc_handle_t *h)
+{
+ return (h->error.ioctl_request);
+}
+
+
+int
+libifc_get_description(libifc_handle_t *h, const char *name, char **description)
+{
+ struct ifreq ifr;
+ char *descr = NULL;
+ size_t descrlen = 64;
+
+ (void)strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+ for (;;) {
+ if ((descr = reallocf(descr, descrlen)) != NULL) {
+ ifr.ifr_buffer.buffer = descr;
+ ifr.ifr_buffer.length = descrlen;
+ if (libifc_ioctlwrap(h, AF_LOCAL, SIOCGIFDESCR,
+ &ifr) == 0) {
+ if (ifr.ifr_buffer.buffer == descr) {
+ if (strlen(descr) > 0) {
+ *description = strdup(descr);
+ free(descr);
+ return (0);
+ }
+ } else if (ifr.ifr_buffer.length > descrlen) {
+ descrlen = ifr.ifr_buffer.length;
+ continue;
+ }
+ } else {
+ return (-1);
+ }
+ } else {
+ free(descr);
+ h->error.errtype = OTHER;
+ h->error.errcode = ENOMEM;
+ return (-1);
+ }
+ break;
+ }
+ free(descr);
+ h->error.errtype = OTHER;
+ h->error.errcode = 0;
+ return (-1);
+}
+
+
+int
+libifc_set_description(libifc_handle_t *h, const char *name,
+ const char *newdescription)
+{
+ struct ifreq ifr;
+ int desclen;
+
+ desclen = strlen(newdescription);
+
+ /*
+ * Unset description if the new description is 0 characters long.
+ * TODO: Decide whether this should be an error condition instead.
+ */
+ if (desclen == 0) {
+ return (libifc_unset_description(h, name));
+ }
+
+ (void)strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+
+ ifr.ifr_buffer.length = desclen + 1;
+ ifr.ifr_buffer.buffer = strdup(newdescription);
+ if (ifr.ifr_buffer.buffer == NULL) {
+ h->error.errtype = OTHER;
+ h->error.errcode = ENOMEM;
+ return (-1);
+ }
+
+ /*
+ * TODO: Check whether this ioctl() call truncates or fails when new
+ * description is too long. If truncates, this function should probably
+ * have an error condition for this further up.
+ */
+ if (libifc_ioctlwrap_caddr(h, AF_LOCAL, SIOCSIFDESCR, &ifr) != 0) {
+ if (ifr.ifr_buffer.buffer != NULL) {
+ free(ifr.ifr_buffer.buffer);
+ }
+ return (-1);
+ }
+ if (ifr.ifr_buffer.buffer != NULL) {
+ free(ifr.ifr_buffer.buffer);
+ }
+ return (0);
+}
+
+
+int libifc_unset_description(libifc_handle_t *h, const char *name)
+{
+ struct ifreq ifr;
+
+ (void)strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+ ifr.ifr_buffer.length = 0;
+ ifr.ifr_buffer.buffer = NULL;
+
+ if (libifc_ioctlwrap_caddr(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;
+
+ 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;
+
+ /*
+ * TODO: Check whether this ioctl() call truncates or fails when new
+ * name is too long. If truncates, this function should have an error
+ * condition for this further up.
+ */
+ if (libifc_ioctlwrap_caddr(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;
+
+ (void)strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+ ifr.ifr_mtu = mtu;
+ if (libifc_ioctlwrap_caddr(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;
+
+ (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;
+
+ (void)strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+ ifr.ifr_mtu = mtu;
+ if (libifc_ioctlwrap_caddr(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;
+
+ (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;
+
+ 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_caddr(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;
+
+ (void)strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+
+ if (libifc_ioctlwrap_caddr(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;
+
+ (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;
+
+ (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);
+ return (0);
+}
Index: lib/libifconfig/src/libifconfig_internal.h
===================================================================
--- lib/libifconfig/src/libifconfig_internal.h
+++ lib/libifconfig/src/libifconfig_internal.h
@@ -0,0 +1,96 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include "libifconfig.h"
+
+
+struct errstate {
+ /**
+ * Type of error.
+ */
+ libifc_errtype errtype;
+
+ /**
+ * The error occured in this ioctl() request.
+ * Populated if errtype = IOCTL
+ */
+ unsigned long ioctl_request;
+
+ /**
+ * The value of the global errno variable when the error occured.
+ */
+ int errcode;
+};
+
+struct socketcache {
+ int sdindex;
+ int sdsize;
+ int *sdkeys;
+ int *sdvals;
+};
+
+struct libifc_handle {
+ struct errstate error;
+ struct socketcache sockets;
+};
+
+/**
+ * Retrieves socket for address family <paramref name="addressfamily"> from
+ * cache, or creates it if it doesn't already exist.
+ * @param addressfamily The address family of the socket to retrieve
+ * @param s The retrieved socket.
+ * @return 0 on success, -1 on failure.
+ * {@example
+ * This example shows how to retrieve a socket from the cache.
+ * {@code
+ * static void myfunc() \{
+ * int s;
+ * if (libifc_socket(AF_LOCAL, &s) != 0) \{
+ * // Handle error state here
+ * \}
+ * // user code here
+ * \}
+ * }
+ * }
+ */
+int libifc_socket(libifc_handle_t *h, const int addressfamily, int *s);
+
+/** Function used by other wrapper functions to populate _errstate when appropriate.*/
+int libifc_ioctlwrap_ret(libifc_handle_t *h, unsigned long request, int rcode);
+
+/** Function to wrap ioctl() and automatically populate libifc_errstate when appropriate.*/
+int libifc_ioctlwrap(libifc_handle_t *h, const int addressfamily,
+ unsigned long request, struct ifreq *ifr);
+
+/** <summary> function to wrap ioctl(), casting ifr to caddr_t, and automatically populate libifc_errstate when appropriate.*/
+int libifc_ioctlwrap_caddr(libifc_handle_t *h, const int addressfamily,
+ unsigned long request, struct ifreq *ifr);
Index: lib/libifconfig/src/libifconfig_internal.c
===================================================================
--- lib/libifconfig/src/libifconfig_internal.c
+++ lib/libifconfig/src/libifconfig_internal.c
@@ -0,0 +1,177 @@
+/*
+ * 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.
+ */
+
+
+#include <net/if.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+
+
+#include "libifconfig.h" // Needed for libifc_errstate
+#include "libifconfig_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));
+}
+
+
+int
+libifc_ioctlwrap_caddr(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, (caddr_t)ifr);
+ return (libifc_ioctlwrap_ret(h, request, rcode));
+}
+
+
+static int
+sdexpand(libifc_handle_t *h)
+{
+ /* Initial size of dictionary is 4. If it needs to be larger, double it. */
+ int newsize;
+
+ if (h->sockets.sdsize == 0) {
+ newsize = (4 * sizeof(int));
+ } else {
+ newsize = (2 * h->sockets.sdsize * sizeof(int));
+ }
+
+ /*
+ * Don't use reallocf, as we want to keep the old allocation if
+ * this one fails.
+ */
+ int *nsdkeys = realloc(h->sockets.sdkeys, newsize);
+
+ /*
+ * TODO: Decide whether type 'SOCKET' should be strictly for socket(),
+ * or also for anything involving getting a socket.
+ */
+ if (nsdkeys == NULL) {
+ h->error.errtype = OTHER;
+ h->error.errcode = ENOMEM;
+ return (-1);
+ }
+
+ int *nsdvals = realloc(h->sockets.sdvals, newsize);
+ if (nsdvals == NULL) {
+ free(nsdkeys);
+ h->error.errtype = OTHER;
+ h->error.errcode = ENOMEM;
+ return (-1);
+ }
+
+ /* Keep old arrays so we can free them later */
+ int *osdkeys = h->sockets.sdkeys;
+ int *osdvals = h->sockets.sdvals;
+
+ /*
+ * If libifconfig is ever going to be thread-safe and not just
+ * thread-friendly, it's important sdvals is updated first.
+ * This would prevent a potential race condition when looking up keys
+ * whose value isn't set yet.
+ */
+ h->sockets.sdvals = nsdvals;
+ h->sockets.sdkeys = nsdkeys;
+
+ /* Free old memory maps. */
+ free(osdkeys);
+ free(osdvals);
+ /* Update size */
+ h->sockets.sdsize = newsize;
+ return (0);
+}
+
+
+/*
+ * 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)
+{
+ int sock;
+
+ for (int i = 0; i < h->sockets.sdindex; i++) {
+ if (h->sockets.sdkeys[i] == addressfamily) {
+ *s = h->sockets.sdvals[i];
+ return (0);
+ }
+ }
+
+ /* We don't have a socket of that type available. Create one. */
+ if ((h->sockets.sdindex == h->sockets.sdsize) && (sdexpand(h) != 0)) {
+ /* Inherit error from sdexpand() */
+ return (-1);
+ }
+
+ sock = socket(addressfamily, SOCK_DGRAM, 0);
+ if (sock == -1) {
+ h->error.errtype = SOCKET;
+ h->error.errcode = errno;
+ return (-1);
+ }
+
+ h->sockets.sdkeys[h->sockets.sdindex] = addressfamily;
+ h->sockets.sdvals[h->sockets.sdindex] = sock;
+ h->sockets.sdindex++;
+ *s = sock;
+ return (0);
+}
Index: share/mk/bsd.libnames.mk
===================================================================
--- share/mk/bsd.libnames.mk
+++ share/mk/bsd.libnames.mk
@@ -82,6 +82,7 @@
LIBIBSDP?= ${DESTDIR}${LIBDIR}/libibsdp.a
LIBIBUMAD?= ${DESTDIR}${LIBDIR}/libibumad.a
LIBIBVERBS?= ${DESTDIR}${LIBDIR}/libibverbs.a
+LIBIFCONFIG?= ${DESTDIR}${LIBDIR}/libifconfig.a
LIBIPSEC?= ${DESTDIR}${LIBDIR}/libipsec.a
LIBJAIL?= ${DESTDIR}${LIBDIR}/libjail.a
LIBKADM5CLNT?= ${DESTDIR}${LIBDIR}/libkadm5clnt.a
Index: share/mk/src.libnames.mk
===================================================================
--- share/mk/src.libnames.mk
+++ share/mk/src.libnames.mk
@@ -105,6 +105,7 @@
heimntlm \
heimsqlite \
hx509 \
+ ifconfig \
ipsec \
jail \
kadm5clnt \
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Nov 22, 5:17 AM (15 h, 29 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25915349
Default Alt Text
D7529.id19347.diff (41 KB)
Attached To
Mode
D7529: libifconfig: First baby steps towards libification of ifconfig
Attached
Detach File
Event Timeline
Log In to Comment