3 * Copyright (C) 2004 Jan Kratochvil <project-udpgate@jankratochvil.net>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; exactly version 2 of June 1991 is required
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <glib/gmessages.h>
26 #include <glib/gutils.h>
32 #include <libgnome/gnome-program.h>
33 #include <libgnomeui/gnome-ui-init.h>
36 #include "main.h" /* self */
39 #include "configuration.h"
40 #include "static-startup.h"
42 #include "bundle-util.h"
51 #define LOCAL_PORT_DEFAULT 9201
54 static int optarg_text;
56 int optarg_port=LOCAL_PORT_DEFAULT;
57 static int optarg_start;
58 static int optarg_stop;
60 static int optarg_startup_query;
61 static int optarg_startup_on;
62 static int optarg_startup_off;
64 void (*ui_interactive)(void);
66 static const struct poptOption popt_table[]={
68 #define UDPGATE_POPT(shortname,longname,argInfoP,argP,valP,descripP,argDescripP) \
70 longName: (longname), \
71 shortName: (shortname), \
72 argInfo: (argInfoP)|(!(valP) ? 0 : POPT_ARG_VAL), \
75 descrip: (descripP), \
76 argDescrip: (argDescripP), \
80 #define OPT_TEXT_IF_GNOME N_("Disable Gnome UI; --text must be first argument")
81 #else /* HAVE_GNOME */
82 #define OPT_TEXT_IF_GNOME N_("(no Gnome UI compiled - stub only); --text must be first argument")
83 #endif /* HAVE_GNOME */
84 UDPGATE_POPT(0 ,"text" ,POPT_ARG_NONE ,&optarg_text ,0,
85 OPT_TEXT_IF_GNOME,NULL),
86 #undef OPT_TEXT_IF_GNOME
87 UDPGATE_POPT('v',"verbose" ,POPT_ARG_NONE ,&optarg_verbose ,0,
88 N_("Display additional debug information"),NULL),
89 UDPGATE_POPT('p',"port" ,POPT_ARG_INT |POPT_ARGFLAG_SHOW_DEFAULT,&optarg_port ,0,
90 N_("Listen on this UDP port"),NULL),
91 UDPGATE_POPT('s',"start" ,POPT_ARG_NONE ,&optarg_start ,0,
92 N_("Start the daemon"),NULL),
93 UDPGATE_POPT('S',"stop" ,POPT_ARG_NONE ,&optarg_stop ,0,
94 N_("Stop the daemon"),NULL),
95 UDPGATE_POPT('1',"no-fork" ,POPT_ARG_NONE ,&optarg_no_fork ,0,
96 N_("Do not detach from the current process"),NULL),
97 UDPGATE_POPT(0 ,"startup-query",POPT_ARG_NONE ,&optarg_startup_query,0,
98 N_("Query the current state of the system startup registrance"),NULL),
99 UDPGATE_POPT(0 ,"startup-on" ,POPT_ARG_NONE ,&optarg_startup_on ,0,
100 N_("Register for the automatic system startup"),NULL),
101 UDPGATE_POPT(0 ,"startup-off" ,POPT_ARG_NONE ,&optarg_startup_off ,0,
102 N_("Unregister from the automatic system startup"),NULL),
108 static const struct poptOption popt_table_autohelp[]={
109 { NULL,'\0',POPT_ARG_INCLUDE_TABLE,(struct poptOption *)&popt_table,0,PACKAGE },
116 static jmp_buf gnome_init_atexit_jmpbuf;
117 static gboolean gnome_init_atexit_disable;
119 static void gnome_init_atexit_handler(void)
121 if (gnome_init_atexit_disable)
124 longjmp(gnome_init_atexit_jmpbuf,1);
125 g_assert_not_reached();
129 static gboolean gnome_init_g_log_handler_hit;
130 static void gnome_init_g_log_handler(const gchar *log_domain,GLogLevelFlags log_level,const gchar *message,gpointer user_data)
132 gnome_init_g_log_handler_hit=TRUE;
133 g_log_default_handler(log_domain,log_level,message,user_data);
135 #endif /* HAVE_GNOME */
137 static gchar *localedir;
138 #if defined(ENABLE_BUNDLE) && defined(HAVE_GNOME)
139 static const gchar *fonts_conf_dir;
140 #endif /* defined(ENABLE_BUNDLE) && defined(HAVE_GNOME) */
143 static void bundle_files_write(void)
145 gchar catalogs[]=G_STRINGIFY(CATALOGS);
146 gchar *catalog,*catalog_next;
148 gchar fonts[]=G_STRINGIFY(GNOME_FONTS);
149 gchar *font,*font_next;
150 const gchar *fonts_data_dir,*fonts_conf_file,*fonts_conf_file_content;
151 #endif /* HAVE_GNOME */
152 const gchar *my_tmp_dir;
154 my_tmp_dir=udpgate_printf_alloca("%s/.%s-%s-%d",g_get_tmp_dir(),g_get_user_name(),PACKAGE,(int)getpid());
157 for (catalog=catalogs;*catalog;catalog=catalog_next) {
160 for (catalog_next=catalog;*catalog_next && *catalog_next!=' ';catalog_next++);
162 *catalog_next++='\0';
163 cc=g_strdup(catalog);
164 cc_end=cc+strlen(cc)-strlen(".gmo");
165 if (cc_end>cc && !strcmp(cc_end,".gmo")) {
167 if (!bundle_util_file_write(
168 udpgate_printf_alloca("%s/%s/LC_MESSAGES/%s.mo",LOCALEDIR,cc,PACKAGE), /* pathname */
169 catalog, /* basename */
170 0644, /* pathname_mode */
171 BUNDLE_UTIL_MKDIRS_MASK|BUNDLE_UTIL_TEMPORARY_MASK)) { /* flags */
174 trylocaledir=localedir;
176 trylocaledir=g_strdup_printf("%s/locale",my_tmp_dir);
177 if (bundle_util_file_write(
178 udpgate_printf_alloca("%s/%s/LC_MESSAGES/%s.mo",trylocaledir,cc,PACKAGE), /* pathname */
179 catalog, /* basename */
180 0644, /* pathname_mode */
181 BUNDLE_UTIL_MKDIRS_MASK|BUNDLE_UTIL_TEMPORARY_MASK)) /* flags */
182 localedir=trylocaledir;
184 g_free(trylocaledir);
193 fonts_conf_dir=g_strdup_printf("%s/fonts",my_tmp_dir);
194 fonts_data_dir=udpgate_printf_alloca("%s/fonts-data",my_tmp_dir);
195 fonts_conf_file=udpgate_printf_alloca("%s/fonts.conf",fonts_conf_dir);
197 fonts_conf_file_content=udpgate_printf_alloca("\
198 <?xml version=\"1.0\"?>\n\
199 <!DOCTYPE fontconfig SYSTEM \"fonts.dtd\">\n\
204 bundle_util_file_insert(fonts_conf_file_content,strlen(fonts_conf_file_content),"fonts.conf");
206 if (bundle_util_file_write(
207 fonts_conf_file, /* pathname */
208 "fonts.conf", /* basename */
209 0644, /* pathname_mode */
210 BUNDLE_UTIL_MKDIRS_MASK|BUNDLE_UTIL_TEMPORARY_MASK)) { /* flags */
211 for (font=fonts;*font;font=font_next) {
212 for (font_next=font;*font_next && *font_next!=' ';font_next++);
217 bundle_util_file_write(
218 udpgate_printf_alloca("%s/%s",fonts_data_dir,font), /* pathname */
220 0644, /* pathname_mode */
221 BUNDLE_UTIL_MKDIRS_MASK|BUNDLE_UTIL_TEMPORARY_MASK); /* flags */
224 #endif /* HAVE_GNOME */
226 #endif /* ENABLE_BUNDLE */
228 int main(int argc,char **argv)
232 gboolean is_interactive;
235 #endif /* HAVE_GNOME */
236 int exit_rc=EXIT_SUCCESS;
239 bundle_files_write();
242 /* Prevent fontconfig loading: /etc/fonts/fonts.conf */
243 /* 'fonts_conf_dir' is created by: bundle_files_write() */
244 setenv("FONTCONFIG_PATH",fonts_conf_dir,
246 #endif /* HAVE_GNOME */
247 #endif /* ENABLE_BUNDLE */
250 g_log_set_always_fatal(~(0
255 setenv("GNOME_DISABLE_CRASH_DIALOG","1",1); /* HAVE_GNOME */
258 /* Initialize the i18n stuff */
259 setlocale(LC_ALL,"");
262 bindtextdomain(PACKAGE,localedir);
265 /* Read it before the command-line parsing to get the default value
266 * of 'optarg_port' displayable by 'POPT_ARGFLAG_SHOW_DEFAULT'.
268 configuration_read();
270 if (argv[1] && !strcmp(argv[1],"--text"))
274 no_gnome=(optarg_text || !getenv("DISPLAY") || !*getenv("DISPLAY"));
277 #endif /* HAVE_GNOME */
279 context=poptGetContext(
281 argc,(/*en-const*/const char **)argv, /* argc,argv */
282 popt_table_autohelp, /* options */
283 POPT_CONTEXT_POSIXMEHARDER); /* flags; && !POPT_CONTEXT_KEEP_FIRST */
285 g_assert_not_reached(); /* argument recognization args_error */
288 errint=poptReadDefaultConfig(context,
291 g_assert_not_reached(); /* argument recognization args_error */
294 errint=poptGetNextOpt(context);
296 g_error(_("Specified option not expected"));
297 if (poptPeekArg(context))
298 g_error(_("No arguments expected"));
302 GnomeProgram *gnome_program;
305 gnome_init_atexit_disable=FALSE;
306 g_atexit(gnome_init_atexit_handler);
307 gnome_init_g_log_handler_hit=FALSE;
308 handler_id=g_log_set_handler(
309 "Gtk", /* log_domain */
310 G_LOG_LEVEL_WARNING, /* log_levels */
311 gnome_init_g_log_handler, /* log_func */
312 NULL); /* user_data */
313 if (!setjmp(gnome_init_atexit_jmpbuf))
314 gnome_program=gnome_program_init(PACKAGE,VERSION,LIBGNOMEUI_MODULE,argc,argv,
315 GNOME_PARAM_POPT_TABLE,popt_table,
316 GNOME_PARAM_POPT_FLAGS,(int)POPT_CONTEXT_POSIXMEHARDER,
320 /* No message: (udpgate:3693): Gtk-WARNING **: cannot open display:
321 * was reported, probably only '--help' message was shown.
323 if (!gnome_init_g_log_handler_hit)
326 gnome_init_atexit_disable=TRUE;
327 g_log_remove_handler(
328 "Gtk", /* log_domain */
329 handler_id); /* handler_id */
331 #endif /* HAVE_GNOME */
333 configuration_write();
338 && !optarg_startup_query
339 && !optarg_startup_on
340 && !optarg_startup_off);
342 /* Initialize UI here to catch all GLog errors below. */
345 && (no_gnome || !ui_gnome_init())
346 #endif /* HAVE_GNOME */
348 g_error(_("No UI interface could be initialized"));
350 if (!is_interactive) {
355 if (optarg_startup_query) {
358 if (static_startup_query(&is_on)) {
360 ? _("System startup registrance is turned on.")
361 : _("System startup registrance is turned off.")));
363 exit_rc=(is_on ? 0 : 1);
368 if (optarg_startup_off) {
369 if (!static_startup_off())
372 if (optarg_startup_on) {
373 if (!static_startup_on())
377 if (!network_start(optarg_port))
385 configuration_write();