[netcf-devel] [PATCH 2/2] Make use of win32 routines where necessary

Adam Stokes astokes at fedoraproject.org
Mon Nov 8 19:02:07 UTC 2010


- Here are changes in order to process the correct routines when run on Windows.
- Detecting of Windows system drive can be accomplished through "SYSTEMDRIVE" environment variable
  and falling back to C: drive as a last resort.
---
 src/netcf.c |  100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 94 insertions(+), 6 deletions(-)

diff --git a/src/netcf.c b/src/netcf.c
index 1a95332..ac70f3c 100644
--- a/src/netcf.c
+++ b/src/netcf.c
@@ -30,14 +30,22 @@
 #include <unistd.h>
 #include <sys/wait.h>
 #include <signal.h>
+#include <spawn.h>
 #include <errno.h>
-#include "safe-alloc.h"
 
+#include "safe-alloc.h"
 #include "internal.h"
 #include "netcf.h"
-#include "dutil.h"
+#ifdef WIN32
+# include "netcf_win.h"
+#else
+# include "dutil.h"
+#endif
 
 /* Clear error code and details */
+#ifdef WIN32
+#define API_ENTRY(ncf) NULL;
+#else
 #define API_ENTRY(ncf)                          \
     do {                                        \
         (ncf)->errcode = NETCF_NOERROR;         \
@@ -45,6 +53,7 @@
         if (ncf->driver != NULL)                \
             drv_entry(ncf);                     \
     } while(0);
+#endif
 
 /* Human-readable error messages. This array is indexed by NETCF_ERRCODE_T */
 static const char *const errmsgs[] = {
@@ -87,8 +96,15 @@ int ncf_init(struct netcf **ncf, const char *root) {
     *ncf = NULL;
     if (make_ref(*ncf) < 0)
         goto oom;
-    if (root == NULL)
+    if (root == NULL) {
+#ifdef WIN32
+        root = getenv("SYSTEMDRIVE");
+        if (!root)
+            root = "c:";
+#else
         root = "/";
+#endif
+    }
     if (root[strlen(root)-1] == '/') {
         (*ncf)->root = strdup(root);
     } else {
@@ -99,9 +115,14 @@ int ncf_init(struct netcf **ncf, const char *root) {
         goto oom;
     (*ncf)->data_dir = getenv("NETCF_DATADIR");
     if ((*ncf)->data_dir == NULL)
-        (*ncf)->data_dir = DATADIR "/netcf";
+        (*ncf)->data_dir = NETCF_DATADIR "/netcf";
     (*ncf)->debug = getenv("NETCF_DEBUG") != NULL;
+#ifdef WIN32
+    return 0;
+#else
+    /* Needs investigation on WIN32 */
     return drv_init(*ncf);
+#endif
  oom:
     ncf_close(*ncf);
     *ncf = NULL;
@@ -116,8 +137,12 @@ int ncf_close(struct netcf *ncf) {
 
     ERR_COND_BAIL(ncf->ref > 1, ncf, EINUSE);
 
+#ifdef WIN32
+    free(ncf->driver);
+#else
     drv_close(ncf);
     unref(ncf, netcf);
+#endif
     return 0;
  error:
     return -1;
@@ -151,23 +176,38 @@ struct netcf_if * ncf_lookup_by_name(struct netcf *ncf, const char *name) {
     return drv_lookup_by_name(ncf, name);
 }
 
+#ifdef WIN32
+int ncf_lookup_by_mac_string(struct netcf *ncf, const char *mac,
+                             int maxifaces, struct netcf_if **ifaces) {
+    return -1;
+}
+#else
 int
 ncf_lookup_by_mac_string(struct netcf *ncf, const char *mac,
                          int maxifaces, struct netcf_if **ifaces) {
     API_ENTRY(ncf);
     return drv_lookup_by_mac_string(ncf, mac, maxifaces, ifaces);
 }
+#endif
 
 /*
  * Define/start/stop/undefine interfaces
  */
 
 /* Define a new interface */
+#ifdef WIN32
+struct netcf_if *
+ncf_define(struct netcf *ncf, const char *xml) {
+    API_ENTRY(ncf);
+    return ncf;
+}
+#else
 struct netcf_if *
 ncf_define(struct netcf *ncf, const char *xml) {
     API_ENTRY(ncf);
     return drv_define(ncf, xml);
 }
+#endif
 
 const char *ncf_if_name(struct netcf_if *nif) {
     API_ENTRY(nif->ncf);
@@ -180,10 +220,17 @@ const char *ncf_if_mac_string(struct netcf_if *nif) {
 }
 
 /* Delete the definition */
+#ifdef WIN32
+/* No mingw implementation */
+int ncf_if_undefine(struct netcf_if *nif) {
+    return -1;
+}
+#else
 int ncf_if_undefine(struct netcf_if *nif) {
     API_ENTRY(nif->ncf);
     return drv_undefine(nif);
 }
+#endif
 
 /* Bring the interface up */
 int ncf_if_up(struct netcf_if *nif) {
@@ -202,28 +249,49 @@ int ncf_if_down(struct netcf_if *nif) {
 /* Produce an XML description for the interface, in the same format that
  * NCF_DEFINE expects
  */
+#ifdef WIN32
+/* No mingw implementation */
+char *ncf_if_xml_desc(struct netcf_if *nif) {
+    return NULL;
+}
+#else
 char *ncf_if_xml_desc(struct netcf_if *nif) {
     API_ENTRY(nif->ncf);
     return drv_xml_desc(nif);
 }
+#endif
 
 /* Produce an XML description of the current live state of the
  * interface, in the same format that NCF_DEFINE expects, but
  * potentially with extra info not contained in the static config (ie
  * the current IP address of an interface that uses DHCP)
  */
+#ifdef WIN32
+/* No mingw implementation */
+char *ncf_if_xml_state(struct netcf_if *nif) {
+    return NULL;
+}
+#else
 char *ncf_if_xml_state(struct netcf_if *nif) {
     API_ENTRY(nif->ncf);
     return drv_xml_state(nif);
 }
+#endif
 
 /* Report various status info about the interface as bits in
  * "flags". Returns 0 on success, -1 on failure
  */
+#ifdef WIN32
+/* No mingw implementation */
+int ncf_if_status(struct netcf_if *nif, unsigned int *flags) {
+    return -1;
+}
+#else
 int ncf_if_status(struct netcf_if *nif, unsigned int *flags) {
     API_ENTRY(nif->ncf);
     return drv_if_status(nif, flags);
 }
+#endif
 
 /* Release any resources used by this NETCF_IF; the pointer is invalid
  * after this call
@@ -240,6 +308,7 @@ int ncf_error(struct netcf *ncf, const char **errmsg, const char **details) {
 
     if (ncf->errcode >= ARRAY_CARDINALITY(errmsgs))
         errcode = NETCF_EINTERNAL;
+
     if (errmsg)
         *errmsg = errmsgs[errcode];
     if (details)
@@ -250,22 +319,36 @@ int ncf_error(struct netcf *ncf, const char **errmsg, const char **details) {
 /*
  * Test interface
  */
+#ifdef WIN32
+/* No mingw implementation */
+int ncf_get_aug(struct netcf *ncf, const char *ncf_xml, char **aug_xml) {
+    return -1;
+}
+#else
 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);
 }
+#endif
 
+#ifdef WIN32
+/* No mingw implementation */
+int ncf_put_aug(struct netcf *ncf, const char *aug_xml, char **ncf_xml) {
+    return -1;
+}
+#else
 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);
 }
+#endif
 
+#ifndef WIN32
 /*
  * Internal helpers
  */
-
 static int
 exec_program(struct netcf *ncf,
              const char *const*argv,
@@ -310,7 +393,6 @@ exec_program(struct netcf *ncf,
 
     /* Clear out all signal handlers from parent so nothing unexpected
        can happen in our child once we unblock signals */
-
     sig_action.sa_handler = SIG_DFL;
     sig_action.sa_flags = 0;
     sigemptyset(&sig_action.sa_mask);
@@ -349,6 +431,7 @@ error:
        should never jump here on error */
     return -1;
 }
+#endif
 
 /**
  * Run a command without using the shell.
@@ -368,8 +451,13 @@ int run_program(struct netcf *ncf, const char *const *argv) {
     argv_str = argv_to_string(argv);
     ERR_NOMEM(argv_str == NULL, ncf);
 
+#ifdef WIN32
+    ret = posix_spawnp(&childpid, argv[0], NULL, NULL, (char * const*)argv, environ);
+    ERR_COND_BAIL(ret != 0, ncf, EOTHER);
+#else
     exec_program(ncf, argv, argv_str, &childpid);
     ERR_BAIL(ncf);
+#endif
 
     while ((waitret = waitpid(childpid, &exitstatus, 0) == -1) &&
            errno == EINTR) {
-- 
1.7.2.3



More information about the netcf-devel mailing list