[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[PATCH 3/3] Replace all popt use with glib's option parsing code.



We have glib for other things, so we can use it for option parsing and
dump another library dependency.
---
 anaconda.spec.in    |    1 -
 configure.ac        |    5 +--
 isys/Makefile.am    |    2 +-
 isys/isys.c         |    1 -
 loader/Makefile.am  |    4 +-
 loader/driverdisk.c |   53 +++++++++++++++++-----------
 loader/hardware.c   |   17 +++++----
 loader/hdinstall.c  |   36 +++++++++++--------
 loader/kickstart.c  |   53 ++++++++++++++++------------
 loader/loader.c     |   59 ++++++++++++++++++-------------
 loader/modules.c    |   33 +++++++++++-------
 loader/net.c        |   96 ++++++++++++++++++++-------------------------------
 loader/nfsinstall.c |   32 +++++++++-------
 loader/urlinstall.c |   36 +++++++++++--------
 utils/Makefile.am   |    4 +-
 utils/modlist.c     |   62 +++++++++++++++++++++------------
 16 files changed, 268 insertions(+), 226 deletions(-)

diff --git a/anaconda.spec.in b/anaconda.spec.in
index 4f79520..862e306 100644
--- a/anaconda.spec.in
+++ b/anaconda.spec.in
@@ -66,7 +66,6 @@ BuildRequires: libxml2-python
 BuildRequires: mkinitrd-devel >= %{mkinitrdver}
 BuildRequires: newt-devel
 BuildRequires: pango-devel
-BuildRequires: popt-devel
 BuildRequires: pykickstart >= %{pykickstartver}
 BuildRequires: python-devel
 BuildRequires: python-urlgrabber
diff --git a/configure.ac b/configure.ac
index 25af0c2..8162b86 100644
--- a/configure.ac
+++ b/configure.ac
@@ -70,10 +70,6 @@ AC_CHECK_LIB([newt], [newtInit],
              [AC_SUBST(NEWT_LIBS, [-lnewt])],
              [AC_MSG_FAILURE([*** libnewt not usable.])])
 
-AC_CHECK_LIB([popt], [poptGetContext],
-             [AC_SUBST(POPT_LIBS, [-lpopt])],
-             [AC_MSG_FAILURE([*** libpopt not usable.])])
-
 AC_CHECK_LIB([slang], [SLang_get_int_size],
              [AC_SUBST(SLANG_LIBS, [-lslang])],
              [AC_MSG_FAILURE([*** libslang not usable.])])
@@ -132,6 +128,7 @@ AM_CHECK_PYTHON_HEADERS(,[AC_MSG_ERROR(could not find Python headers or library)
 
 # Check for libraries we need that provide pkg-config scripts
 PKG_PROG_PKG_CONFIG([0.23])
+PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.16.1])
 PKG_CHECK_MODULES([GTK_X11], [gtk+-x11-2.0 >= 2.16.1])
 PKG_CHECK_MODULES([GDK], [gdk-2.0 >= 2.16.1])
 PKG_CHECK_MODULES([NETWORKMANAGER], [NetworkManager >= 0.7.1])
diff --git a/isys/Makefile.am b/isys/Makefile.am
index e591b40..420e78d 100644
--- a/isys/Makefile.am
+++ b/isys/Makefile.am
@@ -30,7 +30,7 @@ dist_noinst_HEADERS = *.h
 ISYS_CFLAGS = -DVERSION='"$(PACKAGE_VERSION)"' $(NFS_CFLAGS) \
               $(NETWORKMANAGER_CFLAGS) $(LIBNL_CFLAGS) $(LIBNM_GLIB_CFLAGS) \
               $(SELINUX_CFLAGS)
-ISYS_LIBS   = $(RESOLV_LIBS) $(POPT_LIBS) $(EXT2FS_LIBS) $(ZLIB_LIBS) \
+ISYS_LIBS   = $(RESOLV_LIBS) $(EXT2FS_LIBS) $(ZLIB_LIBS) \
               $(DEVMAPPER_LIBS) $(BLKID_LIBS) $(X11_LIBS) $(SELINUX_LIBS) \
               $(LIBNL_LIBS) $(LIBNM_GLIB_LIBS)
 
diff --git a/isys/isys.c b/isys/isys.c
index 3c0c573..4c31512 100644
--- a/isys/isys.c
+++ b/isys/isys.c
@@ -25,7 +25,6 @@
 #define u32 __u32
 #include <ext2fs/ext2fs.h>
 #include <fcntl.h>
-#include <popt.h>
 /* Need to tell loop.h what the actual dev_t type is. */
 #undef dev_t
 #if defined(__alpha) || (defined(__sparc__) && defined(__arch64__))
diff --git a/loader/Makefile.am b/loader/Makefile.am
index 8d0fdce..e5d1b7f 100644
--- a/loader/Makefile.am
+++ b/loader/Makefile.am
@@ -39,10 +39,10 @@ endif
 
 COMMON_CFLAGS      = -DUSE_LOGDEV -DVERSION='"$(PACKAGE_VERSION)"'
 
-loader_CFLAGS      = $(COMMON_CFLAGS) $(LIBNM_GLIB_CFLAGS) \
+loader_CFLAGS      = $(COMMON_CFLAGS) $(GLIB_CFLAGS) $(LIBNM_GLIB_CFLAGS) \
                      $(LIBCURL_CFLAGS) \
                      -DINCLUDE_LOCAL -DINCLUDE_NETWORK
-loader_LDADD       = $(NEWT_LIBS) $(POPT_LIBS) $(LIBNL_LIBS) \
+loader_LDADD       = $(NEWT_LIBS) $(GLIB_LIBS) $(LIBNL_LIBS) \
                      $(LIBNM_GLIB_LIBS) $(CHECKISOMD5_LIBS) \
                      $(LIBCURL_LIBS) \
                      $(ISCSI_LIBS) $(top_srcdir)/isys/libisys.la
diff --git a/loader/driverdisk.c b/loader/driverdisk.c
index e5d8f90..8c8cc93 100644
--- a/loader/driverdisk.c
+++ b/loader/driverdisk.c
@@ -23,12 +23,12 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <newt.h>
-#include <popt.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <sys/stat.h>
 #include <unistd.h>
+#include <glib.h>
 
 #include "copy.h"
 #include "loader.h"
@@ -554,34 +554,42 @@ static void getDDFromDev(struct loaderData_s * loaderData, char * dev);
 
 void useKickstartDD(struct loaderData_s * loaderData,
                     int argc, char ** argv) {
-    char * fstype = NULL;
     char * dev = NULL;
-    char * src = NULL;
-
     char * biospart = NULL, * p = NULL; 
-    int usebiosdev = 0;
-
-    poptContext optCon;
-    int rc;
-    struct poptOption ksDDOptions[] = {
+    gchar *fstype = NULL, *src = NULL;
+    gint usebiosdev = 0;
+    gchar **remaining = NULL;
+    GOptionContext *optCon = g_option_context_new(NULL);
+    GError *optErr = NULL;
+    GOptionEntry ksDDOptions[] = {
         /* The --type option is deprecated and now has no effect. */
-        { "type", '\0', POPT_ARG_STRING, &fstype, 0, NULL, NULL },
-        { "source", '\0', POPT_ARG_STRING, &src, 0, NULL, NULL },
-        { "biospart", '\0', POPT_ARG_NONE, &usebiosdev, 0, NULL, NULL },
-        { 0, 0, 0, 0, 0, 0, 0 }
+        { "type", 0, 0, G_OPTION_ARG_STRING, &fstype, NULL, NULL },
+        { "source", 0, 0, G_OPTION_ARG_STRING, &src, NULL, NULL },
+        { "biospart", 0, 0, G_OPTION_ARG_INT, &usebiosdev, NULL, NULL },
+        { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &remaining,
+          NULL, NULL },
+        { NULL },
     };
 
-    optCon = poptGetContext(NULL, argc, (const char **) argv, ksDDOptions, 0);
-    if ((rc = poptGetNextOpt(optCon)) < -1) {
+    g_option_context_set_help_enabled(optCon, FALSE);
+    g_option_context_add_main_entries(optCon, ksDDOptions, NULL);
+
+    if (!g_option_context_parse(optCon, &argc, &argv, &optErr)) {
         newtWinMessage(_("Kickstart Error"), _("OK"),
                        _("The following invalid argument was specified for "
-                         "the kickstart driver disk command: %s:%s"),
-                       poptBadOption(optCon, POPT_BADOPTION_NOALIAS), 
-                       poptStrerror(rc));
+                         "the kickstart driver disk command: %s"),
+                       optErr->message);
+        g_error_free(optErr);
+        g_option_context_free(optCon);
+        g_strfreev(remaining);
         return;
     }
 
-    dev = (char *) poptGetArg(optCon);
+    g_option_context_free(optCon);
+
+    if ((remaining != NULL) && (g_strv_length(remaining) == 1)) {
+        dev = remaining[0];
+    }
 
     if (!dev && !src) {
         logMessage(ERROR, "bad arguments to kickstart driver disk command");
@@ -606,10 +614,13 @@ void useKickstartDD(struct loaderData_s * loaderData,
     }
 
     if (dev) {
-        return getDDFromDev(loaderData, dev);
+        getDDFromDev(loaderData, dev);
     } else {
-        return getDDFromSource(loaderData, src);
+        getDDFromSource(loaderData, src);
     }
+
+    g_strfreev(remaining);
+    return;
 }
 
 static void getDDFromDev(struct loaderData_s * loaderData, char * dev) {
diff --git a/loader/hardware.c b/loader/hardware.c
index e9be279..1f32905 100644
--- a/loader/hardware.c
+++ b/loader/hardware.c
@@ -25,13 +25,13 @@
 
 #include <errno.h>
 #include <fcntl.h>
-#include <popt.h>
 #include <string.h>
 #include <strings.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <ctype.h>
 #include <sys/wait.h>
+#include <glib.h>
 
 #include "loader.h"
 #include "hardware.h"
@@ -115,8 +115,9 @@ static int detectHardware() {
 int earlyModuleLoad(int justProbe) {
     int fd, len, i;
     char buf[1024], *cmdLine;
-    int argc;
-    char ** argv;
+    gint argc = 0;
+    gchar **argv = NULL;
+    GError *optErr = NULL;
 
     /* FIXME: reparsing /proc/cmdline to avoid major loader changes.  
      * should probably be done in loader.c:parseCmdline() like everything 
@@ -126,13 +127,15 @@ int earlyModuleLoad(int justProbe) {
     len = read(fd, buf, sizeof(buf) - 1);
     close(fd);
     if (len <= 0) return 1;
-        
+
     buf[len] = '\0';
     cmdLine = buf;
-    
-    if (poptParseArgvString(cmdLine, &argc, (const char ***) &argv))
+
+    if (!g_shell_parse_argv(cmdLine, &argc, &argv, &optErr)) {
+        g_error_free(optErr);
         return 1;
-    
+    }
+
     for (i=0; i < argc; i++) {
         if (!strncasecmp(argv[i], "driverload=", 11)) {
             logMessage(INFO, "loading %s early", argv[i] + 11);
diff --git a/loader/hdinstall.c b/loader/hdinstall.c
index a4396df..c523f1c 100644
--- a/loader/hdinstall.c
+++ b/loader/hdinstall.c
@@ -27,11 +27,11 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <newt.h>
-#include <popt.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/mount.h>
 #include <unistd.h>
+#include <glib.h>
 
 #include "driverdisk.h"
 #include "hdinstall.h"
@@ -353,30 +353,34 @@ char * mountHardDrive(struct installMethod * method,
 
 void setKickstartHD(struct loaderData_s * loaderData, int argc,
                      char ** argv) {
-    char *biospart = NULL, *partition = NULL, *dir = NULL, *p;
-    poptContext optCon;
-    int rc;
-
-    struct poptOption ksHDOptions[] = {
-        { "biospart", '\0', POPT_ARG_STRING, &biospart, 0, NULL, NULL },
-        { "partition", '\0', POPT_ARG_STRING, &partition, 0, NULL, NULL },
-        { "dir", '\0', POPT_ARG_STRING, &dir, 0, NULL, NULL },
-        { 0, 0, 0, 0, 0, 0, 0 }
+    char *p;
+    gchar *biospart = NULL, *partition = NULL, *dir = NULL;
+    GOptionContext *optCon = g_option_context_new(NULL);
+    GError *optErr = NULL;
+    GOptionEntry ksHDOptions[] = {
+        { "biospart", 0, 0, G_OPTION_ARG_STRING, &biospart, NULL, NULL },
+        { "partition", 0, 0, G_OPTION_ARG_STRING, &partition, NULL, NULL },
+        { "dir", 0, 0, G_OPTION_ARG_STRING, &dir, NULL, NULL },
+        { NULL },
     };
-  
 
     logMessage(INFO, "kickstartFromHD");
-    optCon = poptGetContext(NULL, argc, (const char **) argv, ksHDOptions, 0);
-    if ((rc = poptGetNextOpt(optCon)) < -1) {
+
+    g_option_context_set_help_enabled(optCon, FALSE);
+    g_option_context_add_main_entries(optCon, ksHDOptions, NULL);
+
+    if (!g_option_context_parse(optCon, &argc, &argv, &optErr)) {
         startNewt();
         newtWinMessage(_("Kickstart Error"), _("OK"),
                        _("Bad argument to HD kickstart method "
-                         "command %s: %s"),
-                       poptBadOption(optCon, POPT_BADOPTION_NOALIAS), 
-                       poptStrerror(rc));
+                         "command: %s"), optErr->message);
+        g_error_free(optErr);
+        g_option_context_free(optCon);
         return;
     }
 
+    g_option_context_free(optCon);
+
     if (biospart) {
         char * dev;
 
diff --git a/loader/kickstart.c b/loader/kickstart.c
index 764df5d..494045d 100644
--- a/loader/kickstart.c
+++ b/loader/kickstart.c
@@ -28,11 +28,11 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <newt.h>
-#include <popt.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/stat.h>
 #include <unistd.h>
+#include <glib.h>
 
 #include "loader.h"
 #include "loadermisc.h"
@@ -120,8 +120,9 @@ int ksReadCommands(char * cmdFile) {
     char * start, * end, * chptr;
     char oldch;
     int line = 0;
-    char ** argv; 
-    int argc;
+    gint argc = 0;
+    gchar **argv = NULL;
+    GError *optErr = NULL;
     int inSection = 0; /* in a section such as %post, %pre or %packages */
     struct ksCommandNames * cmd;
     int commandsAlloced = 5;
@@ -179,11 +180,15 @@ int ksReadCommands(char * cmdFile) {
             /* JKFIXME: this should be handled better, but at least we 
              * won't segfault now */
         } else {
-            if (poptParseArgvString(start, &argc, 
-                                    (const char ***) &argv) || !argc) {
-                newtWinMessage(_("Kickstart Error"), _("OK"), 
-                               _("Error in %s on line %d of kickstart file %s."),
-                               argv[0], line, cmdFile);
+            if (!g_shell_parse_argv(start, &argc, &argv, &optErr) && argc) {
+                newtWinMessage(_("Kickstart Error"), _("OK"),
+                               _("Error in %s on line %d of kickstart "
+                                 "file %s."), argv[0], line, cmdFile);
+                g_error_free(optErr);
+            } else if (!argc) {
+                newtWinMessage(_("Kickstart Error"), _("OK"),
+                               _("Missing options on line %d of kickstart "
+                                 "file %s."), line, cmdFile);
             } else {
                 for (cmd = ksTable; cmd->name; cmd++)
                     if (!strcmp(cmd->name, argv[0])) break;
@@ -478,29 +483,31 @@ static void setHalt(struct loaderData_s * loaderData, int argc,
 
 static void setShutdown(struct loaderData_s * loaderData, int argc, 
                     char ** argv) {
-    poptContext optCon;
-    int reboot = 0, halt = 0, poweroff = 0;
-    int rc;
-
-    struct poptOption ksOptions[] = {
-        { "eject", 'e', POPT_ARG_NONE, NULL, 0, NULL, NULL },
-        { "reboot", 'r', POPT_ARG_NONE, &reboot, 0, NULL, NULL },
-        { "halt", 'h', POPT_ARG_NONE, &halt, 0, NULL, NULL },
-        { "poweroff", 'p', POPT_ARG_NONE, &poweroff, 0, NULL, NULL },
-        { 0, 0, 0, 0, 0, 0, 0 }
+    gint eject = 0, reboot = 0, halt = 0, poweroff = 0;
+    GOptionContext *optCon = g_option_context_new(NULL);
+    GError *optErr = NULL;
+    GOptionEntry ksOptions[] = {
+        { "eject", 'e', 0, G_OPTION_ARG_INT, &eject, NULL, NULL },
+        { "reboot", 'r', 0, G_OPTION_ARG_INT, &reboot, NULL, NULL },
+        { "halt", 'h', 0, G_OPTION_ARG_INT, &halt, NULL, NULL },
+        { "poweroff", 'p', 0, G_OPTION_ARG_INT, &poweroff, NULL, NULL },
+        { NULL },
     };
 
-    optCon = poptGetContext(NULL, argc, (const char **) argv, ksOptions, 0);
-    if ((rc = poptGetNextOpt(optCon)) < -1) {
+    g_option_context_set_help_enabled(optCon, FALSE);
+    g_option_context_add_main_entries(optCon, ksOptions, NULL);
+
+    if (!g_option_context_parse(optCon, &argc, &argv, &optErr)) {
         startNewt();
         newtWinMessage(_("Kickstart Error"), _("OK"),
                        _("Bad argument to shutdown kickstart method "
-                         "command %s: %s"),
-                       poptBadOption(optCon, POPT_BADOPTION_NOALIAS), 
-                       poptStrerror(rc));
+                         "command: %s"), optErr->message);
+        g_error_free(optErr);
+        g_option_context_free(optCon);
         return;
     }
 
+    g_option_context_free(optCon);
 
     if (FL_NOKILL(flags)) {
         flags |= LOADER_FLAGS_HALT;
diff --git a/loader/loader.c b/loader/loader.c
index 270c0e8..71bfe7f 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -33,7 +33,6 @@
 #include <execinfo.h>
 #include <fcntl.h>
 #include <newt.h>
-#include <popt.h>
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -56,6 +55,7 @@
 #include <linux/vt.h>
 
 #include <curl/curl.h>
+#include <glib.h>
 
 #ifdef USE_MTRACE
 #include <mcheck.h>
@@ -902,8 +902,9 @@ static void parseCmdLineFlags(struct loaderData_s * loaderData,
     int fd;
     char buf[1024];
     int len;
-    char ** argv;
-    int argc;
+    gint argc = 0;
+    gchar **argv = NULL;
+    GError *optErr = NULL;
     int numExtraArgs = 0;
     int i;
     char *front, *stage2param = NULL;
@@ -928,8 +929,10 @@ static void parseCmdLineFlags(struct loaderData_s * loaderData,
 
     logMessage(INFO, "kernel command line: %s", cmdLine);
     
-    if (poptParseArgvString(cmdLine, &argc, (const char ***) &argv))
+    if (!g_shell_parse_argv(cmdLine, &argc, &argv, &optErr)) {
+        g_error_free(optErr);
         return;
+    }
 
     for (i=0; i < argc; i++) {
         if (!strcasecmp(argv[i], "askmethod"))
@@ -1823,19 +1826,21 @@ int main(int argc, char ** argv) {
     struct loaderData_s loaderData;
 
     char *path;
-    char * cmdLine = NULL;
-    char * ksFile = NULL;
-    int testing = 0;
-    int mediacheck = 0;
-    char * virtpcon = NULL;
-    poptContext optCon;
-    struct poptOption optionTable[] = {
-        { "cmdline", '\0', POPT_ARG_STRING, &cmdLine, 0, NULL, NULL },
-        { "ksfile", '\0', POPT_ARG_STRING, &ksFile, 0, NULL, NULL },
-        { "test", '\0', POPT_ARG_NONE, &testing, 0, NULL, NULL },
-        { "mediacheck", '\0', POPT_ARG_NONE, &mediacheck, 0, NULL, NULL},
-        { "virtpconsole", '\0', POPT_ARG_STRING, &virtpcon, 0, NULL, NULL },
-        { 0, 0, 0, 0, 0, 0, 0 }
+
+    gchar *cmdLine = NULL, *ksFile = NULL, *virtpcon = NULL;
+    gboolean testing = FALSE, mediacheck = FALSE;
+    gchar **remaining = NULL;
+    GOptionContext *optCon = g_option_context_new(NULL);
+    GError *optErr = NULL;
+    GOptionEntry optionTable[] = {
+        { "cmdline", 0, 0, G_OPTION_ARG_STRING, &cmdLine, NULL, NULL },
+        { "ksfile", 0, 0, G_OPTION_ARG_STRING, &ksFile, NULL, NULL },
+        { "test", 0, 0, G_OPTION_ARG_NONE, &testing, NULL, NULL },
+        { "mediacheck", 0, 0, G_OPTION_ARG_NONE, &mediacheck, NULL, NULL },
+        { "virtpconsole", 0, 0, G_OPTION_ARG_STRING, &virtpcon, NULL, NULL },
+        { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &remaining,
+          NULL, NULL },
+        { NULL },
     };
 
     /* get init PID if we have it */
@@ -1865,20 +1870,26 @@ int main(int argc, char ** argv) {
     rc = anaconda_trace_init();
 
     /* now we parse command line options */
-    optCon = poptGetContext(NULL, argc, (const char **) argv, optionTable, 0);
+    g_option_context_set_help_enabled(optCon, FALSE);
+    g_option_context_add_main_entries(optCon, optionTable, NULL);
 
-    if ((rc = poptGetNextOpt(optCon)) < -1) {
-        fprintf(stderr, "bad option %s: %s\n",
-                poptBadOption(optCon, POPT_BADOPTION_NOALIAS), 
-                poptStrerror(rc));
+    if (!g_option_context_parse(optCon, &argc, &argv, &optErr)) {
+        fprintf(stderr, "bad option: %s\n", optErr->message);
+        g_error_free(optErr);
+        g_option_context_free(optCon);
         doExit(1);
     }
 
-    if ((arg = (char *) poptGetArg(optCon))) {
-        fprintf(stderr, "unexpected argument: %s\n", arg);
+    g_option_context_free(optCon);
+
+    if (remaining) {
+        fprintf(stderr, "unexpected argument: %s\n", remaining[0]);
+        g_strfreev(remaining);
         doExit(1);
     }
 
+    g_strfreev(remaining);
+
     if (!testing && !access("/var/run/loader.run", R_OK)) {
         printf(_("loader has already been run.  Starting shell.\n"));
         execl("/bin/sh", "-/bin/sh", NULL);
diff --git a/loader/modules.c b/loader/modules.c
index a174dc1..07f781a 100644
--- a/loader/modules.c
+++ b/loader/modules.c
@@ -29,7 +29,6 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <newt.h>
-#include <popt.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -363,27 +362,35 @@ void loadKickstartModule(struct loaderData_s * loaderData,
                          int argc, char **argv) {
     gchar *opts = NULL;
     gchar *module = NULL;
-    gchar **args = NULL;
-    poptContext optCon;
+    gchar **args = NULL, **remaining = NULL;
     gboolean rc;
-    struct poptOption ksDeviceOptions[] = {
-        { "opts", '\0', POPT_ARG_STRING, &opts, 0, NULL, NULL },
-        { 0, 0, 0, 0, 0, 0, 0 }
+    GOptionContext *optCon = g_option_context_new(NULL);
+    GError *optErr = NULL;
+    GOptionEntry ksDeviceOptions[] = {
+        { "opts", 0, 0, G_OPTION_ARG_STRING, &opts, NULL, NULL },
+        { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &remaining,
+          NULL, NULL },
+        { NULL },
     };
 
-    optCon = poptGetContext(NULL, argc, (const char **) argv,
-                            ksDeviceOptions, 0);
-    if ((rc = poptGetNextOpt(optCon)) < -1) {
+    g_option_context_set_help_enabled(optCon, FALSE);
+    g_option_context_add_main_entries(optCon, ksDeviceOptions, NULL);
+
+    if (!g_option_context_parse(optCon, &argc, &argv, &optErr)) {
         startNewt();
         newtWinMessage(_("Kickstart Error"), _("OK"),
                        _("Bad argument to device kickstart method "
-                         "command %s: %s"),
-                       poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
-                       poptStrerror(rc));
+                         "command: %s"), optErr->message);
+        g_error_free(optErr);
+        g_option_context_free(optCon);
         return;
     }
 
-    module = (gchar *) poptGetArg(optCon);
+    g_option_context_free(optCon);
+
+    if ((remaining != NULL) && (g_strv_length(remaining) == 1)) {
+        module = remaining[0];
+    }
 
     if (!module) {
         startNewt();
diff --git a/loader/net.c b/loader/net.c
index 9280dc7..4f49d8f 100644
--- a/loader/net.c
+++ b/loader/net.c
@@ -28,7 +28,6 @@
 #include <sys/utsname.h>
 #include <arpa/inet.h>
 #include <errno.h>
-#include <popt.h>
 #include <resolv.h>
 #include <net/if.h>
 #include <newt.h>
@@ -1526,72 +1525,53 @@ int writeEnabledNetInfo(iface_t *iface) {
 
 void setKickstartNetwork(struct loaderData_s * loaderData, int argc, 
                          char ** argv) {
-    char * arg, * bootProto = NULL, * device = NULL, *ethtool = NULL, * class = NULL;
-    char * essid = NULL, * wepkey = NULL, * onboot = NULL;
-    int mtu = 1500, noipv4 = 0, noipv6 = 0, dhcpTimeout = -1, noDns = 0, noksdev = 0;
-    int rc;
-    poptContext optCon;
     iface_t iface;
-
-    struct poptOption ksOptions[] = {
-        { "bootproto", '\0', POPT_ARG_STRING, &bootProto, 0, NULL, NULL },
-        { "device", '\0', POPT_ARG_STRING, &device, 0, NULL, NULL },
-        { "dhcpclass", '\0', POPT_ARG_STRING, &class, 0, NULL, NULL },
-        { "gateway", '\0', POPT_ARG_STRING, NULL, 'g', NULL, NULL },
-        { "ip", '\0', POPT_ARG_STRING, NULL, 'i', NULL, NULL },
-        { "mtu", '\0', POPT_ARG_INT, &mtu, 0, NULL, NULL },
-        { "nameserver", '\0', POPT_ARG_STRING, NULL, 'n', NULL, NULL },
-        { "netmask", '\0', POPT_ARG_STRING, NULL, 'm', NULL, NULL },
-        { "noipv4", '\0', POPT_ARG_NONE, &noipv4, 0, NULL, NULL },
-        { "noipv6", '\0', POPT_ARG_NONE, &noipv6, 0, NULL, NULL },
-        { "nodns", '\0', POPT_ARG_NONE, &noDns, 0, NULL, NULL },
-        { "hostname", '\0', POPT_ARG_STRING, NULL, 'h', NULL, NULL},
-        { "ethtool", '\0', POPT_ARG_STRING, &ethtool, 0, NULL, NULL },
-        { "essid", '\0', POPT_ARG_STRING, &essid, 0, NULL, NULL },
-        { "wepkey", '\0', POPT_ARG_STRING, &wepkey, 0, NULL, NULL },
-        { "onboot", '\0', POPT_ARG_STRING, &onboot, 0, NULL, NULL },
-        { "notksdevice", '\0', POPT_ARG_NONE, &noksdev, 0, NULL, NULL },
-        { "dhcptimeout", '\0', POPT_ARG_INT, &dhcpTimeout, 0, NULL, NULL },
-        { 0, 0, 0, 0, 0, 0, 0 }
+    gchar *bootProto = NULL, *device = NULL, *class = NULL, *ethtool = NULL;
+    gchar *essid = NULL, *wepkey = NULL, *onboot = NULL;
+    gint mtu = 1500, dhcpTimeout = -1;
+    gboolean noipv4 = FALSE, noipv6 = FALSE, noDns = FALSE, noksdev = FALSE;
+    GOptionContext *optCon = g_option_context_new(NULL);
+    GError *optErr = NULL;
+    GOptionEntry ksOptions[] = {
+        { "bootproto", 0, 0, G_OPTION_ARG_STRING, &bootProto, NULL, NULL },
+        { "device", 0, 0, G_OPTION_ARG_STRING, &device, NULL, NULL },
+        { "dhcpclass", 0, 0, G_OPTION_ARG_STRING, &class, NULL, NULL },
+        { "gateway", 'g', 0, G_OPTION_ARG_STRING, &loaderData->gateway,
+          NULL, NULL },
+        { "ip", 'i', 0, G_OPTION_ARG_STRING, &loaderData->ipv4, NULL, NULL },
+        { "mtu", 0, 0, G_OPTION_ARG_INT, &mtu, NULL, NULL },
+        { "nameserver", 'n', 0, G_OPTION_ARG_STRING, &loaderData->dns,
+          NULL, NULL },
+        { "netmask", 'm', 0, G_OPTION_ARG_STRING, &loaderData->netmask,
+          NULL, NULL },
+        { "noipv4", 0, 0, G_OPTION_ARG_NONE, &noipv4, NULL, NULL },
+        { "noipv6", 0, 0, G_OPTION_ARG_NONE, &noipv6, NULL, NULL },
+        { "nodns", 0, 0, G_OPTION_ARG_NONE, &noDns, NULL, NULL },
+        { "hostname", 'h', 0, G_OPTION_ARG_STRING, &loaderData->hostname,
+          NULL, NULL },
+        { "ethtool", 0, 0, G_OPTION_ARG_STRING, &ethtool, NULL, NULL },
+        { "essid", 0, 0, G_OPTION_ARG_STRING, &essid, NULL, NULL },
+        { "wepkey", 0, 0, G_OPTION_ARG_STRING, &wepkey, NULL, NULL },
+        { "onboot", 0, 0, G_OPTION_ARG_STRING, &onboot, NULL, NULL },
+        { "notksdevice", 0, 0, G_OPTION_ARG_NONE, &noksdev, NULL, NULL },
+        { "dhcptimeout", 0, 0, G_OPTION_ARG_INT, &dhcpTimeout, NULL, NULL },
+        { NULL },
     };
 
     iface_init_iface_t(&iface);
 
-    optCon = poptGetContext(NULL, argc, (const char **) argv, 
-                            ksOptions, 0);    
-    while ((rc = poptGetNextOpt(optCon)) >= 0) {
-        arg = (char *) poptGetOptArg(optCon);
+    g_option_context_set_help_enabled(optCon, FALSE);
+    g_option_context_add_main_entries(optCon, ksOptions, NULL);
 
-        switch (rc) {
-        case 'g':
-            loaderData->gateway = strdup(arg);
-            break;
-        case 'i':
-            loaderData->ipv4 = strdup(arg);
-            break;
-        case 'n':
-            loaderData->dns = strdup(arg);
-            break;
-        case 'm':
-            loaderData->netmask = strdup(arg);
-            break;
-        case 'h':
-            if (loaderData->hostname) 
-                free(loaderData->hostname);
-            loaderData->hostname = strdup(arg);
-            break;
-        }
-    }
-
-    if (rc < -1) {
+    if (!g_option_context_parse(optCon, &argc, &argv, &optErr)) {
         newtWinMessage(_("Kickstart Error"), _("OK"),
-                       _("Bad argument to kickstart network command %s: %s"),
-                       poptBadOption(optCon, POPT_BADOPTION_NOALIAS), 
-                       poptStrerror(rc));
-    } else {
-        poptFreeContext(optCon);
+                       _("Bad argument to kickstart network command: %s"),
+                       optErr->message);
+        g_error_free(optErr);
     }
 
+    g_option_context_free(optCon);
+
     /* if they've specified dhcp/bootp use dhcp for the interface */
     if (bootProto && (!strncmp(bootProto, "dhcp", 4) || 
                        !strncmp(bootProto, "bootp", 4))) {
diff --git a/loader/nfsinstall.c b/loader/nfsinstall.c
index e405df9..cabad46 100644
--- a/loader/nfsinstall.c
+++ b/loader/nfsinstall.c
@@ -25,7 +25,6 @@
 
 #include <fcntl.h>
 #include <newt.h>
-#include <popt.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
@@ -369,29 +368,34 @@ char * mountNfsImage(struct installMethod * method,
 
 void setKickstartNfs(struct loaderData_s * loaderData, int argc,
                      char ** argv) {
-    char * host = NULL, * dir = NULL, * mountOpts = NULL;
     char *substr = NULL;
-    poptContext optCon;
-    int rc;
-    struct poptOption ksNfsOptions[] = {
-        { "server", '\0', POPT_ARG_STRING, &host, 0, NULL, NULL },
-        { "dir", '\0', POPT_ARG_STRING, &dir, 0, NULL, NULL },
-        { "opts", '\0', POPT_ARG_STRING, &mountOpts, 0, NULL, NULL},
-        { 0, 0, 0, 0, 0, 0, 0 }
+    gchar *host = NULL, *dir = NULL, *mountOpts = NULL;
+    GOptionContext *optCon = g_option_context_new(NULL);
+    GError *optErr = NULL;
+    GOptionEntry ksNfsOptions[] = {
+        { "server", 0, 0, G_OPTION_ARG_STRING, &host, NULL, NULL },
+        { "dir", 0, 0, G_OPTION_ARG_STRING, &dir, NULL, NULL },
+        { "opts", 0, 0, G_OPTION_ARG_STRING, &mountOpts, NULL, NULL },
+        { NULL },
     };
 
     logMessage(INFO, "kickstartFromNfs");
-    optCon = poptGetContext(NULL, argc, (const char **) argv, ksNfsOptions, 0);
-    if ((rc = poptGetNextOpt(optCon)) < -1) {
+
+    g_option_context_set_help_enabled(optCon, FALSE);
+    g_option_context_add_main_entries(optCon, ksNfsOptions, NULL);
+
+    if (!g_option_context_parse(optCon, &argc, &argv, &optErr)) {
         startNewt();
         newtWinMessage(_("Kickstart Error"), _("OK"),
                        _("Bad argument to NFS kickstart method "
-                         "command %s: %s"),
-                       poptBadOption(optCon, POPT_BADOPTION_NOALIAS), 
-                       poptStrerror(rc));
+                         "command: %s"), optErr->message);
+        g_error_free(optErr);
+        g_option_context_free(optCon);
         return;
     }
 
+    g_option_context_free(optCon);
+
     if (!host || !dir) {
         logMessage(ERROR, "host and directory for nfs kickstart not specified");
         return;
diff --git a/loader/urlinstall.c b/loader/urlinstall.c
index b03efce..8279ec9 100644
--- a/loader/urlinstall.c
+++ b/loader/urlinstall.c
@@ -24,12 +24,12 @@
  */
 
 #include <newt.h>
-#include <popt.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/mount.h>
 #include <unistd.h>
 #include <errno.h>
+#include <glib.h>
 
 #include "../isys/iface.h"
 
@@ -382,29 +382,33 @@ int kickstartFromUrl(char * url, struct loaderData_s * loaderData) {
 
 void setKickstartUrl(struct loaderData_s * loaderData, int argc,
 		    char ** argv) {
-
-    char *url = NULL, *substr = NULL;
-    char *proxy = NULL;
-    poptContext optCon;
-    int rc;
-    struct poptOption ksUrlOptions[] = {
-        { "url", '\0', POPT_ARG_STRING, &url, 0, NULL, NULL },
-        { "proxy", '\0', POPT_ARG_STRING, &proxy, 0, NULL, NULL },
-        { 0, 0, 0, 0, 0, 0, 0 }
+    char *substr = NULL;
+    gchar *url = NULL, *proxy = NULL;
+    GOptionContext *optCon = g_option_context_new(NULL);
+    GError *optErr = NULL;
+    GOptionEntry ksUrlOptions[] = {
+        { "url", 0, 0, G_OPTION_ARG_STRING, &url, NULL, NULL },
+        { "proxy", 0, 0, G_OPTION_ARG_STRING, &proxy, NULL, NULL },
+        { NULL },
     };
 
     logMessage(INFO, "kickstartFromUrl");
-    optCon = poptGetContext(NULL, argc, (const char **) argv, ksUrlOptions, 0);
-    if ((rc = poptGetNextOpt(optCon)) < -1) {
+
+    g_option_context_set_help_enabled(optCon, FALSE);
+    g_option_context_add_main_entries(optCon, ksUrlOptions, NULL);
+
+    if (!g_option_context_parse(optCon, &argc, &argv, &optErr)) {
         startNewt();
         newtWinMessage(_("Kickstart Error"), _("OK"),
-                       _("Bad argument to Url kickstart method "
-                         "command %s: %s"),
-                       poptBadOption(optCon, POPT_BADOPTION_NOALIAS), 
-                       poptStrerror(rc));
+                       _("Bad argument to URL kickstart method "
+                         "command: %s"), optErr->message);
+        g_error_free(optErr);
+        g_option_context_free(optCon);
         return;
     }
 
+    g_option_context_free(optCon);
+
     if (!url) {
         newtWinMessage(_("Kickstart Error"), _("OK"),
                        _("Must supply a --url argument to Url kickstart method."));
diff --git a/utils/Makefile.am b/utils/Makefile.am
index 750f515..bfc8fd4 100644
--- a/utils/Makefile.am
+++ b/utils/Makefile.am
@@ -27,8 +27,8 @@ if IS_S390
 utils_PROGRAMS      += geninitrdsz mk-s390-cdboot
 endif
 
-modlist_CFLAGS      = -I$(top_srcdir)/loader
-modlist_LDADD       = $(POPT_LIBS)
+modlist_CFLAGS      = -I$(top_srcdir)/loader $(GLIB_CFLAGS)
+modlist_LDADD       = $(GLIB_LIBS)
 modlist_SOURCES     = modlist.c $(top_srcdir)/loader/moduleinfo.c
 
 MAINTAINERCLEANFILES = Makefile.in
diff --git a/utils/modlist.c b/utils/modlist.c
index 5c88e32..7aff567 100644
--- a/utils/modlist.c
+++ b/utils/modlist.c
@@ -17,44 +17,53 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <popt.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <glib.h>
 
 #include "../isys/isys.h"
 #include "moduleinfo.h"
 
 int main(int argc, char ** argv) {
-    poptContext optCon;
-    char * modInfoFile = "/boot/module-info";
+    GOptionContext *optCon = g_option_context_new(NULL);
+    GError *optErr = NULL;
+    gchar *modInfoFile = "/boot/module-info";
+    gboolean ignoreMissing = FALSE, showModInfo = FALSE;
+    gchar **remaining = NULL;
     enum driverMajor major;
     const char * type;
     const char * mod;
     struct moduleInfo * list, * m;
-    int rc, i;
-    int showModInfo = 0;
-    int ignoreMissing = 0;
+    int i, arg = 0;
     moduleInfoSet mis;
     struct moduleInfo * mi;
-    struct poptOption optionTable[] = {
-    	    { "ignore-missing", 'I', POPT_ARG_NONE, &ignoreMissing, 0,
-	    	"Ignore modules not in modinfo file for --modinfo" },
-	    { "modinfo", 'm', POPT_ARG_NONE, &showModInfo, 0,
-	    	"Give output in module-info file for listed args" },
-	    { "modinfo-file", 'f', POPT_ARG_STRING, &modInfoFile, 0,
-	    	"Module info file to use"},
-	    POPT_AUTOHELP
-	    { 0, 0, 0, 0, 0 }
+    GOptionEntry optionTable[] = {
+        { "ignore-missing", 'I', 0, G_OPTION_ARG_NONE, &ignoreMissing,
+          "Ignore modules not in modinfo file for --modinfo", NULL },
+        { "modinfo", 'm', 0, G_OPTION_ARG_NONE, &showModInfo,
+          "Give output in module-info file for listed args", NULL },
+        { "modinfo-file", 'f', 0, G_OPTION_ARG_STRING, &modInfoFile,
+          "Module info file to use", NULL },
+        { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &remaining,
+          NULL, NULL },
+        { NULL },
     };
 
-    optCon = poptGetContext(NULL, argc, (const char **) argv, optionTable, 0);
+    g_option_context_add_main_entries(optCon, optionTable, NULL);
 
-    if ((rc = poptGetNextOpt(optCon)) < -1) {
-	fprintf(stderr, "bad option %s: %s\n",
-		       poptBadOption(optCon, POPT_BADOPTION_NOALIAS), 
-		       poptStrerror(rc));
-	exit(1);
+    if (!g_option_context_parse(optCon, &argc, &argv, &optErr)) {
+       fprintf(stderr, "bad option: %s\n", optErr->message);
+       g_error_free(optErr);
+       g_option_context_free(optCon);
+       g_strfreev(remaining);
+       exit(1);
+    }
+
+    g_option_context_free(optCon);
+
+    if (remaining == NULL) {
+        exit(1);
     }
 
     mis = newModuleInfoSet();
@@ -65,7 +74,7 @@ int main(int argc, char ** argv) {
 
     if (showModInfo) {
         printf("Version 0\n");
-	while ((mod = poptGetArg(optCon))) {
+	while ((mod = remaining[arg]) != NULL) {
 	    mi = findModuleInfo(mis, mod);
 	    if (mi) {
 	    	printf("%s\n", mi->moduleName);
@@ -84,6 +93,7 @@ int main(int argc, char ** argv) {
 		      default:
 		      	fprintf(stderr, "unknown net minor type for %s\n",
 				mi->moduleName);
+			g_strfreev(remaining);
 			exit(1);
 		    }
 		    break;
@@ -91,6 +101,7 @@ int main(int argc, char ** argv) {
 		  default:
 		    fprintf(stderr, "unknown device type for %s (%d)\n",
 			    mi->moduleName, mi->major);
+		    g_strfreev(remaining);
 		    exit(1);
 
 		}
@@ -101,11 +112,13 @@ int main(int argc, char ** argv) {
 		}
 	    } else if (!ignoreMissing) {
 	    	fprintf(stderr, "I know nothing about %s\n", mod);
+		g_strfreev(remaining);
 		exit(1);
 	    }
+	    arg++;
 	}
     } else {
-	while ((type = poptGetArg(optCon))) {
+	while ((type = remaining[arg]) != NULL) {
 	    if (!strcasecmp(type, "scsi")) {
 		major = DRIVER_SCSI;
 	    } else if (!strcasecmp(type, "net")) {
@@ -116,6 +129,7 @@ int main(int argc, char ** argv) {
 		major = DRIVER_CDROM;
 	    } else {
 		fprintf(stderr, "type must be one of scsi, net, fs, cdrom\n");
+		g_strfreev(remaining);
 		exit(1);
 	    }
 
@@ -123,8 +137,10 @@ int main(int argc, char ** argv) {
 	    for (m = list; m && m->moduleName; m++)
 		printf("%s\n", m->moduleName);
 	    free(list);
+	    arg++;
 	}
     }
 
+    g_strfreev(remaining);
     return 0;
 }
-- 
1.6.5.2


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]