summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2005-02-19 23:25:41 +0000
committerColin Walters <walters@verbum.org>2005-02-19 23:25:41 +0000
commit4c3d2abe274dc970d65688137fbd3151d53d3f7c (patch)
tree5bb6862251f14d2265c64fcdcfaa33849bdc3e6a
parent4ec87547cbf54470c1e3d847e8c4900d70527427 (diff)
2005-02-19 Colin Walters <walters@verbum.org>
* glib/dbus-binding-tool-glib.c (dbus_binding_tool_output_glib_server): Fix iochannel refcounting. * glib/dbus-glib-tool.c: Include dbus-glib-tool.h, as well as errno.h and sys/stat.h. (lose): New function, prints error with newline and exits. (lose_gerror): Similar, but takes GError for message. (main): Add --output argument to specify output file to write to, instead of always printing to stdout. In this mode, determine timestamps on source files to see whether any are newer than the target file. If not, exit. Also convert a number of error messages to use lose (since it's shorter), and switch to using g_io_channel_shutdown.
-rw-r--r--ChangeLog17
-rw-r--r--glib/dbus-binding-tool-glib.c2
-rw-r--r--glib/dbus-glib-tool.c119
-rw-r--r--test/glib/Makefile.am15
4 files changed, 114 insertions, 39 deletions
diff --git a/ChangeLog b/ChangeLog
index e8a8861f..fe3e7763 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2005-02-19 Colin Walters <walters@verbum.org>
+
+ * glib/dbus-binding-tool-glib.c
+ (dbus_binding_tool_output_glib_server): Fix iochannel refcounting.
+
+ * glib/dbus-glib-tool.c: Include dbus-glib-tool.h, as well
+ as errno.h and sys/stat.h.
+ (lose): New function, prints error with
+ newline and exits.
+ (lose_gerror): Similar, but takes GError for message.
+ (main): Add --output argument to specify output file to write to,
+ instead of always printing to stdout. In this mode, determine
+ timestamps on source files to see whether any are newer than the
+ target file. If not, exit. Also convert a number of error
+ messages to use lose (since it's shorter), and switch to using
+ g_io_channel_shutdown.
+
2005-02-19 Havoc Pennington <hp@redhat.com>
* glib/dbus-gobject.c
diff --git a/glib/dbus-binding-tool-glib.c b/glib/dbus-binding-tool-glib.c
index 4ead51a3..94823cb1 100644
--- a/glib/dbus-binding-tool-glib.c
+++ b/glib/dbus-binding-tool-glib.c
@@ -527,8 +527,8 @@ dbus_binding_tool_output_glib_server (BaseInfo *info, GIOChannel *channel, GErro
WRITE_OR_LOSE ("#include <dbus/dbus-glib.h>\n");
- g_io_channel_ref (data.channel);
data.channel = channel;
+ g_io_channel_ref (data.channel);
if (!generate_glue (info, &data, error))
goto io_lose;
diff --git a/glib/dbus-glib-tool.c b/glib/dbus-glib-tool.c
index 1359ba53..b057c5ae 100644
--- a/glib/dbus-glib-tool.c
+++ b/glib/dbus-glib-tool.c
@@ -25,6 +25,7 @@
#include "dbus-gidl.h"
#include "dbus-gparser.h"
#include "dbus-gutils.h"
+#include "dbus-glib-tool.h"
#include "dbus-binding-tool-glib.h"
#include <locale.h>
#include <libintl.h>
@@ -32,6 +33,8 @@
#define N_(x) x
#include <stdio.h>
#include <stdlib.h>
+#include <errno.h>
+#include <sys/stat.h>
#include <string.h>
#ifdef DBUS_BUILD_TESTS
@@ -215,6 +218,30 @@ dbus_binding_tool_error_quark (void)
return quark;
}
+static void lose (const char *fmt, ...) G_GNUC_NORETURN G_GNUC_PRINTF (1, 2);
+static void lose_gerror (const char *prefix, GError *error) G_GNUC_NORETURN;
+
+static void
+lose (const char *str, ...)
+{
+ va_list args;
+
+ va_start (args, str);
+
+ vfprintf (stderr, str, args);
+ fputc ('\n', stderr);
+
+ va_end (args);
+
+ exit (1);
+}
+
+static void
+lose_gerror (const char *prefix, GError *error)
+{
+ lose ("%s: %s", prefix, error->message);
+}
+
static void
usage (int ecode)
{
@@ -237,6 +264,8 @@ int
main (int argc, char **argv)
{
const char *prev_arg;
+ const char *output_file;
+ char *output_file_tmp;
int i;
GSList *files;
DBusBindingOutputMode outputmode;
@@ -244,6 +273,10 @@ main (int argc, char **argv)
GSList *tmp;
GIOChannel *channel;
GError *error;
+ time_t newest_src;
+ struct stat srcbuf;
+ struct stat targetbuf;
+ gboolean force;
setlocale (LC_ALL, "");
bindtextdomain (GETTEXT_PACKAGE, DBUS_LOCALEDIR);
@@ -256,6 +289,8 @@ main (int argc, char **argv)
end_of_args = FALSE;
files = NULL;
prev_arg = NULL;
+ output_file = NULL;
+ force = FALSE;
i = 1;
while (i < argc)
{
@@ -269,6 +304,8 @@ main (int argc, char **argv)
usage (0);
else if (strcmp (arg, "--version") == 0)
version ();
+ else if (strcmp (arg, "--force") == 0)
+ force = TRUE;
#ifdef DBUS_BUILD_TESTS
else if (strcmp (arg, "--self-test") == 0)
run_all_tests (NULL);
@@ -285,6 +322,10 @@ main (int argc, char **argv)
else
usage (1);
}
+ else if (strncmp (arg, "--output=", 9) == 0)
+ {
+ output_file = arg + 9;
+ }
else if (arg[0] == '-' &&
arg[1] == '-' &&
arg[2] == '\0')
@@ -307,18 +348,45 @@ main (int argc, char **argv)
}
error = NULL;
- channel = g_io_channel_unix_new (fileno (stdout));
- if (!g_io_channel_set_encoding (channel, NULL, &error))
+
+ files = g_slist_reverse (files);
+
+ if (output_file && !force)
{
- fprintf (stderr, _("Couldn't set channel encoding to NULL: %s\n"),
- error->message);
- exit (1);
+ newest_src = 0;
+ for (tmp = files; tmp != NULL; tmp = tmp->next)
+ {
+ const char *filename;
+
+ filename = tmp->data;
+ if (stat (filename, &srcbuf) < 0)
+ lose ("Couldn't stat %s: %s", filename, g_strerror (errno));
+
+ if (srcbuf.st_mtime > newest_src)
+ newest_src = srcbuf.st_mtime;
+ }
+
+ if (stat (output_file, &targetbuf) > 0
+ && targetbuf.st_mtime >= newest_src)
+ exit (0);
}
+
+ if (output_file)
+ {
+ output_file_tmp = g_strconcat (output_file, ".tmp", NULL);
- files = g_slist_reverse (files);
+ if (!(channel = g_io_channel_new_file (output_file_tmp, "w", &error)))
+ lose_gerror (_("Couldn't open temporary file"), error);
+ }
+ else
+ {
+ channel = g_io_channel_unix_new (fileno (stdout));
+ }
+ if (!g_io_channel_set_encoding (channel, NULL, &error))
+ lose_gerror (_("Couldn't set channel encoding to NULL"), error);
- tmp = files;
- while (tmp != NULL)
+
+ for (tmp = files; tmp != NULL; tmp = tmp->next)
{
NodeInfo *node;
GError *error;
@@ -331,11 +399,7 @@ main (int argc, char **argv)
&error);
if (node == NULL)
{
- g_assert (error != NULL);
- fprintf (stderr, _("Unable to load \"%s\": %s\n"),
- filename, error->message);
- g_error_free (error);
- exit (1);
+ lose_gerror (_("Unable to load \"%s\""), error);
}
else
{
@@ -346,17 +410,11 @@ main (int argc, char **argv)
break;
case DBUS_BINDING_OUTPUT_GLIB_SERVER:
if (!dbus_binding_tool_output_glib_server ((BaseInfo *) node, channel, &error))
- {
- g_error (_("Compilation failed: %s\n"), error->message);
- exit (1);
- }
+ lose_gerror (_("Compilation failed"), error);
break;
case DBUS_BINDING_OUTPUT_GLIB_CLIENT:
if (!dbus_binding_tool_output_glib_client ((BaseInfo *) node, channel, &error))
- {
- g_error (_("Compilation failed: %s\n"), error->message);
- exit (1);
- }
+ lose_gerror (_("Compilation failed"), error);
break;
case DBUS_BINDING_OUTPUT_NONE:
break;
@@ -365,16 +423,20 @@ main (int argc, char **argv)
if (node)
node_info_unref (node);
-
- tmp = tmp->next;
}
- if (!g_io_channel_flush (channel, &error))
+ if (g_io_channel_shutdown (channel, TRUE, &error) != G_IO_STATUS_NORMAL)
+ lose_gerror (_("Failed to shutdown IO channel"), error);
+ g_io_channel_unref (channel);
+
+ if (output_file)
{
- g_error (_("Failed to flush IO channel: %s"), error->message);
- exit (1);
+ if (rename (output_file_tmp, output_file) < 0)
+ lose ("Failed to rename %s to %s: %s", output_file_tmp, output_file,
+ g_strerror (errno));
+ g_free (output_file_tmp);
}
-
+
return 0;
}
@@ -383,8 +445,7 @@ main (int argc, char **argv)
static void
test_die (const char *failure)
{
- fprintf (stderr, "Unit test failed: %s\n", failure);
- exit (1);
+ lose ("Unit test failed: %s", failure);
}
/**
diff --git a/test/glib/Makefile.am b/test/glib/Makefile.am
index 0a246252..7c4ee2ab 100644
--- a/test/glib/Makefile.am
+++ b/test/glib/Makefile.am
@@ -40,20 +40,17 @@ test_dbus_glib_SOURCES= \
test_dbus_glib_LDADD= $(top_builddir)/glib/libdbus-glib-1.la
test_service_glib_SOURCES= \
- test-service-glib.c \
- test-service-glib-glue.h
+ test-service-glib.c
BUILT_SOURCES = test-service-glib-glue.h test-service-glib-bindings.h
-test-service-glib-glue.h: $(top_builddir)/glib/dbus-binding-tool test-service-glib.xml
- $(top_builddir)/glib/dbus-binding-tool --mode=glib-server $(srcdir)/test-service-glib.xml > test-service-glib-glue.h.tmp
- mv test-service-glib-glue.h.tmp test-service-glib-glue.h
+test-service-glib-glue.h: test-service-glib.xml
+ $(top_builddir)/glib/dbus-binding-tool --mode=glib-server --output=test-service-glib-glue.h test-service-glib.xml
-test-service-glib-bindings.h: $(top_builddir)/glib/dbus-binding-tool test-service-glib.xml
- $(top_builddir)/glib/dbus-binding-tool --mode=glib-client $(srcdir)/test-service-glib.xml > test-service-glib-bindings.h.tmp
- mv test-service-glib-bindings.h.tmp test-service-glib-bindings.h
+test-service-glib-bindings.h: test-service-glib.xml
+ $(top_builddir)/glib/dbus-binding-tool --mode=glib-client --output=test-service-glib-bindings.h test-service-glib.xml
-CLEANFILES = test-service-glib-glue.h test-service-glib-glue.h.tmp test-service-glib-bindings.h test-service-glib-bindings.h.tmp
+CLEANFILES = test-service-glib-glue.h test-service-glib-bindings.h
test_service_glib_LDADD= $(top_builddir)/glib/libdbus-glib-1.la