2003-03-25 Havoc Pennington <hp@redhat.com>
authorHavoc Pennington <hp@redhat.com>
Wed, 26 Mar 2003 03:58:11 +0000 (03:58 +0000)
committerHavoc Pennington <hp@redhat.com>
Wed, 26 Mar 2003 03:58:11 +0000 (03:58 +0000)
        * throughout - add more _DBUS_ASSERT_ERROR_IS_CLEAR

* configure.in: add --with-xml option to specify XML library,
right now only libxml is supported.

* bus/config-loader-libxml.c, config-parser.c: sync some minor
nonworking code between home and work, still just stubs

15 files changed:
ChangeLog
bus/Makefile.am
bus/activation.c
bus/bus.c
bus/config-loader-libxml.c [new file with mode: 0644]
bus/config-parser.c
bus/config-parser.h
bus/connection.c
bus/desktop-file.c
bus/dispatch.c
bus/driver.c
bus/services.c
bus/test-main.c
bus/test.h
configure.in

index 03e5b1d..a789b2f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2003-03-25  Havoc Pennington  <hp@redhat.com>
+
+        * throughout - add more _DBUS_ASSERT_ERROR_IS_CLEAR
+       
+       * configure.in: add --with-xml option to specify XML library,
+       right now only libxml is supported.
+
+       * bus/config-loader-libxml.c, config-parser.c: sync some minor 
+       nonworking code between home and work, still just stubs
+
 2003-03-24  Havoc Pennington  <hp@redhat.com>
 
        * dbus/dbus-sysdeps.c (_dbus_set_fd_nonblocking): move to this
index bc64032..37d3de0 100644 (file)
@@ -6,11 +6,17 @@ EFENCE=
 
 bin_PROGRAMS=dbus-daemon-1
 
+if DBUS_USE_LIBXML
+XML_SOURCES=config-loader-libxml.c
+endif
+
 BUS_SOURCES=                                   \
        activation.c                            \
        activation.h                            \
        bus.c                                   \
        bus.h                                   \
+       config-parser.c                         \
+       config-parser.h                         \
        connection.c                            \
        connection.h                            \
        desktop-file.c                          \
@@ -28,7 +34,8 @@ BUS_SOURCES=                                  \
        test.c                                  \
        test.h                                  \
        utils.c                                 \
-       utils.h
+       utils.h                                 \
+       $(XML_SOURCES)
 
 dbus_daemon_1_SOURCES=                         \
        $(BUS_SOURCES)                          \
@@ -57,7 +64,7 @@ bus_test_SOURCES=                             \
        $(BUS_SOURCES)                          \
        test-main.c
 
-bus_test_LDADD=$(top_builddir)/dbus/libdbus-convenience.la
+bus_test_LDADD=$(top_builddir)/dbus/libdbus-convenience.la $(DBUS_BUS_LIBS)
 
 ## mop up the gcov files
 clean-local:
index fed1278..03a0193 100644 (file)
@@ -119,6 +119,8 @@ add_desktop_file_entry (BusActivation  *activation,
   char *name, *exec;
   BusActivationEntry *entry;
 
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+  
   name = NULL;
   exec = NULL;
   entry = NULL;
@@ -194,6 +196,8 @@ load_directory (BusActivation *activation,
   DBusString full_path;
   BusDesktopFile *desktop_file;
   DBusError tmp_error;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   _dbus_string_init_const (&dir, directory);
 
@@ -327,6 +331,8 @@ bus_activation_new (BusContext  *context,
   int i;
   BusActivation *activation;
 
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+  
   activation = dbus_new0 (BusActivation, 1);
   if (activation == NULL)
     {
@@ -424,6 +430,8 @@ bus_activation_service_created (BusActivation *activation,
   BusPendingActivation *pending_activation;
   DBusMessage *message;
   DBusList *link;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   /* Check if it's a pending activation */
   pending_activation = _dbus_hash_table_lookup_string (activation->pending_activations, service_name);
@@ -492,6 +500,8 @@ bus_activation_activate_service (BusActivation  *activation,
   DBusString service_str;
   char *argv[2];
   dbus_bool_t retval;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   entry = _dbus_hash_table_lookup_string (activation->entries, service_name);
 
index 468d820..1a619b4 100644 (file)
--- a/bus/bus.c
+++ b/bus/bus.c
@@ -143,6 +143,8 @@ bus_context_new (const char  *address,
                  DBusError   *error)
 {
   BusContext *context;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   context = dbus_new0 (BusContext, 1);
   if (context == NULL)
diff --git a/bus/config-loader-libxml.c b/bus/config-loader-libxml.c
new file mode 100644 (file)
index 0000000..3bfc97f
--- /dev/null
@@ -0,0 +1,105 @@
+/* -*- mode: C; c-file-style: "gnu" -*- */
+/* config-loader-libxml.c  libxml2 XML loader
+ *
+ * Copyright (C) 2003 Red Hat, Inc.
+ *
+ * Licensed under the Academic Free License version 1.2
+ * 
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include "config-parser.h"
+#include <dbus/dbus-internals.h>
+#include <libxml/xmlreader.h>
+#include <libxml/parser.h>
+#include <libxml/globals.h>
+#include <errno.h>
+#include <string.h>
+
+static void
+xml_text_reader_error (void                   *arg,
+                       const char             *msg,
+                       xmlParserSeverities     severity,
+                       xmlTextReaderLocatorPtr locator)
+{
+  DBusError *error = arg;
+  
+  if (!dbus_error_is_set (error))
+    {
+      dbus_set_error (error, DBUS_ERROR_FAILED,
+                      "Error loading config file: %s",
+                      msg);
+    }
+}
+
+BusConfigParser*
+bus_config_load (const DBusString *file,
+                 DBusError        *error)
+{
+  xmlTextReader *reader;
+  const char *filename;
+  BusConfigParser *parser;
+  DBusError tmp_error;
+  
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+  
+  _dbus_string_get_const_data (file, &filename);
+  
+  errno = 0;
+  reader = xmlNewTextReaderFilename (filename);
+
+  if (reader == NULL)
+    {
+      dbus_set_error (error, DBUS_ERROR_FAILED,
+                      "Failed to load configuration file %s: %s\n",
+                      filename,
+                      errno != 0 ? strerror (errno) : "Unknown error");
+        
+      return NULL;
+    }
+
+  dbus_error_init (&tmp_error);
+  xmlTextReaderSetErrorHandler (reader, xml_text_reader_error, &tmp_error);
+
+  while (xmlTextReaderRead(reader) == 1)
+    {
+      if (dbus_error_is_set (&tmp_error))
+        goto reader_out;
+
+      
+
+
+    }
+  
+ reader_out:
+  xmlFreeTextReader (reader);
+  if (dbus_error_is_set (&tmp_error))
+    {
+      dbus_move_error (&tmp_error, error);
+      goto failed;
+    }
+  
+  if (!bus_config_parser_finished (parser, error))
+    goto failed;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+  return parser;
+  
+ failed:
+  _DBUS_ASSERT_ERROR_IS_SET (error);
+  bus_config_parser_unref (parser);
+  return NULL;
+}
index 26e52a8..0d33d2b 100644 (file)
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  */
-
 #include "config-parser.h"
+#include "test.h"
+#include <dbus/dbus-list.h>
+#include <dbus/dbus-internals.h>
 #include <string.h>
 
 typedef enum
@@ -82,9 +84,37 @@ struct BusConfigParser
 {
   int refcount;
 
-  DBusList *stack;
+  DBusList *stack; /**< stack of Element */
+
+  char *user;      /**< user to run as */
 };
 
+
+static Element*
+push_element (BusConfigParser *parser,
+              ElementType      type)
+{
+  Element *e;
+
+  e = dbus_new0 (Element, 1);
+  if (e == NULL)
+    return NULL;
+  
+  e->type = type;
+
+  return e;
+}
+
+static void
+pop_element (BusConfigParser *parser)
+{
+  Element *e;
+
+  e = _dbus_list_pop_last (&parser->stack);
+
+  dbus_free (e);
+}
+
 BusConfigParser*
 bus_config_parser_new (void)
 {
@@ -116,7 +146,10 @@ bus_config_parser_unref (BusConfigParser *parser)
 
   if (parser->refcount == 0)
     {
-
+      while (parser->stack != NULL)
+        pop_element (parser);
+      
+      dbus_free (parser->user);
 
       dbus_free (parser);
     }
@@ -127,6 +160,8 @@ bus_config_parser_check_doctype (BusConfigParser   *parser,
                                  const char        *doctype,
                                  DBusError         *error)
 {
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+  
   if (strcmp (doctype, "busconfig") != 0)
     {
       dbus_set_error (error,
@@ -146,7 +181,7 @@ bus_config_parser_start_element (BusConfigParser   *parser,
                                  const char       **attribute_values,
                                  DBusError         *error)
 {
-  
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);  
 
 }
 
@@ -155,7 +190,7 @@ bus_config_parser_end_element (BusConfigParser   *parser,
                                const char        *element_name,
                                DBusError         *error)
 {
-  
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
 
 }
 
@@ -164,7 +199,33 @@ bus_config_parser_content (BusConfigParser   *parser,
                            const DBusString  *content,
                            DBusError         *error)
 {
-  
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+
+}
+
+dbus_bool_t
+bus_config_parser_finished (BusConfigParser   *parser,
+                            DBusError         *error)
+{
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);  
+
+}
+
+const char*
+bus_config_parser_get_user (BusConfigParser *parser)
+{
+
 
 }
 
+#ifdef DBUS_BUILD_TESTS
+
+dbus_bool_t
+bus_config_parser_test (const DBusString *test_data_dir)
+{
+  
+  return TRUE;
+}
+
+#endif /* DBUS_BUILD_TESTS */
+
index 371a658..2fa651a 100644 (file)
@@ -50,6 +50,18 @@ dbus_bool_t      bus_config_parser_end_element   (BusConfigParser   *parser,
 dbus_bool_t      bus_config_parser_content       (BusConfigParser   *parser,
                                                   const DBusString  *content,
                                                   DBusError         *error);
+dbus_bool_t      bus_config_parser_finished      (BusConfigParser   *parser,
+                                                  DBusError         *error);
+
+/* Functions for extracting the parse results */
+const char*      bus_config_parser_get_user      (BusConfigParser   *parser);
+
+
+/* Loader functions (backended off one of the XML parsers).  Returns a
+ * finished ConfigParser.
+ */
+BusConfigParser* bus_config_load (const DBusString *file,
+                                  DBusError        *error);
 
 
 #endif /* BUS_CONFIG_PARSER_H */
index 4cb98f6..ee7d183 100644 (file)
@@ -1023,7 +1023,7 @@ bus_transaction_send_error_reply (BusTransaction  *transaction,
                                   DBusMessage     *in_reply_to)
 {
   DBusMessage *reply;
-
+  
   _dbus_assert (error != NULL);
   _DBUS_ASSERT_ERROR_IS_SET (error);
   
index f45a997..13b709d 100644 (file)
@@ -180,6 +180,8 @@ unescape_string (BusDesktopFileParser *parser,
                  DBusError            *error)
 {
   char *retval, *q;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   /* len + 1 is enough, because unescaping never makes the
    * string longer
@@ -389,6 +391,8 @@ parse_section_start (BusDesktopFileParser *parser, DBusError *error)
 {
   int line_end;
   char *section_name;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   if (!_dbus_string_find (&parser->data, parser->pos, "\n", &line_end))
     line_end = parser->len;
@@ -447,6 +451,8 @@ parse_key_value (BusDesktopFileParser *parser, DBusError *error)
   char *value, *tmp;
   DBusString key;
   BusDesktopFileLine *line;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   if (!_dbus_string_find (&parser->data, parser->pos, "\n", &line_end))
     line_end = parser->len;
@@ -549,7 +555,9 @@ report_error (BusDesktopFileParser *parser,
              DBusError            *error)
 {
   const char *section_name = NULL;
-    
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+  
   if (parser->current_section != -1)
     section_name = parser->desktop_file->sections[parser->current_section].section_name;
 
@@ -589,6 +597,8 @@ bus_desktop_file_load (DBusString *filename,
   DBusString str;
   BusDesktopFileParser parser;
   DBusStat sb;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   /* Clearly there's a race here, but it's just to make it unlikely
    * that we do something silly, we still handle doing it below.
index 490ecf2..7db4ac2 100644 (file)
@@ -70,6 +70,8 @@ bus_dispatch_broadcast_message (BusTransaction *transaction,
   DBusError tmp_error;
   SendMessageData d;
   BusConnections *connections;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   _dbus_assert (dbus_message_get_sender (message) != NULL);
 
@@ -101,7 +103,9 @@ send_service_nonexistent_error (BusTransaction *transaction,
   DBusMessage *error_reply;
   DBusString error_message;
   const char *error_str;
-         
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+  
   /* Trying to send a message to a non-existant service,
    * bounce back an error message.
    */
index 98085fc..4946fd6 100644 (file)
@@ -43,6 +43,8 @@ bus_driver_send_service_deleted (const char     *service_name,
 {
   DBusMessage *message;
   dbus_bool_t retval;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   _dbus_verbose ("sending service deleted: %s\n", service_name);
 
@@ -77,6 +79,8 @@ bus_driver_send_service_created (const char     *service_name,
 {
   DBusMessage *message;
   dbus_bool_t retval;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   message = dbus_message_new (DBUS_SERVICE_BROADCAST,
                               DBUS_MESSAGE_SERVICE_CREATED);
@@ -116,6 +120,8 @@ bus_driver_send_service_lost (DBusConnection *connection,
 {
   DBusMessage *message;
 
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+  
   message = dbus_message_new (bus_connection_get_name (connection),
                               DBUS_MESSAGE_SERVICE_LOST);
   if (message == NULL)
@@ -161,6 +167,8 @@ bus_driver_send_service_acquired (DBusConnection *connection,
 {
   DBusMessage *message;
 
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+  
   message = dbus_message_new (bus_connection_get_name (connection),
                               DBUS_MESSAGE_SERVICE_ACQUIRED);
   if (message == NULL)
@@ -267,6 +275,8 @@ bus_driver_handle_hello (DBusConnection *connection,
   BusService *service;
   dbus_bool_t retval;
   BusRegistry *registry;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   if (!_dbus_string_init (&unique_name, _DBUS_INT_MAX))
     {
@@ -323,6 +333,8 @@ bus_driver_send_welcome_message (DBusConnection *connection,
 {
   DBusMessage *welcome;
   const char *name;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   name = bus_connection_get_name (connection);
   _dbus_assert (name != NULL);
@@ -373,6 +385,8 @@ bus_driver_handle_list_services (DBusConnection *connection,
   int len;
   char **services;
   BusRegistry *registry;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   registry = bus_connection_get_registry (connection);
   
@@ -431,6 +445,8 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
   DBusConnection *old_owner;
   DBusConnection *current_owner;
   BusRegistry *registry;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   registry = bus_connection_get_registry (connection);
   
@@ -554,6 +570,8 @@ bus_driver_handle_service_exists (DBusConnection *connection,
   char *name;
   dbus_bool_t retval;
   BusRegistry *registry;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   registry = bus_connection_get_registry (connection);
   
@@ -615,6 +633,8 @@ bus_driver_handle_activate_service (DBusConnection *connection,
   dbus_bool_t retval;
   BusActivation *activation;
 
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+  
   activation = bus_connection_get_activation (connection);
   
   if (!dbus_message_get_args (message, error,
@@ -662,6 +682,8 @@ bus_driver_handle_message (DBusConnection *connection,
 {
   const char *name, *sender;
   int i;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   _dbus_verbose ("Driver got a message: %s\n",
                 dbus_message_get_name (message));
index 821cb4a..d3ab1e5 100644 (file)
@@ -128,6 +128,8 @@ bus_registry_ensure (BusRegistry               *registry,
   const char *c_name;
   BusService *service;
 
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+  
   _dbus_assert (owner_if_created != NULL);
   _dbus_assert (transaction != NULL);
   
@@ -260,6 +262,8 @@ bus_service_add_owner (BusService     *service,
                        BusTransaction *transaction,
                        DBusError      *error)
 {
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+  
  /* Send service acquired message first, OOM will result
   * in cancelling the transaction
   */
@@ -292,6 +296,8 @@ bus_service_remove_owner (BusService     *service,
                           BusTransaction *transaction,
                           DBusError      *error)
 {
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+  
   /* We send out notifications before we do any work we
    * might have to undo if the notification-sending failed
    */
index 2e0b952..c7f9f7b 100644 (file)
@@ -51,11 +51,19 @@ main (int argc, char **argv)
     dir = "";
 
   _dbus_string_init_const (&test_data_dir, dir);
+  
+  printf ("%s: Running config file parser test\n", argv[0]);
+  if (!bus_config_parser_test (&test_data_dir))
+    die ("parser");
 
+  printf ("%s: Running policy test\n", argv[0]);
+  if (!bus_policy_test (&test_data_dir))
+    die ("policy");
+  
   printf ("%s: Running message dispatch test\n", argv[0]);
   if (!bus_dispatch_test (&test_data_dir))
     die ("dispatch");
-
+  
   dbus_shutdown ();
   
   printf ("%s: checking for memleaks\n", argv[0]);
index e39ef29..583a311 100644 (file)
@@ -34,6 +34,7 @@
 
 dbus_bool_t bus_dispatch_test        (const DBusString             *test_data_dir);
 dbus_bool_t bus_policy_test          (const DBusString             *test_data_dir);
+dbus_bool_t bus_config_parser_test   (const DBusString             *test_data_dir);
 dbus_bool_t bus_setup_debug_client   (DBusConnection               *connection);
 void        bus_test_clients_foreach (BusConnectionForeachFunction  function,
                                       void                         *data);
index 4055773..552a7cf 100644 (file)
@@ -31,6 +31,8 @@ AC_ARG_ENABLE(verbose-mode, [  --enable-verbose-mode support verbose debug mode]
 AC_ARG_ENABLE(asserts, [  --enable-asserts include assertion checks],enable_asserts=$enableval,enable_asserts=yes)
 AC_ARG_ENABLE(gcov, [  --enable-gcov compile with coverage profiling instrumentation (gcc only)],enable_gcov=$enableval,enable_gcov=no)
 
+AC_ARG_WITH(xml, [  --with-xml=[libxml] XML library to use])
+
 dnl DBUS_BUILD_TESTS controls unit tests built in to .c files 
 dnl and also some stuff in the test/ subdir
 AM_CONDITIONAL(DBUS_BUILD_TESTS, test x$enable_tests = xyes)
@@ -45,6 +47,23 @@ if test x$enable_asserts = xno; then
     AC_DEFINE(DBUS_DISABLE_ASSERT,1,[Disable assertion checking])
 fi
 
+dbus_use_libxml=false
+dbus_use_fooxml=false
+if test x$with_xml = xfooxml; then
+        dbus_use_fooxml=true
+elif test x$with_xml = xlibxml; then
+        dbus_use_libxml=true
+else
+        with_xml=libxml
+        dbus_use_libxml=true   
+fi
+
+AM_CONDITIONAL(DBUS_USE_LIBXML, $dbus_use_libxml)
+if $dbus_use_libxml; then
+       PKG_CHECK_MODULES(LIBXML, libxml-2.0)
+fi
+AM_CONDITIONAL(DBUS_USE_FOOXML, $dbus_use_fooxml)
+
 if test "x$GCC" = "xyes"; then
   changequote(,)dnl
   case " $CFLAGS " in
@@ -224,8 +243,8 @@ DBUS_CLIENT_LIBS=
 AC_SUBST(DBUS_CLIENT_CFLAGS)
 AC_SUBST(DBUS_CLIENT_LIBS)
 
-DBUS_BUS_CFLAGS=
-DBUS_BUS_LIBS=
+DBUS_BUS_CFLAGS=$LIBXML_CFLAGS
+DBUS_BUS_LIBS=$LIBXML_LIBS
 AC_SUBST(DBUS_BUS_CFLAGS)
 AC_SUBST(DBUS_BUS_LIBS)
 
@@ -329,6 +348,7 @@ echo "
         Building assertions:    ${enable_asserts}
         Building Qt bindings:   ${have_qt}
         Building GLib bindings: ${have_glib}
+        Using XML parser:       ${with_xml}
 "
 
 if test x$enable_tests = xyes; then