+User notification of the probe timeout.
[udpgate.git] / src / main.c
index aba413b..a0917e6 100644 (file)
@@ -1,6 +1,6 @@
 /* $Id$
- * UDP forwarding utility
- * Copyright (C) 2004 Jan Kratochvil <project-udpforward@jankratochvil.net>
+ * UDP Gateway utility
+ * Copyright (C) 2004 Jan Kratochvil <project-udpgate@jankratochvil.net>
  * 
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 #include <string.h>
 #include <setjmp.h>
 #include <unistd.h>
+
+#ifdef HAVE_GNOME
 #include <libgnome/gnome-program.h>
 #include <libgnomeui/gnome-ui-init.h>
+#endif
+
+#include "main.h"      /* self */
+#include "ui-line.h"
+#include "network.h"
+#include "configuration.h"
 
+#ifdef HAVE_GNOME
 #include "ui-gnome.h"
+#endif
+
+
+/* Config: */
+#define LOCAL_PORT_DEFAULT 9201
 
 
-int optarg_verbose;
 static int optarg_text;
+int optarg_verbose;
+int optarg_port=LOCAL_PORT_DEFAULT;
+static int optarg_start;
+static int optarg_stop;
+int optarg_no_fork;
+
+void (*ui_interactive)(void);
 
 static const struct poptOption popt_table[]={
 
-#define UDPFORWARD_POPT(shortname,longname,argInfoP,argP,valP,descripP,argDescripP) \
+#define UDPGATE_POPT(shortname,longname,argInfoP,argP,valP,descripP,argDescripP) \
                { \
                        longName: (longname), \
                        shortName: (shortname), \
@@ -49,11 +69,26 @@ static const struct poptOption popt_table[]={
                        argDescrip: (argDescripP), \
                }
 
-               UDPFORWARD_POPT(0  ,"text"            ,POPT_ARG_NONE  ,&optarg_text   ,0,
-                               N_("Disable Gnome UI; --text must be first argument"),NULL),
-               UDPFORWARD_POPT('v',"verbose"         ,POPT_ARG_NONE  ,&optarg_verbose,0,N_("Display additional debug information"),NULL),
-
-#undef UDPFORWARD_POPT
+#ifdef HAVE_GNOME
+#define OPT_TEXT_IF_GNOME N_("Disable Gnome UI; --text must be first argument")
+#else /* HAVE_GNOME */
+#define OPT_TEXT_IF_GNOME N_("(no Gnome UI compiled - stub only); --text must be first argument")
+#endif /* HAVE_GNOME */
+               UDPGATE_POPT(0  ,"text"   ,POPT_ARG_NONE                          ,&optarg_text   ,0,
+                               OPT_TEXT_IF_GNOME,NULL),
+#undef OPT_TEXT_IF_GNOME
+               UDPGATE_POPT('v',"verbose",POPT_ARG_NONE                          ,&optarg_verbose,0,
+                               N_("Display additional debug information"),NULL),
+               UDPGATE_POPT('p',"port"   ,POPT_ARG_INT |POPT_ARGFLAG_SHOW_DEFAULT,&optarg_port   ,0,
+                               N_("Listen on this UDP port"),NULL),
+               UDPGATE_POPT('s',"start"  ,POPT_ARG_NONE                          ,&optarg_start  ,0,
+                               N_("Start the daemon"),NULL),
+               UDPGATE_POPT('S',"stop"   ,POPT_ARG_NONE                          ,&optarg_stop   ,0,
+                               N_("Stop the daemon"),NULL),
+               UDPGATE_POPT('1',"no-fork",POPT_ARG_NONE                          ,&optarg_no_fork,0,
+                               N_("Do not detach from the current process"),NULL),
+
+#undef UDPGATE_POPT
                POPT_TABLEEND
                };
 
@@ -64,6 +99,7 @@ static const struct poptOption popt_table_autohelp[]={
                };
 
 
+#ifdef HAVE_GNOME
 static jmp_buf gnome_init_atexit_jmpbuf;
 static gboolean gnome_init_atexit_disable;
 
@@ -77,19 +113,22 @@ static void gnome_init_atexit_handler(void)
        _exit(EXIT_FAILURE);
 }
 
-gboolean gnome_init_g_log_handler_hit;
+static gboolean gnome_init_g_log_handler_hit;
 static void gnome_init_g_log_handler(const gchar *log_domain,GLogLevelFlags log_level,const gchar *message,gpointer user_data)
 {
        gnome_init_g_log_handler_hit=TRUE;
        g_log_default_handler(log_domain,log_level,message,user_data);
 }
+#endif /* HAVE_GNOME */
 
 int main(int argc,char **argv)
 {
 poptContext context;
 int errint;
 gboolean is_interactive;
+#ifdef HAVE_GNOME
 gboolean no_gnome;
+#endif /* HAVE_GNOME */
 
 #if 0
        g_log_set_always_fatal(~(0
@@ -104,12 +143,20 @@ gboolean no_gnome;
        bindtextdomain(PACKAGE,LOCALEDIR);
        textdomain(PACKAGE);
 
+       /* Read it before the command-line parsing to get the default value
+        * of 'optarg_port' displayable by 'POPT_ARGFLAG_SHOW_DEFAULT'.
+        */
+       configuration_read();
+
        if (argv[1] && !strcmp(argv[1],"--text"))
                optarg_text=1;
 
+#ifdef HAVE_GNOME
        no_gnome=(optarg_text || !getenv("DISPLAY") || !*getenv("DISPLAY"));
 
-       if (no_gnome) {
+       if (no_gnome)
+#endif /* HAVE_GNOME */
+       {
                context=poptGetContext(
                                PACKAGE,        /* name */
                                argc,(/*en-const*/const char **)argv,   /* argc,argv */
@@ -126,15 +173,12 @@ gboolean no_gnome;
                        return EXIT_FAILURE;
                        }
                errint=poptGetNextOpt(context);
-               if (errint!=-1) {
-                       g_assert_not_reached(); /* some non-callbacked argument reached */
-                       return EXIT_FAILURE;
-                       }
-               if (poptPeekArg(context)) {
+               if (errint!=-1)
+                       g_error(_("Specified option not expected"));
+               if (poptPeekArg(context))
                        g_error(_("No arguments expected"));
-                       return EXIT_FAILURE;
-                       }
                }
+#ifdef HAVE_GNOME
        else {
 GnomeProgram *gnome_program;
 guint handler_id;
@@ -154,7 +198,7 @@ guint handler_id;
                                        NULL);
                else {
                        no_gnome=TRUE;
-                       /* No message: (captive-install-acquire:3693): Gtk-WARNING **: cannot open display:
+                       /* No message: (udpgate:3693): Gtk-WARNING **: cannot open display:
                         * was reported, probably only '--help' message was shown.
                         */
                        if (!gnome_init_g_log_handler_hit)
@@ -165,23 +209,31 @@ guint handler_id;
                                "Gtk",  /* log_domain */
                                handler_id);    /* handler_id */
                }
+#endif /* HAVE_GNOME */
 
        is_interactive=(1
-/*                     && ! optarg_scan_path_list
-                       && ! optarg_scan_disks_quick
-                       && ! optarg_scan_disks 
-                       && ! optarg_microsoft_com */ );
+                       && !optarg_start
+                       && !optarg_stop);
 
        /* Initialize UI here to catch all GLog errors below. */
        if (is_interactive
+#ifdef HAVE_GNOME
                        && (no_gnome || !ui_gnome_init())
-/*                     && !ui_line_init()*/)
+#endif /* HAVE_GNOME */
+                       && !ui_line_init())
                g_error(_("No UI interface could be initialized"));
 
-       if (!is_interactive)
-               /*scan_batch()*/;
+       if (!is_interactive) {
+               if (optarg_stop)
+                       network_stop();
+               if (optarg_start)
+                       network_start(optarg_port);
+               network_detach();
+               }
        else
-               ui_gnome_interactive();
+               (*ui_interactive)();
+
+       configuration_write();
 
        return EXIT_SUCCESS;
 }