diff options
| -rw-r--r-- | ChangeLog | 17 | ||||
| -rw-r--r-- | glib/dbus-binding-tool-glib.c | 2 | ||||
| -rw-r--r-- | glib/dbus-glib-tool.c | 119 | ||||
| -rw-r--r-- | test/glib/Makefile.am | 15 | 
4 files changed, 114 insertions, 39 deletions
@@ -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  | 
