[netcf-devel] [PATCH 4/5] Wow, it compiles and everything.

Sean Bruno sbruno at freebsd.org
Fri May 18 16:38:53 UTC 2012


---
 src/Makefile.am   |    2 +-
 src/drv_fbsd.c    |   94 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/dutil_fbsd.c  |   27 ---------------
 src/dutil_fbsd.h  |   40 +++++++++--------------
 src/dutil_linux.c |   73 +++++++++++++++++++++++++++++++++--------
 5 files changed, 171 insertions(+), 65 deletions(-)
 delete mode 100644 src/dutil_fbsd.c

diff --git a/src/Makefile.am b/src/Makefile.am
index e431eff..81aaadc 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -16,7 +16,7 @@ noinst_PROGRAMS = ncftransform
 endif
 
 DRIVER_SOURCES_COMMON = dutil.h dutil.c
-DRIVER_SOURCES_FBSD = dutil_fbsd.h dutil_fbsd.c drv_fbsd.c
+DRIVER_SOURCES_FBSD = dutil_fbsd.h drv_fbsd.c
 DRIVER_SOURCES_LINUX = dutil_linux.h dutil_linux.c
 DRIVER_SOURCES_MSWINDOWS = dutil_mswindows.h dutil_mswindows.c drv_mswindows.c
 DRIVER_SOURCES_REDHAT = drv_redhat.c
diff --git a/src/drv_fbsd.c b/src/drv_fbsd.c
index 1b3bb87..0ae2b8e 100644
--- a/src/drv_fbsd.c
+++ b/src/drv_fbsd.c
@@ -59,6 +59,32 @@ void drv_close(struct netcf *ncf) {
 
 }
 
+void drv_entry (struct netcf *ncf ATTRIBUTE_UNUSED) {
+}
+
+static int list_interfaces(struct netcf *ncf, char ***intf) {
+    int nint = 0, result = 0;
+    struct augeas *aug = NULL;
+	FILE *hackery;
+
+    aug = get_augeas(ncf);
+    ERR_BAIL(ncf);
+
+    /* Look for all interfaces */
+    hackery = popen("r+","ifconfig|grep flags|awk '{print $1}'|wc -l"); // HACKERY
+	read(&nint, sizeof(nint), 1, hackery);
+	printf ("nint == %d\n");
+	pclose(hackery);
+    ERR_BAIL(ncf);
+    result = nint;
+
+	/* TODO filter out slave interfaces */
+    return result;
+ error:
+    free_matches(nint, intf);
+    return -1;
+}
+
 static int list_interface_ids(struct netcf *ncf,
                               int maxnames,
                               char **names, unsigned int flags ATTRIBUTE_UNUSED) {
@@ -230,3 +256,71 @@ drv_change_commit(struct netcf *ncf, unsigned int flags ATTRIBUTE_UNUSED)
 error:
     return result;
 }
+
+/*
+ * Test interface
+ */
+static int drv_get_aug(struct netcf *ncf, const char *ncf_xml, char **aug_xml) {
+    xmlDocPtr ncf_doc = NULL, aug_doc = NULL;
+    int result = -1;
+
+    ncf_doc = parse_xml(ncf, ncf_xml);
+    ERR_BAIL(ncf);
+
+    rng_validate(ncf, ncf_doc);
+    ERR_BAIL(ncf);
+
+    *aug_xml = apply_stylesheet_to_string(ncf, ncf->driver->get, ncf_doc);
+    ERR_BAIL(ncf);
+
+    /* fallthrough intentional */
+    result = 0;
+ error:
+    xmlFreeDoc(ncf_doc);
+    xmlFreeDoc(aug_doc);
+    return result;
+}
+
+/* Transform the Augeas XML AUG_XML into interface XML NCF_XML */
+static int drv_put_aug(struct netcf *ncf, const char *aug_xml, char **ncf_xml) {
+    xmlDocPtr ncf_doc = NULL, aug_doc = NULL;
+    int result = -1;
+
+    aug_doc = parse_xml(ncf, aug_xml);
+    ERR_BAIL(ncf);
+
+    *ncf_xml = apply_stylesheet_to_string(ncf, ncf->driver->put, aug_doc);
+    ERR_BAIL(ncf);
+
+    /* fallthrough intentional */
+    result = 0;
+ error:
+    xmlFreeDoc(ncf_doc);
+    xmlFreeDoc(aug_doc);
+    return result;
+}
+
+/*
+ * Test interface
+ */
+int ncf_get_aug(struct netcf *ncf, const char *ncf_xml, char **aug_xml) {
+    API_ENTRY(ncf);
+
+    return drv_get_aug(ncf, ncf_xml, aug_xml);
+}
+
+int ncf_put_aug(struct netcf *ncf, const char *aug_xml, char **ncf_xml) {
+    API_ENTRY(ncf);
+
+    return drv_put_aug(ncf, aug_xml, ncf_xml);
+}
+
+/*
+ * Local variables:
+ *  indent-tabs-mode: nil
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ *  tab-width: 4
+ * End:
+ */
+/* vim: set ts=4 sw=4 et: */
diff --git a/src/dutil_fbsd.c b/src/dutil_fbsd.c
deleted file mode 100644
index 3f98319..0000000
--- a/src/dutil_fbsd.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * dutil_mswindows.c: Windows utility functions for driver backends.
- *
- * Copyright (C) 2010 Red Hat Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
- *
- * Author: Adam Stokes <astokes at fedoraproject.org>
- */
-
-#include <config.h>
-#include <internal.h>
-
-#include "dutil.h"
-#include "dutil_mswindows.h"
diff --git a/src/dutil_fbsd.h b/src/dutil_fbsd.h
index 78295b5..6409099 100644
--- a/src/dutil_fbsd.h
+++ b/src/dutil_fbsd.h
@@ -1,30 +1,22 @@
 /*
- * dutil_mswindows.h: Window utility functions for driver backends.
- *
- * Copyright (C) 2010 Red Hat Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
- *
- * Author: Adam Stokes <astokes at fedoraproject.org>
+ * dutil_fbsd.c: FreeBSD utility functions for driver backends.
  */
 
-#ifndef DUTIL_MSWINDOWS_H_
-#define DUTIL_MSWINDOWS_H_
+#include <config.h>
+#include <internal.h>
+
+#include "dutil.h"
 
 struct driver {
-    int padding;
+    struct augeas     *augeas;
+    xsltStylesheetPtr  put;
+    xsltStylesheetPtr  get;
+    int                ioctl_fd;
+    struct nl_handle  *nl_sock;
+    struct nl_cache   *link_cache;
+    struct nl_cache   *addr_cache;
+    unsigned int       load_augeas : 1;
+    unsigned int       copy_augeas_xfm : 1;
+    unsigned int       augeas_xfm_num_tables;
+    const struct augeas_xfm_table **augeas_xfm_tables;
 };
-
-#endif /* DUTIL_MSWINDOWS_H_ */
diff --git a/src/dutil_linux.c b/src/dutil_linux.c
index e36c8e3..4651592 100644
--- a/src/dutil_linux.c
+++ b/src/dutil_linux.c
@@ -877,6 +877,10 @@ struct nl_ip_callback_data {
 
 /* add all ip addresses for the given interface to the xml document
 */
+#ifdef __FreeBSD__
+static void add_ip_info_cb(struct nl_object *obj, void *arg) {
+}
+#else
 static void add_ip_info_cb(struct nl_object *obj, void *arg) {
     struct nl_ip_callback_data *cb_data = arg;
     struct rtnl_addr *addr = (struct rtnl_addr *)obj;
@@ -955,7 +959,15 @@ static void add_ip_info_cb(struct nl_object *obj, void *arg) {
 error:
     return;
 }
+#endif
 
+#ifdef __FreeBSD__
+static void add_ip_info(struct netcf *ncf,
+                        const char *ifname ATTRIBUTE_UNUSED, int ifindex,
+                        xmlDocPtr doc, xmlNodePtr root) {
+    return;
+}
+#else
 static void add_ip_info(struct netcf *ncf,
                         const char *ifname ATTRIBUTE_UNUSED, int ifindex,
                         xmlDocPtr doc, xmlNodePtr root) {
@@ -975,7 +987,7 @@ error:
         rtnl_addr_put(filter_addr);
     return;
 }
-
+#endif
 
 struct nl_ethernet_callback_data {
     xmlDocPtr doc;
@@ -1008,6 +1020,13 @@ error:
     return;
 }
 
+#ifdef __FreeBSD__
+static void add_ethernet_info(struct netcf *ncf,
+                              const char *ifname ATTRIBUTE_UNUSED, int ifindex,
+                              xmlDocPtr doc, xmlNodePtr root) {
+    return;
+}
+#else
 static void add_ethernet_info(struct netcf *ncf,
                               const char *ifname ATTRIBUTE_UNUSED, int ifindex,
                               xmlDocPtr doc, xmlNodePtr root) {
@@ -1015,11 +1034,9 @@ static void add_ethernet_info(struct netcf *ncf,
         = { doc, root, NULL, ncf };
     struct rtnl_link *filter_link = NULL;
 
-#ifndef __FreeBSD__
     /* if interface isn't currently available, nothing to add */
     if (ifindex == RTNL_LINK_NOT_FOUND)
         return;
-#endif
 
     filter_link = rtnl_link_alloc();
     ERR_NOMEM(filter_link == NULL, ncf);
@@ -1033,6 +1050,7 @@ error:
         rtnl_link_put(filter_link);
     return;
 }
+#endif
 
 struct nl_vlan_callback_data {
     xmlDocPtr doc;
@@ -1041,6 +1059,11 @@ struct nl_vlan_callback_data {
     struct netcf *ncf;
 };
 
+#ifdef __FreeBSD__
+static void add_vlan_info_cb(struct nl_object *obj, void *arg) {
+    return;
+}
+#else
 static void add_vlan_info_cb(struct nl_object *obj, void *arg) {
     struct nl_vlan_callback_data *cb_data = arg;
     struct rtnl_link *iflink = (struct rtnl_link *)obj;
@@ -1064,10 +1087,8 @@ static void add_vlan_info_cb(struct nl_object *obj, void *arg) {
         return;
 
     l_link = rtnl_link_get_link(iflink);
-#ifndef __FreeBSD__
     if (l_link == RTNL_LINK_NOT_FOUND)
         return;
-#endif
 
     master_link = rtnl_link_get(nl_object_get_cache(obj), l_link);
     if (master_link == NULL)
@@ -1091,18 +1112,24 @@ static void add_vlan_info_cb(struct nl_object *obj, void *arg) {
 
     /* Add in type-specific info of master interface */
     master_ifindex = rtnl_link_name2i(ncf->driver->link_cache, master_name);
-#ifndef __FreeBSD__
     ERR_THROW((master_ifindex == RTNL_LINK_NOT_FOUND), ncf, ENETLINK,
               "couldn't find ifindex for vlan master interface `%s`",
               master_name);
-#endif
     add_type_specific_info(ncf, master_name, master_ifindex,
                            cb_data->doc, interface_node);
 
 error:
     return;
 }
+#endif
 
+#ifdef __FreeBSD__
+static void add_vlan_info(struct netcf *ncf,
+                          const char *ifname ATTRIBUTE_UNUSED, int ifindex,
+                          xmlDocPtr doc, xmlNodePtr root) {
+    return;
+}
+#else
 static void add_vlan_info(struct netcf *ncf,
                           const char *ifname ATTRIBUTE_UNUSED, int ifindex,
                           xmlDocPtr doc, xmlNodePtr root) {
@@ -1110,11 +1137,9 @@ static void add_vlan_info(struct netcf *ncf,
         = { doc, root, NULL, ncf };
     struct rtnl_link *filter_link = NULL;
 
-#ifndef __FreeBSD__
     /* if interface isn't currently available, nothing to add */
     if (ifindex == RTNL_LINK_NOT_FOUND)
         return;
-#endif
 
     filter_link = rtnl_link_alloc();
     ERR_NOMEM(filter_link == NULL, ncf);
@@ -1129,7 +1154,15 @@ error:
         rtnl_link_put(filter_link);
     return;
 }
+#endif
 
+#ifdef __FreeBSD__
+static void add_bridge_info(struct netcf *ncf,
+                            const char *ifname, int ifindex ATTRIBUTE_UNUSED,
+                            xmlDocPtr doc, xmlNodePtr root) {
+    return;
+}
+#else
 static void add_bridge_info(struct netcf *ncf,
                             const char *ifname, int ifindex ATTRIBUTE_UNUSED,
                             xmlDocPtr doc, xmlNodePtr root) {
@@ -1171,6 +1204,7 @@ error:
         FREE(phys_names[ii]);
     FREE(phys_names);
 }
+#endif
 
 
 struct nl_bond_callback_data {
@@ -1181,6 +1215,12 @@ struct nl_bond_callback_data {
     struct netcf *ncf;
 };
 
+#ifdef __FreeBSD__
+static void add_bond_info_cb(struct nl_object *obj,
+                             void *arg ATTRIBUTE_UNUSED) {
+    return;
+}
+#else
 static void add_bond_info_cb(struct nl_object *obj,
                              void *arg ATTRIBUTE_UNUSED) {
     struct nl_bond_callback_data *cb_data = arg;
@@ -1189,7 +1229,6 @@ static void add_bond_info_cb(struct nl_object *obj,
 
     xmlNodePtr interface_node;
 
-#ifndef __FreeBSD__
     /* If this is a slave link, and the master is master_ifindex, add the
      * interface info to the bond.
      */
@@ -1197,7 +1236,6 @@ static void add_bond_info_cb(struct nl_object *obj,
     if (!(rtnl_link_get_flags(iflink) & IFF_SLAVE)
         || rtnl_link_get_master(iflink) != cb_data->master_ifindex)
         return;
-#endif
 
     cb_data->bond = xml_node(cb_data->doc, cb_data->root, "bond");
     ERR_NOMEM(cb_data->bond == NULL, ncf);
@@ -1222,21 +1260,28 @@ static void add_bond_info_cb(struct nl_object *obj,
 error:
     return;
 }
+#endif
 
+#ifdef __FreeBSD__
+static void add_bond_info(struct netcf *ncf,
+                          const char *ifname ATTRIBUTE_UNUSED, int ifindex,
+                          xmlDocPtr doc, xmlNodePtr root) {
+    return;
+}
+#else
 static void add_bond_info(struct netcf *ncf,
                           const char *ifname ATTRIBUTE_UNUSED, int ifindex,
                           xmlDocPtr doc, xmlNodePtr root) {
     struct nl_bond_callback_data cb_data
         = { doc, root, NULL, ifindex, ncf };
 
-#ifndef __FreeBSD__
     /* if interface isn't currently available, nothing to add */
     if (ifindex == RTNL_LINK_NOT_FOUND)
         return;
-#endif
 
     nl_cache_foreach(ncf->driver->link_cache, add_bond_info_cb, &cb_data);
 }
+#endif
 
 
 static void add_type_specific_info(struct netcf *ncf,
@@ -1288,6 +1333,7 @@ void add_state_to_xml_doc(struct netcf_if *nif, xmlDocPtr doc) {
     ERR_THROW(!xmlStrEqual(root->name, BAD_CAST "interface"),
               nif->ncf, EINTERNAL, "root document is not an interface");
 
+#ifndef __FreeBSD__
     /* Update the caches with any recent changes */
     code = nl_cache_refill(nif->ncf->driver->nl_sock,
                            nif->ncf->driver->link_cache);
@@ -1299,6 +1345,7 @@ void add_state_to_xml_doc(struct netcf_if *nif, xmlDocPtr doc) {
               "failed to refill interface address cache");
 
     ifindex = rtnl_link_name2i(nif->ncf->driver->link_cache, nif->name);
+#endif
     /* We ignore an error return here, because that usually just
      * means the interface isn't currently running. The
      * type-specific functions will recognize this from the
-- 
1.7.10.1



More information about the netcf-devel mailing list