[SSSD] [PATCH] Cherry-pick Stef's sbus_codegen to sssd-1-11

Jakub Hrozek jhrozek at redhat.com
Mon Jun 2 15:35:29 UTC 2014


Hi,

attached are cherry-picked patches that implement Stef's sbus_codegen.

Only the first patch in the series had to be rebased in a very trivial
way:

diff --cc Makefile.am
index 8d92326,d7e6243..0000000
--- a/Makefile.am
+++ b/Makefile.am
@@@ -133,7 -141,9 +133,13 @@@ if HAVE_CHEC
          debug-tests \
          ipa_hbac-tests \
          sss_idmap-tests \
++<<<<<<< HEAD
 +        responder_socket_access-tests
++=======
+         responder_socket_access-tests \
+         safe-format-tests \
+         sbus_codegen_tests
++>>>>>>> b699c4d... sbus: Add meta data structures and code generator
  
  if BUILD_SSH
      non_interactive_check_based_tests += sysdb_ssh-tests

For the reviewer's convenience I left the Conflicts: messages in the commit
header so it's clearly visible which part of the patch had to be amended.
-------------- next part --------------
>From 6721ab63fc8ed4a9612d83e9ab21c336c1c98df4 Mon Sep 17 00:00:00 2001
From: Stef Walter <stefw at redhat.com>
Date: Thu, 9 Jan 2014 23:04:45 +0100
Subject: [PATCH 1/6] sbus: Add meta data structures and code generator
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

These metadata structures hold the information about all the
details of a DBus interface. They are typically generated from
the canonical XML form of the DBus interface, although they
may also be hand crafted.

Add some handy functions for looking up methods, props, signals,
in the metadata of an interface. Currently lookups are just done
by looking through an array. If performance becomes an issue (ie:
very large interfaces) it would be really easy to sort things
and use bsearch().

Later commits will include some definitions using this metadata
and related functions.

DBus interfaces are defined here:

http://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format

The introspection data format has become the standard way to represent a
DBus interface. For many examples see /usr/share/dbus-1/interfaces/ on a
typical linux machine.

A word about annotations. These are extra flags or values that can be
assigned to anything. So far, the codegen supports this annotation:

org.freedesktop.DBus.GLib.CSymbol
 - An annotation specified in the specification that tells us what C symbol
   to generate for a given interface or method. By default the codegen will
   build up a symbol name from the DBus name.

It is possible to confuse the code generator into producing invalid
C code (with strange method names, for example), but the C compiler
catches such silliness right away.

Add tests testing basic features of the codegen and poking through
the metadata it creates. Also test the metadata lookup functions.

Generated code is checked in for easy discovery.

An example of the XML interface definitions can be found at:

  src/tests/sbus_codegen_tests.xml

And an example of the generated header can be found here:

  src/tests/sbus_codegen_tests_generated.h

Reviewed-by: Jakub Hrozek <jhrozek at redhat.com>
Reviewed-by: Sumit Bose <sbose at redhat.com>
Reviewed-by: Lukáš Slebodník <lslebodn at redhat.com>
Reviewed-by: Simo Sorce <simo at redhat.com>

(cherry picked from commit b699c4d7f85a5404be1d1ee9450331aea869b886)

Conflicts:
    Makefile.am
---
 Makefile.am                              |  47 ++-
 src/sbus/sbus_codegen                    | 506 +++++++++++++++++++++++++++++++
 src/sbus/sssd_dbus_meta.c                |  64 ++++
 src/sbus/sssd_dbus_meta.h                |  82 +++++
 src/tests/sbus_codegen_tests.c           | 166 ++++++++++
 src/tests/sbus_codegen_tests.xml         |  45 +++
 src/tests/sbus_codegen_tests_generated.c |  79 +++++
 src/tests/sbus_codegen_tests_generated.h |  24 ++
 8 files changed, 1012 insertions(+), 1 deletion(-)
 create mode 100755 src/sbus/sbus_codegen
 create mode 100644 src/sbus/sssd_dbus_meta.c
 create mode 100644 src/sbus/sssd_dbus_meta.h
 create mode 100644 src/tests/sbus_codegen_tests.c
 create mode 100755 src/tests/sbus_codegen_tests.xml
 create mode 100644 src/tests/sbus_codegen_tests_generated.c
 create mode 100644 src/tests/sbus_codegen_tests_generated.h

diff --git a/Makefile.am b/Makefile.am
index 8d92326de675bd7cc206c8f14cbda7cbff008529..de916d3ac51c223e6d6f4c73728973bbc8034c65 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -133,7 +133,8 @@ if HAVE_CHECK
         debug-tests \
         ipa_hbac-tests \
         sss_idmap-tests \
-        responder_socket_access-tests
+        responder_socket_access-tests \
+        sbus_codegen_tests
 
 if BUILD_SSH
     non_interactive_check_based_tests += sysdb_ssh-tests
@@ -437,6 +438,7 @@ dist_noinst_HEADERS = \
     src/responder/ssh/sshsrv_private.h \
     src/sbus/sbus_client.h \
     src/sbus/sssd_dbus.h \
+    src/sbus/sssd_dbus_meta.h \
     src/sbus/sssd_dbus_private.h \
     src/db/sysdb.h \
     src/db/sysdb_sudo.h \
@@ -561,6 +563,7 @@ libsss_util_la_SOURCES = \
     src/sbus/sbus_client.c \
     src/sbus/sssd_dbus_common.c \
     src/sbus/sssd_dbus_connection.c \
+    src/sbus/sssd_dbus_meta.c \
     src/sbus/sssd_dbus_server.c \
     src/util/util.c \
     src/util/memory.c \
@@ -637,6 +640,37 @@ include_HEADERS = \
     src/sss_client/idmap/sss_nss_idmap.h
 
 ####################
+# Sbus Codegen     #
+####################
+
+# Yes, the goal here is that the generated files end up in $(srcdir)
+# not $(builddir). Always use $(srcdir) here.
+CODEGEN_XML = \
+    $(srcdir)/src/tests/sbus_codegen_tests.xml
+
+SBUS_CODEGEN = src/sbus/sbus_codegen
+
+EXTRA_DIST += \
+    $(SBUS_CODEGEN) \
+    $(CODEGEN_XML)
+
+SUFFIXES = .xml _generated.h _generated.c
+
+.xml_generated.h:
+	$(srcdir)/$(SBUS_CODEGEN) --mode=header --output=$@ $<
+.xml_generated.c:
+	$(srcdir)/$(SBUS_CODEGEN) --mode=source --output=$@ $<
+
+# Regenerate when codegen changes
+CODEGEN_CODE = \
+    $(CODEGEN_XML:.xml=_generated.c) \
+    $(CODEGEN_XML:.xml=_generated.h)
+
+$(CODEGEN_CODE): $(SBUS_CODEGEN)
+
+BUILT_SOURCES = $(CODEGEN_CODE)
+
+####################
 # Program Binaries #
 ####################
 sssd_SOURCES = \
@@ -1257,6 +1291,17 @@ krb5_child_test_LDADD = \
     $(SSSD_INTERNAL_LTLIBS) \
     libsss_test_common.la
 
+sbus_codegen_tests_SOURCES = \
+   src/tests/sbus_codegen_tests.c \
+   src/tests/sbus_codegen_tests_generated.c \
+   src/tests/sbus_codegen_tests_generated.h
+sbus_codegen_tests_CFLAGS = \
+    $(CHECK_CFLAGS)
+sbus_codegen_tests_LDADD = \
+    $(SSSD_INTERNAL_LTLIBS) \
+    $(SSSD_LIBS) \
+    $(CHECK_LIBS)
+
 if HAVE_CMOCKA
 
 TEST_MOCK_RESP_OBJ = \
diff --git a/src/sbus/sbus_codegen b/src/sbus/sbus_codegen
new file mode 100755
index 0000000000000000000000000000000000000000..a1e2d02a04d6a8a63a3ace50e30fe685240d58d1
--- /dev/null
+++ b/src/sbus/sbus_codegen
@@ -0,0 +1,506 @@
+#!/usr/bin/python
+
+#
+# Authors:
+#     Stef Walter <stefw at redhat.com>
+#
+# Copyright (C) 2014 Red Hat
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+
+#
+# Some parser code from GLib
+#
+# Copyright (C) 2008-2011 Red Hat, Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General
+# Public License along with this library; if not, write to the
+# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+# Boston, MA 02111-1307, USA.
+#
+# Portions by: David Zeuthen <davidz at redhat.com>
+#
+
+#
+# DBus interfaces are defined here:
+#
+# http://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format
+#
+# The introspection data format has become the standard way to represent a
+# DBus interface. For many examples see /usr/share/dbus-1/interfaces/ on a
+# typical linux machine.
+#
+# A word about annotations. These are extra flags or values that can be
+# assigned to anything. So far, the codegen supports this annotation:
+#
+# org.freedesktop.DBus.GLib.CSymbol
+#  - An annotation specified in the specification that tells us what C symbol
+#    to generate for a given interface or method. By default the codegen will
+#    build up a symbol name from the DBus name.
+#
+
+import optparse
+import os
+import re
+import StringIO
+import sys
+import xml.parsers.expat
+
+# -----------------------------------------------------------------------------
+# Objects
+
+class DBusXmlException(Exception):
+    line = 0
+    file = None
+
+    # Lets us print problems like a compiler would
+    def __str__(self):
+        message = Exception.__str__(self)
+        if self.file and self.line:
+            return "%s:%d: %s" % (self.file, self.line, message)
+        elif self.file:
+            return "%s: %s" % (self.file, message)
+        else:
+            return message
+
+class Base:
+    def __init__(self, name):
+        if not name:
+            raise DBusXmlException('No name on element')
+        self.name = name
+        self.annotations = { }
+    def c_name(self):
+        return self.annotations.get("org.freedesktop.DBus.GLib.CSymbol", self.name)
+
+class Arg(Base):
+    def __init__(self, method, name, signature):
+        Base.__init__(self, name)
+        self.method = method
+        self.signature = signature
+
+class Method(Base):
+    def __init__(self, iface, name):
+        Base.__init__(self, name)
+        self.iface = iface
+        self.in_args = []
+        self.out_args = []
+    def fq_c_name(self):
+        return "%s_%s" % (self.iface.c_name(), self.c_name())
+
+class Signal(Base):
+    def __init__(self, iface, name):
+        Base.__init__(self, name)
+        self.iface = iface
+        self.args = []
+    def fq_c_name(self):
+        return "%s_%s" % (self.iface.c_name(), self.c_name())
+
+class Property(Base):
+    def __init__(self, iface, name, signature, access):
+        Base.__init__(self, name)
+        self.iface = iface
+        self.signature = signature
+        self.readable = False
+        self.writable = False
+        if access == 'readwrite':
+            self.readable = True
+            self.writable = True
+        elif access == 'read':
+            self.readable = True
+        elif access == 'write':
+            self.writable = True
+        else:
+            raise DBusXmlException('Invalid access type %s'%self.access)
+    def fq_c_name(self):
+        return "%s_%s" % (self.iface.c_name(), self.c_name())
+
+class Interface(Base):
+    def __init__(self, name):
+        Base.__init__(self, name)
+        self.methods = []
+        self.signals = []
+        self.properties = []
+    def c_name(self):
+        return self.annotations.get("org.freedesktop.DBus.GLib.CSymbol",
+                                    self.name.replace(".", "_"))
+
+# -----------------------------------------------------------------------------
+# Code Generation
+
+def out(format, *args):
+    str = format % args
+    sys.stdout.write(str)
+    sys.stdout.write("\n")
+
+def source_args(parent, args, suffix):
+    out("")
+    out("/* arguments for %s.%s */", parent.iface.name, parent.name)
+    out("const struct sbus_arg_meta %s%s[] = {", parent.fq_c_name(), suffix)
+    for arg in args:
+        out("    { \"%s\", \"%s\" },", arg.name, arg.signature)
+    out("    { NULL, }")
+    out("};")
+
+def source_methods(iface, methods):
+    for meth in methods:
+        if meth.in_args:
+            source_args(meth, meth.in_args, "__in")
+        if meth.out_args:
+            source_args(meth, meth.out_args, "__out")
+
+    out("")
+    out("/* methods for %s */", iface.name)
+    out("const struct sbus_method_meta %s__methods[] = {", iface.c_name())
+    for meth in methods:
+        out("    {")
+        out("        \"%s\", /* name */", meth.name)
+        if meth.in_args:
+            out("        %s__in,", meth.fq_c_name())
+        else:
+            out("        NULL, /* no in_args */")
+        if meth.out_args:
+            out("        %s__out,", meth.fq_c_name())
+        else:
+            out("        NULL, /* no out_args */")
+        out("    },")
+    out("    { NULL, }")
+    out("};")
+
+def source_signals(iface, signals):
+    for sig in iface.signals:
+        if sig.args:
+            source_args(sig, sig.args, "__args")
+
+    out("")
+    out("/* signals for %s */", iface.name)
+    out("const struct sbus_signal_meta %s__signals[] = {", iface.c_name())
+    for sig in signals:
+        out("    {")
+        out("        \"%s\", /* name */", sig.name)
+        if sig.args:
+            out("        %s__args", sig.fq_c_name())
+        else:
+            out("        NULL, /* no args */")
+        out("    },")
+    out("    { NULL, }")
+    out("};")
+
+def source_properties(iface, properties):
+    out("")
+    out("/* property info for %s */", iface.name)
+    out("const struct sbus_property_meta %s__properties[] = {", iface.c_name())
+    for prop in properties:
+        out("    {")
+        out("        \"%s\", /* name */", prop.name)
+        out("        \"%s\", /* signature */", prop.signature)
+        if prop.readable and prop.writable:
+            out("        SBUS_PROPERTY_READABLE | SBUS_PROPERTY_WRITABLE,")
+        elif prop.readable:
+            out("        SBUS_PROPERTY_READABLE,")
+        elif prop.writable:
+            out("        SBUS_PROPERTY_WRITABLE,")
+        else:
+            assert False, "should not be reached"
+        out("    },")
+    out("    { NULL, }")
+    out("};")
+
+def header_interface(iface):
+    out("")
+    out("/* interface info for %s */", iface.name)
+    out("extern const struct sbus_interface_meta %s_meta;", iface.c_name())
+
+def source_interface(iface):
+    out("")
+    out("/* interface info for %s */", iface.name)
+    out("const struct sbus_interface_meta %s_meta = {", iface.c_name())
+    out("    \"%s\", /* name */", iface.name)
+    if iface.methods:
+        out("    %s__methods,", iface.c_name())
+    else:
+        out("    NULL, /* no methods */")
+    if iface.signals:
+        out("    %s__signals,", iface.c_name())
+    else:
+        out("    NULL, /* no signals */")
+    if iface.properties:
+        out("    %s__properties", iface.c_name())
+    else:
+        out("    NULL, /* no propetries */")
+    out("};")
+
+def generate_source(ifaces, filename):
+    basename = os.path.basename(filename)
+
+    out("/* The following definitions are auto-generated from %s */", basename)
+    out("")
+
+    out("#include \"util/util.h\"")
+    out("#include \"sbus/sssd_dbus.h\"")
+    out("#include \"sbus/sssd_dbus_meta.h\"")
+
+    for iface in ifaces:
+
+        # The methods
+        if iface.methods:
+            source_methods(iface, iface.methods)
+
+        # The signals array
+        if iface.signals:
+            source_signals(iface, iface.signals)
+
+        # The properties array
+        if iface.properties:
+            source_properties(iface, iface.properties)
+
+        # The sbus_interface structure
+        source_interface(iface)
+
+def generate_header(ifaces, filename):
+    basename = os.path.basename(filename)
+    guard = "__%s__" % re.sub(r'([^_A-Z0-9])', "_", basename.upper())
+
+    out("/* The following declarations are auto-generated from %s */", basename)
+    out("")
+    out("#ifndef %s", guard)
+    out("#define %s", guard)
+    out("")
+    out("#include \"sbus/sssd_dbus.h\"")
+
+    out("")
+    out("/* ------------------------------------------------------------------------")
+    out(" * DBus Interface Metadata")
+    out(" *")
+    out(" * These structure definitions are filled in with the information about")
+    out(" * the interfaces, methods, properties and so on.")
+    out(" *")
+    out(" * The actual definitions are found in the accompanying C file next")
+    out(" * to this header.")
+    out(" */")
+
+    for iface in ifaces:
+        header_interface(iface)
+
+    out("")
+    out("#endif /* %s */", guard)
+
+# -----------------------------------------------------------------------------
+# XML Interface Parsing
+
+STATE_TOP = 'top'
+STATE_NODE = 'node'
+STATE_INTERFACE = 'interface'
+STATE_METHOD = 'method'
+STATE_SIGNAL = 'signal'
+STATE_PROPERTY = 'property'
+STATE_ARG = 'arg'
+STATE_ANNOTATION = 'annotation'
+STATE_IGNORED = 'ignored'
+
+def expect_attr(attrs, name):
+    if name not in attrs:
+        raise DBusXmlException("Missing attribute '%s'" % name)
+    if attrs[name] == "":
+        raise DBusXmlException("Empty attribute '%s'" % name)
+    return attrs[name]
+
+class DBusXMLParser:
+    def __init__(self, filename):
+        parser = xml.parsers.expat.ParserCreate()
+        parser.CommentHandler = self.handle_comment
+        parser.CharacterDataHandler = self.handle_char_data
+        parser.StartElementHandler = self.handle_start_element
+        parser.EndElementHandler = self.handle_end_element
+
+        self.parsed_interfaces = []
+        self.cur_object = None
+
+        self.state = STATE_TOP
+        self.state_stack = []
+        self.cur_object = None
+        self.cur_object_stack = []
+        self.arg_count = 0
+
+        try:
+            with open(filename, "r") as f:
+                parser.ParseFile(f)
+        except DBusXmlException, ex:
+            ex.line = parser.CurrentLineNumber
+            ex.file = filename
+            raise
+        except xml.parsers.expat.ExpatError, ex:
+            exc = DBusXmlException(str(ex))
+            exc.line = ex.lineno
+            exc.file = filename
+            raise exc
+
+    def handle_comment(self, data):
+        pass
+
+    def handle_char_data(self, data):
+        pass
+
+    def handle_start_element(self, name, attrs):
+        old_state = self.state
+        old_cur_object = self.cur_object
+        if self.state == STATE_IGNORED:
+            self.state = STATE_IGNORED
+        elif self.cur_object and name == STATE_ANNOTATION:
+                val = attrs.get('value', '')
+                self.cur_object.annotations[expect_attr(attrs, 'name')] = val
+                self.state = STATE_IGNORED
+        elif self.state == STATE_TOP:
+            if name == STATE_NODE:
+                self.state = STATE_NODE
+            else:
+                self.state = STATE_IGNORED
+        elif self.state == STATE_NODE:
+            if name == STATE_INTERFACE:
+                self.state = STATE_INTERFACE
+                iface = Interface(expect_attr(attrs, 'name'))
+                self.cur_object = iface
+                self.parsed_interfaces.append(iface)
+            else:
+                self.state = STATE_IGNORED
+
+        elif self.state == STATE_INTERFACE:
+            if name == STATE_METHOD:
+                self.state = STATE_METHOD
+                method = Method(self.cur_object, expect_attr(attrs, 'name'))
+                self.cur_object.methods.append(method)
+                self.cur_object = method
+                self.arg_count = 0
+            elif name == STATE_SIGNAL:
+                self.state = STATE_SIGNAL
+                signal = Signal(self.cur_object, expect_attr(attrs, 'name'))
+                self.cur_object.signals.append(signal)
+                self.cur_object = signal
+                self.arg_count = 0
+            elif name == STATE_PROPERTY:
+                self.state = STATE_PROPERTY
+                prop = Property(self.cur_object,
+                                expect_attr(attrs, 'name'),
+                                expect_attr(attrs, 'type'),
+                                expect_attr(attrs, 'access'))
+                self.cur_object.properties.append(prop)
+                self.cur_object = prop
+            else:
+                self.state = STATE_IGNORED
+
+        elif self.state == STATE_METHOD:
+            if name == STATE_ARG:
+                self.state = STATE_ARG
+                arg = Arg(self.cur_object,
+                          expect_attr(attrs, 'name'),
+                          expect_attr(attrs, 'type'))
+                direction = attrs.get('direction', 'in')
+                if direction == 'in':
+                    self.cur_object.in_args.append(arg)
+                elif direction == 'out':
+                    self.cur_object.out_args.append(arg)
+                else:
+                    raise DBusXmlException('Invalid direction "%s"' % direction)
+                self.cur_object = arg
+            else:
+                self.state = STATE_IGNORED
+
+        elif self.state == STATE_SIGNAL:
+            if name == STATE_ARG:
+                self.state = STATE_ARG
+                arg = Arg(self.cur_object,
+                          expect_attr(attrs, 'name'),
+                          expect_attr(attrs, 'type'))
+                self.cur_object.args.append(arg)
+                self.cur_object = arg
+            else:
+                self.state = STATE_IGNORED
+
+        elif self.state == STATE_PROPERTY:
+            self.state = STATE_IGNORED
+
+        elif self.state == STATE_ARG:
+            self.state = STATE_IGNORED
+
+        else:
+            assert False, 'Unhandled state "%s" while entering element with name "%s"' % (self.state, name)
+
+        self.state_stack.append(old_state)
+        self.cur_object_stack.append(old_cur_object)
+
+    def handle_end_element(self, name):
+        self.state = self.state_stack.pop()
+        self.cur_object = self.cur_object_stack.pop()
+
+def parse_options():
+    parser = optparse.OptionParser("usage: %prog [options] introspect.xml ...")
+    parser.set_description("sbus_codegen generates sbus interface structures \
+                            from standard XML Introspect data.")
+    parser.add_option("--mode",
+                      dest="mode", default="header",
+                      help="'header' or 'source' (default: header)",
+                      metavar="MODE")
+    parser.add_option("--output",
+                      dest="output", default=None,
+                      help="Set output file name (default: stdout)",
+                      metavar="FILE")
+    (options, args) = parser.parse_args()
+
+    if not args:
+        print >> sys.stderr, "sbus_codegen: no input file specified"
+        sys.exit(2)
+
+    if options.mode not in ["header", "source"]:
+        print >> sys.stderr, "sbus_codegen: specify --mode=header or --mode=source"
+
+    return options, args
+
+def main():
+    options, args = parse_options()
+
+    if options.output:
+        sys.stdout = buf = StringIO.StringIO()
+
+    for filename in args:
+        parser = DBusXMLParser(filename)
+
+        if options.mode == "header":
+            generate_header(parser.parsed_interfaces, filename)
+        elif options.mode == "source":
+            generate_source(parser.parsed_interfaces, filename)
+        else:
+            assert False, "should not be reached"
+
+    # Write output at end to be nice to 'make'
+    if options.output:
+        output = open(options.output, "w")
+        output.write(buf.getvalue())
+        output.close()
+
+if __name__ == "__main__":
+    try:
+        main()
+    except DBusXmlException, ex:
+        print >> sys.stderr, str(ex)
+        sys.exit(1)
diff --git a/src/sbus/sssd_dbus_meta.c b/src/sbus/sssd_dbus_meta.c
new file mode 100644
index 0000000000000000000000000000000000000000..57123b7431b18b02be408015556986c65cd50bf4
--- /dev/null
+++ b/src/sbus/sssd_dbus_meta.c
@@ -0,0 +1,64 @@
+/*
+    Authors:
+        Stef Walter <stefw at redhat.com>
+
+    Copyright (C) 2014 Red Hat
+
+    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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "util/util.h"
+#include "sbus/sssd_dbus_meta.h"
+
+const struct sbus_method_meta *
+sbus_meta_find_method(const struct sbus_interface_meta *interface,
+                      const char *method_name)
+{
+    const struct sbus_method_meta *method;
+
+    for (method = interface->methods; method && method->name; method++) {
+        if (strcmp(method_name, method->name) == 0)
+            return method;
+    }
+
+    return NULL;
+}
+
+const struct sbus_signal_meta *
+sbus_meta_find_signal(const struct sbus_interface_meta *interface,
+                      const char *signal_name)
+{
+    const struct sbus_signal_meta *signal;
+
+    for (signal = interface->signals; signal && signal->name; signal++) {
+        if (strcmp(signal_name, signal->name) == 0)
+            return signal;
+    }
+
+    return NULL;
+}
+
+const struct sbus_property_meta *
+sbus_meta_find_property(const struct sbus_interface_meta *interface,
+                        const char *property_name)
+{
+    const struct sbus_property_meta *property;
+
+    for (property = interface->properties; property && property->name; property++) {
+        if (strcmp(property_name, property->name) == 0)
+            return property;
+    }
+
+    return NULL;
+}
diff --git a/src/sbus/sssd_dbus_meta.h b/src/sbus/sssd_dbus_meta.h
new file mode 100644
index 0000000000000000000000000000000000000000..17ea7a5076ba8ed960b954035ab584ebd1bd4f88
--- /dev/null
+++ b/src/sbus/sssd_dbus_meta.h
@@ -0,0 +1,82 @@
+/*
+    Authors:
+        Stef Walter <stefw at redhat.com>
+
+    Copyright (C) 2014 Red Hat
+
+    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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _SSSD_DBUS_META_H_
+#define _SSSD_DBUS_META_H_
+
+/*
+ * Interface metadata
+ *
+ * For arrays, the last item in each array will have a
+ * NULL .name field
+ *
+ * Typically these structs will be generated by sbus_codegen
+ * from canonical XML interface data:
+ *
+ * http://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format
+ */
+
+struct sbus_arg_meta {
+    const char *name;
+    const char *type;
+};
+
+struct sbus_method_meta {
+    const char *name;
+    const struct sbus_arg_meta *in_args;
+    const struct sbus_arg_meta *out_args;
+};
+
+enum {
+    SBUS_PROPERTY_READABLE = 1 << 0,
+    SBUS_PROPERTY_WRITABLE = 1 << 1
+};
+
+struct sbus_property_meta {
+    const char *name;
+    const char *type;
+    int flags;
+};
+
+struct sbus_signal_meta {
+    const char *name;
+    const struct sbus_arg_meta *args;
+};
+
+struct sbus_interface_meta {
+    const char *name;
+    const struct sbus_method_meta *methods;
+    const struct sbus_signal_meta *signals;
+    const struct sbus_property_meta *properties;
+};
+
+const struct sbus_method_meta *
+sbus_meta_find_method (const struct sbus_interface_meta *interface,
+                       const char *method_name);
+
+const struct sbus_signal_meta *
+sbus_meta_find_signal (const struct sbus_interface_meta *interface,
+                       const char *signal_name);
+
+const struct sbus_property_meta *
+sbus_meta_find_property (const struct sbus_interface_meta *interface,
+                         const char *property_name);
+
+#endif /* _SSSD_DBUS_META_H_ */
diff --git a/src/tests/sbus_codegen_tests.c b/src/tests/sbus_codegen_tests.c
new file mode 100644
index 0000000000000000000000000000000000000000..6b2abf8bcdf0e2494127c033e367b021cac7ec09
--- /dev/null
+++ b/src/tests/sbus_codegen_tests.c
@@ -0,0 +1,166 @@
+/*
+   SSSD
+
+   sbus_codegen tests.
+
+   Authors:
+        Stef Walter <stefw at redhat.com>
+
+   Copyright (C) Red Hat, Inc 2014
+
+   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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdlib.h>
+#include <check.h>
+#include <talloc.h>
+#include <tevent.h>
+#include <popt.h>
+
+#include "sbus/sssd_dbus_meta.h"
+#include "tests/sbus_codegen_tests_generated.h"
+
+static const struct sbus_arg_meta *
+find_arg(const struct sbus_arg_meta *args,
+         const char *name)
+{
+    const struct sbus_arg_meta *arg;
+    for (arg = args; arg->name != NULL; arg++) {
+        if (strcmp (arg->name, name) == 0)
+            return arg;
+    }
+
+    return NULL;
+}
+
+START_TEST(test_interfaces)
+{
+    ck_assert_str_eq(com_planetexpress_Ship_meta.name, "com.planetexpress.Ship");
+    ck_assert(com_planetexpress_Ship_meta.methods != NULL);
+    ck_assert(com_planetexpress_Ship_meta.signals != NULL);
+    ck_assert(com_planetexpress_Ship_meta.properties != NULL);
+
+    /* Explicit C Symbol */
+    ck_assert_str_eq(test_pilot_meta.name, "com.planetexpress.Pilot");
+    ck_assert(test_pilot_meta.methods == NULL); /* no methods */
+    ck_assert(test_pilot_meta.signals == NULL); /* no signals */
+    ck_assert(test_pilot_meta.properties != NULL);
+
+}
+END_TEST
+
+START_TEST(test_methods)
+{
+    const struct sbus_method_meta *method;
+    const struct sbus_arg_meta *arg;
+
+    method = sbus_meta_find_method(&com_planetexpress_Ship_meta, "MoveUniverse");
+    ck_assert(method != NULL);
+    ck_assert_str_eq(method->name, "MoveUniverse");
+    ck_assert(method->in_args != NULL);
+    ck_assert(method->out_args != NULL);
+
+    arg = find_arg(method->in_args, "smoothly");
+    ck_assert(arg != NULL);
+    ck_assert_str_eq(arg->name, "smoothly");
+    ck_assert_str_eq(arg->type, "b");
+
+    arg = find_arg(method->out_args, "where_we_crashed");
+    ck_assert(arg != NULL);
+    ck_assert_str_eq(arg->name, "where_we_crashed");
+    ck_assert_str_eq(arg->type, "s");
+}
+END_TEST
+
+START_TEST(test_properties)
+{
+    const struct sbus_property_meta *prop;
+
+    prop = sbus_meta_find_property(&com_planetexpress_Ship_meta, "Color");
+    ck_assert(prop != NULL);
+    ck_assert_str_eq(prop->name, "Color");
+    ck_assert_str_eq(prop->type, "s");
+    ck_assert_int_eq(prop->flags, SBUS_PROPERTY_READABLE);
+}
+END_TEST
+
+START_TEST(test_signals)
+{
+    const struct sbus_signal_meta *signal;
+    const struct sbus_arg_meta *arg;
+
+    signal = sbus_meta_find_signal(&com_planetexpress_Ship_meta, "BecameSentient");
+    ck_assert(signal != NULL);
+    ck_assert_str_eq(signal->name, "BecameSentient");
+    ck_assert(signal->args != NULL);
+
+    arg = find_arg(signal->args, "gender");
+    ck_assert(arg != NULL);
+    ck_assert_str_eq(arg->name, "gender");
+    ck_assert_str_eq(arg->type, "s");
+}
+END_TEST
+
+Suite *create_suite(void)
+{
+    Suite *s = suite_create("sbus_codegen");
+
+    TCase *tc = tcase_create("defs");
+
+    /* Do some testing */
+    tcase_add_test(tc, test_interfaces);
+    tcase_add_test(tc, test_methods);
+    tcase_add_test(tc, test_properties);
+    tcase_add_test(tc, test_signals);
+
+    /* Add all test cases to the test suite */
+    suite_add_tcase(s, tc);
+
+    return s;
+}
+
+int main(int argc, const char *argv[])
+{
+    int opt;
+    poptContext pc;
+    int failure_count;
+    Suite *suite;
+    SRunner *sr;
+
+    struct poptOption long_options[] = {
+        POPT_AUTOHELP
+        POPT_TABLEEND
+    };
+
+    pc = poptGetContext(argv[0], argc, argv, long_options, 0);
+    while ((opt = poptGetNextOpt(pc)) != -1) {
+        switch (opt) {
+        default:
+            fprintf(stderr, "\nInvalid option %s: %s\n\n",
+                    poptBadOption(pc, 0), poptStrerror(opt));
+            poptPrintUsage(pc, stderr, 0);
+            return 1;
+        }
+    }
+    poptFreeContext(pc);
+
+    suite = create_suite();
+    sr = srunner_create(suite);
+    srunner_set_fork_status(sr, CK_FORK);
+    /* If CK_VERBOSITY is set, use that, otherwise it defaults to CK_NORMAL */
+    srunner_run_all(sr, CK_ENV);
+    failure_count = srunner_ntests_failed(sr);
+    srunner_free(sr);
+    return (failure_count == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
+}
diff --git a/src/tests/sbus_codegen_tests.xml b/src/tests/sbus_codegen_tests.xml
new file mode 100755
index 0000000000000000000000000000000000000000..0def3585a973ef1d7fdef198d8ed8bf5e84c209c
--- /dev/null
+++ b/src/tests/sbus_codegen_tests.xml
@@ -0,0 +1,45 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+    <!--
+      This file should exercise as many aspects of the sbus_codegen as
+      possible. See sbus_codegen_test.c for verification.
+    -->
+
+    <!--
+      This is an interface, it will get a sbus_interface_meta struct.
+      Its name will be com_planetexpress_Ship__meta, since no c symbol
+      is specified.
+    -->
+    <interface name="com.planetexpress.Ship">
+        <!-- A property -->
+        <property name="Color" type="s" access="read"/>
+
+        <!-- A method with two in and one out argument -->
+        <method name="MoveUniverse">
+            <!-- This is a boolean arg -->
+            <arg name="smoothly" type="b" direction="in"/>
+            <!-- This is an uint32 arg -->
+            <arg name="speed_factor" type="u" direction="in"/>
+            <!-- This is a string arg -->
+            <arg name="where_we_crashed" type="s" direction="out"/>
+        </method>
+
+        <!-- A signal with one argument -->
+        <signal name="BecameSentient">
+            <arg name="gender" type="s"/>
+        </signal>
+    </interface>
+
+    <!--
+      Another interface. It's C name will be test_pilot, since we've overridden
+      the c symbol name.
+    -->
+    <interface name="com.planetexpress.Pilot">
+        <annotation value="test_pilot" name="org.freedesktop.DBus.GLib.CSymbol"/>
+
+        <!-- A property -->
+        <property name="FullName" type="s" access="readwrite"/>
+    </interface>
+
+</node>
diff --git a/src/tests/sbus_codegen_tests_generated.c b/src/tests/sbus_codegen_tests_generated.c
new file mode 100644
index 0000000000000000000000000000000000000000..556eea12c8f16103e3a14bdbd955e62dbc346351
--- /dev/null
+++ b/src/tests/sbus_codegen_tests_generated.c
@@ -0,0 +1,79 @@
+/* The following definitions are auto-generated from sbus_codegen_tests.xml */
+
+#include "util/util.h"
+#include "sbus/sssd_dbus.h"
+#include "sbus/sssd_dbus_meta.h"
+
+/* arguments for com.planetexpress.Ship.MoveUniverse */
+const struct sbus_arg_meta com_planetexpress_Ship_MoveUniverse__in[] = {
+    { "smoothly", "b" },
+    { "speed_factor", "u" },
+    { NULL, }
+};
+
+/* arguments for com.planetexpress.Ship.MoveUniverse */
+const struct sbus_arg_meta com_planetexpress_Ship_MoveUniverse__out[] = {
+    { "where_we_crashed", "s" },
+    { NULL, }
+};
+
+/* methods for com.planetexpress.Ship */
+const struct sbus_method_meta com_planetexpress_Ship__methods[] = {
+    {
+        "MoveUniverse", /* name */
+        com_planetexpress_Ship_MoveUniverse__in,
+        com_planetexpress_Ship_MoveUniverse__out,
+    },
+    { NULL, }
+};
+
+/* arguments for com.planetexpress.Ship.BecameSentient */
+const struct sbus_arg_meta com_planetexpress_Ship_BecameSentient__args[] = {
+    { "gender", "s" },
+    { NULL, }
+};
+
+/* signals for com.planetexpress.Ship */
+const struct sbus_signal_meta com_planetexpress_Ship__signals[] = {
+    {
+        "BecameSentient", /* name */
+        com_planetexpress_Ship_BecameSentient__args
+    },
+    { NULL, }
+};
+
+/* property info for com.planetexpress.Ship */
+const struct sbus_property_meta com_planetexpress_Ship__properties[] = {
+    {
+        "Color", /* name */
+        "s", /* signature */
+        SBUS_PROPERTY_READABLE,
+    },
+    { NULL, }
+};
+
+/* interface info for com.planetexpress.Ship */
+const struct sbus_interface_meta com_planetexpress_Ship_meta = {
+    "com.planetexpress.Ship", /* name */
+    com_planetexpress_Ship__methods,
+    com_planetexpress_Ship__signals,
+    com_planetexpress_Ship__properties
+};
+
+/* property info for com.planetexpress.Pilot */
+const struct sbus_property_meta test_pilot__properties[] = {
+    {
+        "FullName", /* name */
+        "s", /* signature */
+        SBUS_PROPERTY_READABLE | SBUS_PROPERTY_WRITABLE,
+    },
+    { NULL, }
+};
+
+/* interface info for com.planetexpress.Pilot */
+const struct sbus_interface_meta test_pilot_meta = {
+    "com.planetexpress.Pilot", /* name */
+    NULL, /* no methods */
+    NULL, /* no signals */
+    test_pilot__properties
+};
diff --git a/src/tests/sbus_codegen_tests_generated.h b/src/tests/sbus_codegen_tests_generated.h
new file mode 100644
index 0000000000000000000000000000000000000000..c3a23c870eaf567aca97809b0b83bfff0a74f801
--- /dev/null
+++ b/src/tests/sbus_codegen_tests_generated.h
@@ -0,0 +1,24 @@
+/* The following declarations are auto-generated from sbus_codegen_tests.xml */
+
+#ifndef __SBUS_CODEGEN_TESTS_XML__
+#define __SBUS_CODEGEN_TESTS_XML__
+
+#include "sbus/sssd_dbus.h"
+
+/* ------------------------------------------------------------------------
+ * DBus Interface Metadata
+ *
+ * These structure definitions are filled in with the information about
+ * the interfaces, methods, properties and so on.
+ *
+ * The actual definitions are found in the accompanying C file next
+ * to this header.
+ */
+
+/* interface info for com.planetexpress.Ship */
+extern const struct sbus_interface_meta com_planetexpress_Ship_meta;
+
+/* interface info for com.planetexpress.Pilot */
+extern const struct sbus_interface_meta test_pilot_meta;
+
+#endif /* __SBUS_CODEGEN_TESTS_XML__ */
-- 
1.9.0

-------------- next part --------------
>From 0467b41391b01875aa539df519500390b8bb4cbf Mon Sep 17 00:00:00 2001
From: Stef Walter <stefw at redhat.com>
Date: Fri, 10 Jan 2014 08:54:41 +0100
Subject: [PATCH 2/6] sbus: Add sbus_vtable and update codegen to support it
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Each interface is a vtable structure derived from
sbus_vtable, in the sense that it has an sbus_vtable
struct as its first argument. This lets us upcast the
interface vtable structure to an sbus_vtable and dispatch
to it dynamically and cleanly.

The interface metadata contains information about which
vtable offset in the interface metadata should be dispatched
to for a given function. This is a common scheme, not only
among dbus implementations, but also compiled languages.

Currently all the vtable functions are of type
sbus_msg_handler_fn. These are the handlers we are familiar
with and perform raw processing of the message. Later commits
will introduce type safe handlers that levelage compile checking
and automatic argument packing/unpacking.

Although this may seem contrived now, the remainder of the
dbus infrastructure work will build on this, including
ofd.Properties, ofd.ObjectManager, ofd.Introspect, compiler
checked type safe unpacking/packing, etc.

The codegen now generates vtable structures for each interface
along-side the metadata, and fills in vtable offsets
appropriately.

It is obviously still possible to hand-craft such vtables and
metadata if needed for a special case.

Once again examples output can be found at:

  src/tests/sbus_codegen_tests_generated.h

Reviewed-by: Jakub Hrozek <jhrozek at redhat.com>
Reviewed-by: Sumit Bose <sbose at redhat.com>
Reviewed-by: Lukáš Slebodník <lslebodn at redhat.com>
Reviewed-by: Simo Sorce <simo at redhat.com>
(cherry picked from commit fcd8093c58638dc7c4f9cddfc97f273b94ce2ead)
---
 Makefile.am                              |  2 +-
 src/sbus/sbus_codegen                    | 42 ++++++++++++++++++++++++++++++--
 src/sbus/sssd_dbus.h                     | 15 ++++++++++++
 src/sbus/sssd_dbus_meta.h                |  1 +
 src/tests/sbus_codegen_tests.c           | 33 +++++++++++++++++++++++++
 src/tests/sbus_codegen_tests.xml         |  5 ++++
 src/tests/sbus_codegen_tests_generated.c |  8 ++++++
 src/tests/sbus_codegen_tests_generated.h | 19 +++++++++++++++
 8 files changed, 122 insertions(+), 3 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index de916d3ac51c223e6d6f4c73728973bbc8034c65..22a38eb217951dc8f3d4a6bd08d5b96769e7f9bf 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -659,7 +659,7 @@ SUFFIXES = .xml _generated.h _generated.c
 .xml_generated.h:
 	$(srcdir)/$(SBUS_CODEGEN) --mode=header --output=$@ $<
 .xml_generated.c:
-	$(srcdir)/$(SBUS_CODEGEN) --mode=source --output=$@ $<
+	$(srcdir)/$(SBUS_CODEGEN) --mode=source --include=$(@:.c=.h) --output=$@ $<
 
 # Regenerate when codegen changes
 CODEGEN_CODE = \
diff --git a/src/sbus/sbus_codegen b/src/sbus/sbus_codegen
index a1e2d02a04d6a8a63a3ace50e30fe685240d58d1..86aeff094e2f0a5e713fc7c78fca5372eda71ce9 100755
--- a/src/sbus/sbus_codegen
+++ b/src/sbus/sbus_codegen
@@ -184,6 +184,7 @@ def source_methods(iface, methods):
             out("        %s__out,", meth.fq_c_name())
         else:
             out("        NULL, /* no out_args */")
+        out("        offsetof(struct %s, %s),", iface.c_name(), meth.c_name())
         out("    },")
     out("    { NULL, }")
     out("};")
@@ -251,7 +252,7 @@ def source_interface(iface):
         out("    NULL, /* no propetries */")
     out("};")
 
-def generate_source(ifaces, filename):
+def generate_source(ifaces, filename, include_header=None):
     basename = os.path.basename(filename)
 
     out("/* The following definitions are auto-generated from %s */", basename)
@@ -260,6 +261,8 @@ def generate_source(ifaces, filename):
     out("#include \"util/util.h\"")
     out("#include \"sbus/sssd_dbus.h\"")
     out("#include \"sbus/sssd_dbus_meta.h\"")
+    if include_header:
+        out("#include \"%s\"", os.path.basename(include_header))
 
     for iface in ifaces:
 
@@ -278,6 +281,20 @@ def generate_source(ifaces, filename):
         # The sbus_interface structure
         source_interface(iface)
 
+def header_vtable(iface, methods):
+    out("")
+    out("/* vtable for %s */", iface.name)
+    out("struct %s {", iface.c_name())
+    out("    struct sbus_vtable vtable; /* derive from sbus_vtable */")
+
+    # All methods
+    for meth in iface.methods:
+        out("    sbus_msg_handler_fn %s;", meth.c_name())
+
+    # TODO: Property getters and setters will go here
+
+    out("};")
+
 def generate_header(ifaces, filename):
     basename = os.path.basename(filename)
     guard = "__%s__" % re.sub(r'([^_A-Z0-9])', "_", basename.upper())
@@ -291,6 +308,23 @@ def generate_header(ifaces, filename):
 
     out("")
     out("/* ------------------------------------------------------------------------")
+    out(" * DBus Vtable handler structures")
+    out(" *")
+    out(" * These structures are filled in by implementors of the different")
+    out(" * dbus interfaces to handle method calls.")
+    out(" *")
+    out(" * Handler functions of type sbus_msg_handler_fn accept raw messages,")
+    out(" * other handlers will be typed appropriately. If a handler that is")
+    out(" * set to NULL is invoked it will result in a")
+    out(" * org.freedesktop.DBus.Error.NotSupported error for the caller.")
+    out(" */")
+
+    for iface in ifaces:
+        if iface.methods:
+            header_vtable(iface, iface.methods)
+
+    out("")
+    out("/* ------------------------------------------------------------------------")
     out(" * DBus Interface Metadata")
     out(" *")
     out(" * These structure definitions are filled in with the information about")
@@ -465,6 +499,10 @@ def parse_options():
                       dest="output", default=None,
                       help="Set output file name (default: stdout)",
                       metavar="FILE")
+    parser.add_option("--include",
+                      dest="include", default=None,
+                      help="name of a header to #include",
+                      metavar="HEADER")
     (options, args) = parser.parse_args()
 
     if not args:
@@ -488,7 +526,7 @@ def main():
         if options.mode == "header":
             generate_header(parser.parsed_interfaces, filename)
         elif options.mode == "source":
-            generate_source(parser.parsed_interfaces, filename)
+            generate_source(parser.parsed_interfaces, filename, options.include)
         else:
             assert False, "should not be reached"
 
diff --git a/src/sbus/sssd_dbus.h b/src/sbus/sssd_dbus.h
index 49b09331efcaaa0800f8d0a8942117a97fdb7efd..5e9c1c69ea195a5c32b93c60979feb4554be3d49 100644
--- a/src/sbus/sssd_dbus.h
+++ b/src/sbus/sssd_dbus.h
@@ -55,6 +55,21 @@ enum {
     SBUS_RECONNECT_ERROR
 };
 
+/*
+ * This represents vtable of interface handlers for methods and
+ * properties and so on. The actual vtable structs derive from this struct
+ * (ie: have this struct as their first member).
+ *
+ * The offsets for matching vtable function pointers are in sbus_method_meta
+ * These are used to dynamically dispatch the method invocations.
+ */
+struct sbus_vtable {
+    const struct sbus_interface_meta *meta;
+    int flags; /* unused for now */
+
+    /* derived structs place function pointers here. */
+};
+
 /* Special interface and method for D-BUS introspection */
 #define DBUS_INTROSPECT_INTERFACE "org.freedesktop.DBus.Introspectable"
 #define DBUS_INTROSPECT_METHOD "Introspect"
diff --git a/src/sbus/sssd_dbus_meta.h b/src/sbus/sssd_dbus_meta.h
index 17ea7a5076ba8ed960b954035ab584ebd1bd4f88..abc992137811be6c6930ff86831a03f7b43fb485 100644
--- a/src/sbus/sssd_dbus_meta.h
+++ b/src/sbus/sssd_dbus_meta.h
@@ -42,6 +42,7 @@ struct sbus_method_meta {
     const char *name;
     const struct sbus_arg_meta *in_args;
     const struct sbus_arg_meta *out_args;
+    size_t vtable_offset;
 };
 
 enum {
diff --git a/src/tests/sbus_codegen_tests.c b/src/tests/sbus_codegen_tests.c
index 6b2abf8bcdf0e2494127c033e367b021cac7ec09..39856fac79ef1b36b069e128754c6a124e6136e6 100644
--- a/src/tests/sbus_codegen_tests.c
+++ b/src/tests/sbus_codegen_tests.c
@@ -112,6 +112,38 @@ START_TEST(test_signals)
 }
 END_TEST
 
+static int
+mock_move_universe(DBusMessage *msg, struct sbus_connection *conn)
+{
+    /* not called */
+    return 0;
+}
+
+static int
+mock_crash_now(DBusMessage *msg, struct sbus_connection *conn)
+{
+    /* not called */
+    return 0;
+}
+
+START_TEST(test_vtable)
+{
+    struct com_planetexpress_Ship vtable = {
+        { &com_planetexpress_Ship_meta, 0 },
+        mock_move_universe,
+        mock_crash_now,
+    };
+
+    /*
+     * These are not silly tests:
+     * - Will fail compilation if c-symbol name was not respected
+     * - Will fail if method order was not respected
+     */
+    ck_assert(vtable.crash_now == mock_crash_now);
+    ck_assert(vtable.MoveUniverse == mock_move_universe);
+}
+END_TEST
+
 Suite *create_suite(void)
 {
     Suite *s = suite_create("sbus_codegen");
@@ -123,6 +155,7 @@ Suite *create_suite(void)
     tcase_add_test(tc, test_methods);
     tcase_add_test(tc, test_properties);
     tcase_add_test(tc, test_signals);
+    tcase_add_test(tc, test_vtable);
 
     /* Add all test cases to the test suite */
     suite_add_tcase(s, tc);
diff --git a/src/tests/sbus_codegen_tests.xml b/src/tests/sbus_codegen_tests.xml
index 0def3585a973ef1d7fdef198d8ed8bf5e84c209c..e571dbc17b9e5c0e065d2ab87fb37458072f10b0 100755
--- a/src/tests/sbus_codegen_tests.xml
+++ b/src/tests/sbus_codegen_tests.xml
@@ -29,6 +29,11 @@
         <signal name="BecameSentient">
             <arg name="gender" type="s"/>
         </signal>
+
+        <!-- A method with a specific c name -->
+        <method name="Crash">
+            <annotation value="crash_now" name="org.freedesktop.DBus.GLib.CSymbol"/>
+        </method>
     </interface>
 
     <!--
diff --git a/src/tests/sbus_codegen_tests_generated.c b/src/tests/sbus_codegen_tests_generated.c
index 556eea12c8f16103e3a14bdbd955e62dbc346351..ccf6129965e8b7753d6f63286078d1f296bcf07e 100644
--- a/src/tests/sbus_codegen_tests_generated.c
+++ b/src/tests/sbus_codegen_tests_generated.c
@@ -3,6 +3,7 @@
 #include "util/util.h"
 #include "sbus/sssd_dbus.h"
 #include "sbus/sssd_dbus_meta.h"
+#include "sbus_codegen_tests_generated.h"
 
 /* arguments for com.planetexpress.Ship.MoveUniverse */
 const struct sbus_arg_meta com_planetexpress_Ship_MoveUniverse__in[] = {
@@ -23,6 +24,13 @@ const struct sbus_method_meta com_planetexpress_Ship__methods[] = {
         "MoveUniverse", /* name */
         com_planetexpress_Ship_MoveUniverse__in,
         com_planetexpress_Ship_MoveUniverse__out,
+        offsetof(struct com_planetexpress_Ship, MoveUniverse),
+    },
+    {
+        "Crash", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct com_planetexpress_Ship, crash_now),
     },
     { NULL, }
 };
diff --git a/src/tests/sbus_codegen_tests_generated.h b/src/tests/sbus_codegen_tests_generated.h
index c3a23c870eaf567aca97809b0b83bfff0a74f801..3f762158812189669b2b53aa1d8692bf86c0c10b 100644
--- a/src/tests/sbus_codegen_tests_generated.h
+++ b/src/tests/sbus_codegen_tests_generated.h
@@ -6,6 +6,25 @@
 #include "sbus/sssd_dbus.h"
 
 /* ------------------------------------------------------------------------
+ * DBus Vtable handler structures
+ *
+ * These structures are filled in by implementors of the different
+ * dbus interfaces to handle method calls.
+ *
+ * Handler functions of type sbus_msg_handler_fn accept raw messages,
+ * other handlers will be typed appropriately. If a handler that is
+ * set to NULL is invoked it will result in a
+ * org.freedesktop.DBus.Error.NotSupported error for the caller.
+ */
+
+/* vtable for com.planetexpress.Ship */
+struct com_planetexpress_Ship {
+    struct sbus_vtable vtable; /* derive from sbus_vtable */
+    sbus_msg_handler_fn MoveUniverse;
+    sbus_msg_handler_fn crash_now;
+};
+
+/* ------------------------------------------------------------------------
  * DBus Interface Metadata
  *
  * These structure definitions are filled in with the information about
-- 
1.9.0

-------------- next part --------------
>From 8a9eeb64548823bbd79f7622572e3c4f0b19ebe4 Mon Sep 17 00:00:00 2001
From: Stef Walter <stefw at redhat.com>
Date: Fri, 10 Jan 2014 11:50:43 +0100
Subject: [PATCH 3/6] nss: Stop using one DBus interface with totally different
 methods
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This is an incorrect use of DBus, where we use a single interface
name with completely different sets of methods.

Easily fixed.

Once the vtable stuff is in use then this would be automatically
detected and fail to build.

Reviewed-by: Jakub Hrozek <jhrozek at redhat.com>
Reviewed-by: Sumit Bose <sbose at redhat.com>
Reviewed-by: Lukáš Slebodník <lslebodn at redhat.com>
Reviewed-by: Simo Sorce <simo at redhat.com>
(cherry picked from commit 3e7d7af1953410f3f009bf3b2e481a46fb80de83)
---
 src/providers/data_provider.h    | 1 +
 src/providers/data_provider_be.c | 2 +-
 src/responder/nss/nsssrv.c       | 2 +-
 3 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/providers/data_provider.h b/src/providers/data_provider.h
index 77190fbdde9e253bf364b7ae9a242952adae7dbb..616ff9e162b16561ea9e5d36738ed8e808a1ba27 100644
--- a/src/providers/data_provider.h
+++ b/src/providers/data_provider.h
@@ -59,6 +59,7 @@
 /* this is a reverse method sent from providers to
  * the nss responder to tell it to update the mmap
  * cache */
+#define DP_REV_INTERFACE "org.freedesktop.sssd.dataprovider_rev"
 #define DP_REV_METHOD_UPDATE_CACHE "updateCache"
 #define DP_REV_METHOD_INITGR_CHECK "initgrCheck"
 
diff --git a/src/providers/data_provider_be.c b/src/providers/data_provider_be.c
index 212dc111b26eae9d8dc17eea4055a79c7febe017..df0e54293ea571e6083abf3b5e09ce0a8351f10b 100644
--- a/src/providers/data_provider_be.c
+++ b/src/providers/data_provider_be.c
@@ -852,7 +852,7 @@ static void acctinfo_initgroups_callback(struct be_req *be_req,
     /* Set up null request */
     msg = dbus_message_new_method_call(NULL,
                                        DP_PATH,
-                                       DP_INTERFACE,
+                                       DP_REV_INTERFACE,
                                        DP_REV_METHOD_INITGR_CHECK);
     if (!msg) {
         DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory?!\n");
diff --git a/src/responder/nss/nsssrv.c b/src/responder/nss/nsssrv.c
index 9e1de0603b0ab9c4c249b087cdd9caddb01ac6c1..a99cc73bb7ec2f41b5a57fc9802bc91ab4d284ec 100644
--- a/src/responder/nss/nsssrv.c
+++ b/src/responder/nss/nsssrv.c
@@ -379,7 +379,7 @@ static struct sbus_method nss_dp_methods[] = {
 };
 
 struct sbus_interface nss_dp_interface = {
-    DP_INTERFACE,
+    DP_REV_INTERFACE,
     DP_PATH,
     SBUS_DEFAULT_VTABLE,
     nss_dp_methods,
-- 
1.9.0

-------------- next part --------------
>From 548ab9afb3fa354420eda5efac9b0e1d83a1cf2b Mon Sep 17 00:00:00 2001
From: Stef Walter <stefw at redhat.com>
Date: Fri, 10 Jan 2014 08:58:12 +0100
Subject: [PATCH 4/6] sbus: Rework sbus to use interface metadata and vtables
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Previous commits added support for interface metadata and
handler vtables. This commit ports sbus_dbus_connection to
use them.

Port the internal uses of dbus to use the new scheme in a
very minimal way. Further cleanup is possible here.

This commit provides basic definitions of the internal
dbus interfaces. The interfaces aren't fully defined, as the
handlers will continue to unpack manually, and often overload
DBus methods with different arguments (which is rather
unorthodox, but not the end of the world).

Reviewed-by: Jakub Hrozek <jhrozek at redhat.com>
Reviewed-by: Sumit Bose <sbose at redhat.com>
Reviewed-by: Lukáš Slebodník <lslebodn at redhat.com>
Reviewed-by: Simo Sorce <simo at redhat.com>
(cherry picked from commit 769347ad4d35d43488eb98f980143495b0db415d)
---
 Makefile.am                                   | 30 +++++++--
 src/monitor/monitor.c                         | 12 ++--
 src/monitor/monitor_iface.xml                 | 41 ++++++++++++
 src/monitor/monitor_iface_generated.c         | 92 +++++++++++++++++++++++++++
 src/monitor/monitor_iface_generated.h         | 56 ++++++++++++++++
 src/monitor/monitor_interfaces.h              |  2 +
 src/providers/data_provider.h                 |  1 +
 src/providers/data_provider_be.c              | 43 ++++++-------
 src/providers/data_provider_iface.xml         | 38 +++++++++++
 src/providers/data_provider_iface_generated.c | 86 +++++++++++++++++++++++++
 src/providers/data_provider_iface_generated.h | 55 ++++++++++++++++
 src/providers/proxy/proxy_child.c             | 16 +++--
 src/providers/proxy/proxy_init.c              | 16 +++--
 src/responder/autofs/autofssrv.c              | 35 ++++++----
 src/responder/nss/nsssrv.c                    | 33 +++++-----
 src/responder/pac/pacsrv.c                    | 34 ++++++----
 src/responder/pam/pamsrv.c                    | 34 ++++++----
 src/responder/ssh/sshsrv.c                    | 34 ++++++----
 src/responder/sudo/sudosrv.c                  | 34 ++++++----
 src/sbus/sssd_dbus.h                          | 11 +---
 src/sbus/sssd_dbus_connection.c               | 65 ++++++++++++-------
 21 files changed, 605 insertions(+), 163 deletions(-)
 create mode 100644 src/monitor/monitor_iface.xml
 create mode 100644 src/monitor/monitor_iface_generated.c
 create mode 100644 src/monitor/monitor_iface_generated.h
 create mode 100644 src/providers/data_provider_iface.xml
 create mode 100644 src/providers/data_provider_iface_generated.c
 create mode 100644 src/providers/data_provider_iface_generated.h

diff --git a/Makefile.am b/Makefile.am
index 22a38eb217951dc8f3d4a6bd08d5b96769e7f9bf..0289645c9d52616938f6d693a7857f06837f0f08 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -314,7 +314,11 @@ SSSD_RESPONDER_OBJ = \
     src/responder/common/responder_common.c \
     src/responder/common/responder_dp.c \
     src/responder/common/responder_packet.c \
-    src/responder/common/responder_get_domains.c
+    src/responder/common/responder_get_domains.c \
+    src/monitor/monitor_iface_generated.c \
+    src/monitor/monitor_iface_generated.h \
+    src/providers/data_provider_iface_generated.c \
+    src/providers/data_provider_iface_generated.h
 
 SSSD_TOOLS_OBJ = \
     src/tools/sss_sync_ops.c \
@@ -646,7 +650,9 @@ include_HEADERS = \
 # Yes, the goal here is that the generated files end up in $(srcdir)
 # not $(builddir). Always use $(srcdir) here.
 CODEGEN_XML = \
-    $(srcdir)/src/tests/sbus_codegen_tests.xml
+    $(srcdir)/src/tests/sbus_codegen_tests.xml \
+    $(srcdir)/src/monitor/monitor_iface.xml \
+    $(srcdir)/src/providers/data_provider_iface.xml
 
 SBUS_CODEGEN = src/sbus/sbus_codegen
 
@@ -677,7 +683,9 @@ sssd_SOURCES = \
     src/monitor/monitor.c \
     src/monitor/monitor_netlink.c \
     src/confdb/confdb_setup.c \
-    src/util/nscd.c
+    src/util/nscd.c \
+    src/monitor/monitor_iface_generated.c \
+    src/monitor/monitor_iface_generated.h
 sssd_LDADD = \
     $(SSSD_LIBS) \
     $(INOTIFY_LIBS) \
@@ -770,6 +778,10 @@ sssd_be_SOURCES = \
     src/providers/dp_dyndns.c \
     src/providers/dp_ptask.c \
     src/providers/dp_refresh.c \
+    src/monitor/monitor_iface_generated.c \
+    src/monitor/monitor_iface_generated.h \
+    src/providers/data_provider_iface_generated.c \
+    src/providers/data_provider_iface_generated.h \
     $(SSSD_FAILOVER_OBJ)
 sssd_be_LDADD = \
     $(LIBADD_DL) \
@@ -1173,6 +1185,10 @@ simple_access_tests_SOURCES = \
     src/providers/data_provider_callbacks.c \
     src/providers/dp_ptask.c \
     src/providers/dp_refresh.c \
+    src/monitor/monitor_iface_generated.c \
+    src/monitor/monitor_iface_generated.h \
+    src/providers/data_provider_iface_generated.c \
+    src/providers/data_provider_iface_generated.h \
     $(SSSD_FAILOVER_OBJ)
 simple_access_tests_CFLAGS = \
     $(AM_CFLAGS) \
@@ -1738,7 +1754,9 @@ libsss_proxy_la_SOURCES = \
     src/providers/proxy/proxy_id.c \
     src/providers/proxy/proxy_netgroup.c \
     src/providers/proxy/proxy_services.c \
-    src/providers/proxy/proxy_auth.c
+    src/providers/proxy/proxy_auth.c \
+    src/providers/data_provider_iface_generated.c \
+    src/providers/data_provider_iface_generated.h
 libsss_proxy_la_CFLAGS = \
     $(AM_CFLAGS)
 libsss_proxy_la_LIBADD = \
@@ -1935,7 +1953,9 @@ ldap_child_LDADD = \
     $(KRB5_LIBS)
 
 proxy_child_SOURCES = \
-    src/providers/proxy/proxy_child.c
+    src/providers/proxy/proxy_child.c \
+    src/providers/data_provider_iface_generated.c \
+    src/providers/data_provider_iface_generated.h
 proxy_child_CFLAGS = \
     $(AM_CFLAGS) \
     $(POPT_CFLAGS)
diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c
index 9c54e98e7c6ebe7daf4065a510b9a45542a436f5..20892d0bb743427c808339e69bde492940e44af1 100644
--- a/src/monitor/monitor.c
+++ b/src/monitor/monitor.c
@@ -525,17 +525,15 @@ static int add_services_startup_timeout(struct mt_ctx *ctx)
     return EOK;
 }
 
-struct sbus_method monitor_methods[] = {
-    { MON_SRV_METHOD_VERSION, get_monitor_version },
-    { MON_SRV_METHOD_REGISTER, client_registration },
-    { NULL, NULL }
+struct mon_srv_iface monitor_methods = {
+    { &mon_srv_iface_meta, 0 },
+    .getVersion = get_monitor_version,
+    .RegisterService = client_registration,
 };
 
 struct sbus_interface monitor_server_interface = {
-    MON_SRV_INTERFACE,
     MON_SRV_PATH,
-    SBUS_DEFAULT_VTABLE,
-    monitor_methods,
+    &monitor_methods.vtable,
     NULL
 };
 
diff --git a/src/monitor/monitor_iface.xml b/src/monitor/monitor_iface.xml
new file mode 100644
index 0000000000000000000000000000000000000000..506b749c8a12b2c137b433e168beaf38f0b2c97f
--- /dev/null
+++ b/src/monitor/monitor_iface.xml
@@ -0,0 +1,41 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+    <interface name="org.freedesktop.sssd.monitor">
+        <annotation value="mon_srv_iface" name="org.freedesktop.DBus.GLib.CSymbol"/>
+        <method name="getVersion">
+            <!-- manual argument parsing -->
+        </method>
+        <method name="RegisterService">
+            <!-- manual argument parsing -->
+        </method>
+    </interface>
+
+    <interface name="org.freedesktop.sssd.service">
+        <annotation value="mon_cli_iface" name="org.freedesktop.DBus.GLib.CSymbol"/>
+        <method name="ping">
+            <!-- no arguments -->
+        </method>
+        <method name="resInit">
+            <!-- no arguments -->
+        </method>
+        <method name="shutDown">
+            <!-- no arguments -->
+        </method>
+        <method name="goOffline">
+            <!-- no arguments -->
+        </method>
+        <method name="resetOffline">
+            <!-- no arguments -->
+        </method>
+        <method name="rotateLogs">
+            <!-- no arguments -->
+        </method>
+        <method name="clearMemcache">
+            <!-- no arguments -->
+        </method>
+        <method name="clearEnumCache">
+            <!-- no arguments -->
+        </method>
+    </interface>
+</node>
diff --git a/src/monitor/monitor_iface_generated.c b/src/monitor/monitor_iface_generated.c
new file mode 100644
index 0000000000000000000000000000000000000000..81a7c247ac94fd3e22ee7133f2cd582ad7a4bdc6
--- /dev/null
+++ b/src/monitor/monitor_iface_generated.c
@@ -0,0 +1,92 @@
+/* The following definitions are auto-generated from monitor_iface.xml */
+
+#include "util/util.h"
+#include "sbus/sssd_dbus.h"
+#include "sbus/sssd_dbus_meta.h"
+#include "monitor_iface_generated.h"
+
+/* methods for org.freedesktop.sssd.monitor */
+const struct sbus_method_meta mon_srv_iface__methods[] = {
+    {
+        "getVersion", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct mon_srv_iface, getVersion),
+    },
+    {
+        "RegisterService", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct mon_srv_iface, RegisterService),
+    },
+    { NULL, }
+};
+
+/* interface info for org.freedesktop.sssd.monitor */
+const struct sbus_interface_meta mon_srv_iface_meta = {
+    "org.freedesktop.sssd.monitor", /* name */
+    mon_srv_iface__methods,
+    NULL, /* no signals */
+    NULL, /* no propetries */
+};
+
+/* methods for org.freedesktop.sssd.service */
+const struct sbus_method_meta mon_cli_iface__methods[] = {
+    {
+        "ping", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct mon_cli_iface, ping),
+    },
+    {
+        "resInit", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct mon_cli_iface, resInit),
+    },
+    {
+        "shutDown", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct mon_cli_iface, shutDown),
+    },
+    {
+        "goOffline", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct mon_cli_iface, goOffline),
+    },
+    {
+        "resetOffline", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct mon_cli_iface, resetOffline),
+    },
+    {
+        "rotateLogs", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct mon_cli_iface, rotateLogs),
+    },
+    {
+        "clearMemcache", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct mon_cli_iface, clearMemcache),
+    },
+    {
+        "clearEnumCache", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct mon_cli_iface, clearEnumCache),
+    },
+    { NULL, }
+};
+
+/* interface info for org.freedesktop.sssd.service */
+const struct sbus_interface_meta mon_cli_iface_meta = {
+    "org.freedesktop.sssd.service", /* name */
+    mon_cli_iface__methods,
+    NULL, /* no signals */
+    NULL, /* no propetries */
+};
diff --git a/src/monitor/monitor_iface_generated.h b/src/monitor/monitor_iface_generated.h
new file mode 100644
index 0000000000000000000000000000000000000000..cde774985b3ef7f6ffd575ae67dc3cb2ed29aa2f
--- /dev/null
+++ b/src/monitor/monitor_iface_generated.h
@@ -0,0 +1,56 @@
+/* The following declarations are auto-generated from monitor_iface.xml */
+
+#ifndef __MONITOR_IFACE_XML__
+#define __MONITOR_IFACE_XML__
+
+#include "sbus/sssd_dbus.h"
+
+/* ------------------------------------------------------------------------
+ * DBus Vtable handler structures
+ *
+ * These structures are filled in by implementors of the different
+ * dbus interfaces to handle method calls.
+ *
+ * Handler functions of type sbus_msg_handler_fn accept raw messages,
+ * other handlers will be typed appropriately. If a handler that is
+ * set to NULL is invoked it will result in a
+ * org.freedesktop.DBus.Error.NotSupported error for the caller.
+ */
+
+/* vtable for org.freedesktop.sssd.monitor */
+struct mon_srv_iface {
+    struct sbus_vtable vtable; /* derive from sbus_vtable */
+    sbus_msg_handler_fn getVersion;
+    sbus_msg_handler_fn RegisterService;
+};
+
+/* vtable for org.freedesktop.sssd.service */
+struct mon_cli_iface {
+    struct sbus_vtable vtable; /* derive from sbus_vtable */
+    sbus_msg_handler_fn ping;
+    sbus_msg_handler_fn resInit;
+    sbus_msg_handler_fn shutDown;
+    sbus_msg_handler_fn goOffline;
+    sbus_msg_handler_fn resetOffline;
+    sbus_msg_handler_fn rotateLogs;
+    sbus_msg_handler_fn clearMemcache;
+    sbus_msg_handler_fn clearEnumCache;
+};
+
+/* ------------------------------------------------------------------------
+ * DBus Interface Metadata
+ *
+ * These structure definitions are filled in with the information about
+ * the interfaces, methods, properties and so on.
+ *
+ * The actual definitions are found in the accompanying C file next
+ * to this header.
+ */
+
+/* interface info for org.freedesktop.sssd.monitor */
+extern const struct sbus_interface_meta mon_srv_iface_meta;
+
+/* interface info for org.freedesktop.sssd.service */
+extern const struct sbus_interface_meta mon_cli_iface_meta;
+
+#endif /* __MONITOR_IFACE_XML__ */
diff --git a/src/monitor/monitor_interfaces.h b/src/monitor/monitor_interfaces.h
index f27c7d00c9b920a463a7ea7ab3281422053ad5a6..308642f7859bb3a06856420db7a8552f4b5b76dd 100644
--- a/src/monitor/monitor_interfaces.h
+++ b/src/monitor/monitor_interfaces.h
@@ -21,6 +21,8 @@
 
 #include "sbus/sssd_dbus.h"
 
+#include "monitor/monitor_iface_generated.h"
+
 /*** Monitor ***/
 
 #define MONITOR_VERSION 0x0001
diff --git a/src/providers/data_provider.h b/src/providers/data_provider.h
index 616ff9e162b16561ea9e5d36738ed8e808a1ba27..b5f6e1b386f22b2b8e99e6ba92865790873d895a 100644
--- a/src/providers/data_provider.h
+++ b/src/providers/data_provider.h
@@ -42,6 +42,7 @@
 #include "sbus/sbus_client.h"
 #include "sss_client/sss_cli.h"
 #include "util/authtok.h"
+#include "providers/data_provider_iface_generated.h"
 
 #define DATA_PROVIDER_VERSION 0x0001
 #define DATA_PROVIDER_PIPE "private/sbus-dp"
diff --git a/src/providers/data_provider_be.c b/src/providers/data_provider_be.c
index df0e54293ea571e6083abf3b5e09ce0a8351f10b..b4f3e91750ac14bc2984b06f05ee9f134190ebec 100644
--- a/src/providers/data_provider_be.c
+++ b/src/providers/data_provider_be.c
@@ -63,20 +63,21 @@ static int data_provider_reset_offline(DBusMessage *message,
 static int data_provider_logrotate(DBusMessage *message,
                                 struct sbus_connection *conn);
 
-struct sbus_method monitor_be_methods[] = {
-    { MON_CLI_METHOD_PING, monitor_common_pong },
-    { MON_CLI_METHOD_RES_INIT, data_provider_res_init },
-    { MON_CLI_METHOD_OFFLINE, data_provider_go_offline },
-    { MON_CLI_METHOD_RESET_OFFLINE, data_provider_reset_offline },
-    { MON_CLI_METHOD_ROTATE, data_provider_logrotate },
-    { NULL, NULL }
+struct mon_cli_iface monitor_be_methods = {
+    { &mon_cli_iface_meta, 0 },
+    .ping = monitor_common_pong,
+    .resInit = data_provider_res_init,
+    .shutDown = NULL,
+    .goOffline = data_provider_go_offline,
+    .resetOffline = data_provider_reset_offline,
+    .rotateLogs = data_provider_logrotate,
+    .clearMemcache = NULL,
+    .clearEnumCache = NULL,
 };
 
 struct sbus_interface monitor_be_interface = {
-    MONITOR_INTERFACE,
     MONITOR_PATH,
-    SBUS_DEFAULT_VTABLE,
-    monitor_be_methods,
+    &monitor_be_methods.vtable,
     NULL
 };
 
@@ -88,22 +89,20 @@ static int be_autofs_handler(DBusMessage *message, struct sbus_connection *conn)
 static int be_host_handler(DBusMessage *message, struct sbus_connection *conn);
 static int be_get_subdomains(DBusMessage *message, struct sbus_connection *conn);
 
-struct sbus_method be_methods[] = {
-    { DP_METHOD_REGISTER, client_registration },
-    { DP_METHOD_GETACCTINFO, be_get_account_info },
-    { DP_METHOD_PAMHANDLER, be_pam_handler },
-    { DP_METHOD_SUDOHANDLER, be_sudo_handler },
-    { DP_METHOD_AUTOFSHANDLER, be_autofs_handler },
-    { DP_METHOD_HOSTHANDLER, be_host_handler },
-    { DP_METHOD_GETDOMAINS, be_get_subdomains },
-    { NULL, NULL }
+struct data_provider_iface be_methods = {
+    { &data_provider_iface_meta, 0 },
+    .RegisterService = client_registration,
+    .pamHandler = be_pam_handler,
+    .sudoHandler = be_sudo_handler,
+    .autofsHandler = be_autofs_handler,
+    .hostHandler = be_host_handler,
+    .getDomains = be_get_subdomains,
+    .getAccountInfo = be_get_account_info,
 };
 
 struct sbus_interface be_interface = {
-    DP_INTERFACE,
     DP_PATH,
-    SBUS_DEFAULT_VTABLE,
-    be_methods,
+    &be_methods.vtable,
     NULL
 };
 
diff --git a/src/providers/data_provider_iface.xml b/src/providers/data_provider_iface.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1f349649316cdadfed747ff4b8bedddb27c3ec6f
--- /dev/null
+++ b/src/providers/data_provider_iface.xml
@@ -0,0 +1,38 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+    <interface name="org.freedesktop.sssd.dataprovider">
+        <annotation value="data_provider_iface" name="org.freedesktop.DBus.GLib.CSymbol"/>
+        <method name="RegisterService">
+            <!-- arguments parsed manually -->
+        </method>
+        <method name="pamHandler">
+            <!-- arguments parsed manually -->
+        </method>
+        <method name="sudoHandler">
+            <!-- arguments parsed manually -->
+        </method>
+        <method name="autofsHandler">
+            <!-- arguments parsed manually -->
+        </method>
+        <method name="hostHandler">
+            <!-- arguments parsed manually -->
+        </method>
+        <method name="getDomains">
+            <!-- arguments parsed manually -->
+        </method>
+        <method name="getAccountInfo">
+            <!-- arguments parsed manually -->
+        </method>
+    </interface>
+
+    <interface name="org.freedesktop.sssd.dataprovider_rev">
+        <annotation value="data_provider_rev_iface" name="org.freedesktop.DBus.GLib.CSymbol"/>
+        <method name="updateCache">
+            <!-- manual argument parsing -->
+        </method>
+        <method name="initgrCheck">
+            <!-- manual argument parsing -->
+        </method>
+    </interface>
+</node>
diff --git a/src/providers/data_provider_iface_generated.c b/src/providers/data_provider_iface_generated.c
new file mode 100644
index 0000000000000000000000000000000000000000..517b7adfe74b7387427427d09a7620ca6d036833
--- /dev/null
+++ b/src/providers/data_provider_iface_generated.c
@@ -0,0 +1,86 @@
+/* The following definitions are auto-generated from data_provider_iface.xml */
+
+#include "util/util.h"
+#include "sbus/sssd_dbus.h"
+#include "sbus/sssd_dbus_meta.h"
+#include "data_provider_iface_generated.h"
+
+/* methods for org.freedesktop.sssd.dataprovider */
+const struct sbus_method_meta data_provider_iface__methods[] = {
+    {
+        "RegisterService", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct data_provider_iface, RegisterService),
+    },
+    {
+        "pamHandler", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct data_provider_iface, pamHandler),
+    },
+    {
+        "sudoHandler", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct data_provider_iface, sudoHandler),
+    },
+    {
+        "autofsHandler", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct data_provider_iface, autofsHandler),
+    },
+    {
+        "hostHandler", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct data_provider_iface, hostHandler),
+    },
+    {
+        "getDomains", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct data_provider_iface, getDomains),
+    },
+    {
+        "getAccountInfo", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct data_provider_iface, getAccountInfo),
+    },
+    { NULL, }
+};
+
+/* interface info for org.freedesktop.sssd.dataprovider */
+const struct sbus_interface_meta data_provider_iface_meta = {
+    "org.freedesktop.sssd.dataprovider", /* name */
+    data_provider_iface__methods,
+    NULL, /* no signals */
+    NULL, /* no propetries */
+};
+
+/* methods for org.freedesktop.sssd.dataprovider_rev */
+const struct sbus_method_meta data_provider_rev_iface__methods[] = {
+    {
+        "updateCache", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct data_provider_rev_iface, updateCache),
+    },
+    {
+        "initgrCheck", /* name */
+        NULL, /* no in_args */
+        NULL, /* no out_args */
+        offsetof(struct data_provider_rev_iface, initgrCheck),
+    },
+    { NULL, }
+};
+
+/* interface info for org.freedesktop.sssd.dataprovider_rev */
+const struct sbus_interface_meta data_provider_rev_iface_meta = {
+    "org.freedesktop.sssd.dataprovider_rev", /* name */
+    data_provider_rev_iface__methods,
+    NULL, /* no signals */
+    NULL, /* no propetries */
+};
diff --git a/src/providers/data_provider_iface_generated.h b/src/providers/data_provider_iface_generated.h
new file mode 100644
index 0000000000000000000000000000000000000000..0851964b1ca5be2b9d9ee92a263852c098c89b38
--- /dev/null
+++ b/src/providers/data_provider_iface_generated.h
@@ -0,0 +1,55 @@
+/* The following declarations are auto-generated from data_provider_iface.xml */
+
+#ifndef __DATA_PROVIDER_IFACE_XML__
+#define __DATA_PROVIDER_IFACE_XML__
+
+#include "sbus/sssd_dbus.h"
+
+/* ------------------------------------------------------------------------
+ * DBus Vtable handler structures
+ *
+ * These structures are filled in by implementors of the different
+ * dbus interfaces to handle method calls.
+ *
+ * Handler functions of type sbus_msg_handler_fn accept raw messages,
+ * other handlers will be typed appropriately. If a handler that is
+ * set to NULL is invoked it will result in a
+ * org.freedesktop.DBus.Error.NotSupported error for the caller.
+ */
+
+/* vtable for org.freedesktop.sssd.dataprovider */
+struct data_provider_iface {
+    struct sbus_vtable vtable; /* derive from sbus_vtable */
+    sbus_msg_handler_fn RegisterService;
+    sbus_msg_handler_fn pamHandler;
+    sbus_msg_handler_fn sudoHandler;
+    sbus_msg_handler_fn autofsHandler;
+    sbus_msg_handler_fn hostHandler;
+    sbus_msg_handler_fn getDomains;
+    sbus_msg_handler_fn getAccountInfo;
+};
+
+/* vtable for org.freedesktop.sssd.dataprovider_rev */
+struct data_provider_rev_iface {
+    struct sbus_vtable vtable; /* derive from sbus_vtable */
+    sbus_msg_handler_fn updateCache;
+    sbus_msg_handler_fn initgrCheck;
+};
+
+/* ------------------------------------------------------------------------
+ * DBus Interface Metadata
+ *
+ * These structure definitions are filled in with the information about
+ * the interfaces, methods, properties and so on.
+ *
+ * The actual definitions are found in the accompanying C file next
+ * to this header.
+ */
+
+/* interface info for org.freedesktop.sssd.dataprovider */
+extern const struct sbus_interface_meta data_provider_iface_meta;
+
+/* interface info for org.freedesktop.sssd.dataprovider_rev */
+extern const struct sbus_interface_meta data_provider_rev_iface_meta;
+
+#endif /* __DATA_PROVIDER_IFACE_XML__ */
diff --git a/src/providers/proxy/proxy_child.c b/src/providers/proxy/proxy_child.c
index 3a0ea02fe8f87919227a6a2d8f6913a7fe06c089..395868087f0c915e889401b80d060751e097296a 100644
--- a/src/providers/proxy/proxy_child.c
+++ b/src/providers/proxy/proxy_child.c
@@ -49,16 +49,20 @@
 
 static int pc_pam_handler(DBusMessage *message, struct sbus_connection *conn);
 
-struct sbus_method pc_methods[] = {
-    { DP_METHOD_PAMHANDLER, pc_pam_handler },
-    { NULL, NULL }
+struct data_provider_iface pc_methods = {
+    { &data_provider_iface_meta, 0 },
+    .RegisterService = NULL,
+    .pamHandler = pc_pam_handler,
+    .sudoHandler = NULL,
+    .autofsHandler = NULL,
+    .hostHandler = NULL,
+    .getDomains = NULL,
+    .getAccountInfo = NULL,
 };
 
 struct sbus_interface pc_interface = {
-    DP_INTERFACE,
     DP_PATH,
-    SBUS_DEFAULT_VTABLE,
-    pc_methods,
+    &pc_methods.vtable,
     NULL
 };
 
diff --git a/src/providers/proxy/proxy_init.c b/src/providers/proxy/proxy_init.c
index ae73fe7025d9108824c2a56d32a65b8638d85bef..60ae4a950fd18648d13b7fe50ef73d9a398ad8d5 100644
--- a/src/providers/proxy/proxy_init.c
+++ b/src/providers/proxy/proxy_init.c
@@ -30,16 +30,20 @@
 static int client_registration(DBusMessage *message,
                                struct sbus_connection *conn);
 
-static struct sbus_method proxy_methods[] = {
-    { DP_METHOD_REGISTER, client_registration },
-    { NULL, NULL }
+static struct data_provider_iface proxy_methods = {
+    { &data_provider_iface_meta, 0 },
+    .RegisterService = client_registration,
+    .pamHandler = NULL,
+    .sudoHandler = NULL,
+    .autofsHandler = NULL,
+    .hostHandler = NULL,
+    .getDomains = NULL,
+    .getAccountInfo = NULL,
 };
 
 struct sbus_interface proxy_interface = {
-    DP_INTERFACE,
     DP_PATH,
-    SBUS_DEFAULT_VTABLE,
-    proxy_methods,
+    &proxy_methods.vtable,
     NULL
 };
 
diff --git a/src/responder/autofs/autofssrv.c b/src/responder/autofs/autofssrv.c
index 12f318eee5ec2b1c0765cb4077a7c7f528918db7..5ce9ae0236d61b6b643cbc0682dc4bb53774b87f 100644
--- a/src/responder/autofs/autofssrv.c
+++ b/src/responder/autofs/autofssrv.c
@@ -32,31 +32,38 @@
 static int autofs_clean_hash_table(DBusMessage *message,
                                    struct sbus_connection *conn);
 
-struct sbus_method monitor_autofs_methods[] = {
-    { MON_CLI_METHOD_PING, monitor_common_pong },
-    { MON_CLI_METHOD_RES_INIT, monitor_common_res_init },
-    { MON_CLI_METHOD_ROTATE, responder_logrotate },
-    { MON_CLI_METHOD_CLEAR_ENUM_CACHE, autofs_clean_hash_table },
-    { NULL, NULL }
+struct mon_cli_iface monitor_autofs_methods = {
+    { &mon_cli_iface_meta, 0 },
+    .ping = monitor_common_pong,
+    .resInit = monitor_common_res_init,
+    .shutDown = NULL,
+    .goOffline = NULL,
+    .resetOffline = NULL,
+    .rotateLogs = responder_logrotate,
+    .clearMemcache = NULL,
+    .clearEnumCache = autofs_clean_hash_table,
 };
 
 struct sbus_interface monitor_autofs_interface = {
-    MONITOR_INTERFACE,
     MONITOR_PATH,
-    SBUS_DEFAULT_VTABLE,
-    monitor_autofs_methods,
+    &monitor_autofs_methods.vtable,
     NULL
 };
 
-static struct sbus_method autofs_dp_methods[] = {
-    { NULL, NULL }
+static struct data_provider_iface autofs_dp_methods = {
+    { &data_provider_iface_meta, 0 },
+    .RegisterService = NULL,
+    .pamHandler = NULL,
+    .sudoHandler = NULL,
+    .autofsHandler = NULL,
+    .hostHandler = NULL,
+    .getDomains = NULL,
+    .getAccountInfo = NULL,
 };
 
 struct sbus_interface autofs_dp_interface = {
-    DP_INTERFACE,
     DP_PATH,
-    SBUS_DEFAULT_VTABLE,
-    autofs_dp_methods,
+    &autofs_dp_methods.vtable,
     NULL
 };
 
diff --git a/src/responder/nss/nsssrv.c b/src/responder/nss/nsssrv.c
index a99cc73bb7ec2f41b5a57fc9802bc91ab4d284ec..05408db59fad12c4475ef796f8a4b6975ec50b6d 100644
--- a/src/responder/nss/nsssrv.c
+++ b/src/responder/nss/nsssrv.c
@@ -60,20 +60,21 @@ static int nss_clear_memcache(DBusMessage *message,
 static int nss_clear_netgroup_hash_table(DBusMessage *message,
                                          struct sbus_connection *conn);
 
-struct sbus_method monitor_nss_methods[] = {
-    { MON_CLI_METHOD_PING, monitor_common_pong },
-    { MON_CLI_METHOD_RES_INIT, monitor_common_res_init },
-    { MON_CLI_METHOD_ROTATE, responder_logrotate },
-    { MON_CLI_METHOD_CLEAR_MEMCACHE, nss_clear_memcache},
-    { MON_CLI_METHOD_CLEAR_ENUM_CACHE, nss_clear_netgroup_hash_table},
-    { NULL, NULL }
+struct mon_cli_iface monitor_nss_methods = {
+    { &mon_cli_iface_meta, 0 },
+    .ping = monitor_common_pong,
+    .resInit = monitor_common_res_init,
+    .shutDown = NULL,
+    .goOffline = NULL,
+    .resetOffline = NULL,
+    .rotateLogs = responder_logrotate,
+    .clearMemcache = nss_clear_memcache,
+    .clearEnumCache = nss_clear_netgroup_hash_table
 };
 
 struct sbus_interface monitor_nss_interface = {
-    MONITOR_INTERFACE,
     MONITOR_PATH,
-    SBUS_DEFAULT_VTABLE,
-    monitor_nss_methods,
+    &monitor_nss_methods.vtable,
     NULL
 };
 
@@ -372,17 +373,15 @@ static int nss_memcache_initgr_check(DBusMessage *message,
     return EOK;
 }
 
-static struct sbus_method nss_dp_methods[] = {
-    { DP_REV_METHOD_UPDATE_CACHE, nss_update_memcache },
-    { DP_REV_METHOD_INITGR_CHECK, nss_memcache_initgr_check },
-    { NULL, NULL }
+static struct data_provider_rev_iface nss_dp_methods = {
+    { &data_provider_rev_iface_meta, 0 },
+    .updateCache = nss_update_memcache,
+    .initgrCheck = nss_memcache_initgr_check
 };
 
 struct sbus_interface nss_dp_interface = {
-    DP_REV_INTERFACE,
     DP_PATH,
-    SBUS_DEFAULT_VTABLE,
-    nss_dp_methods,
+    &nss_dp_methods.vtable,
     NULL
 };
 
diff --git a/src/responder/pac/pacsrv.c b/src/responder/pac/pacsrv.c
index ee64dc8665c791b2a042a114d8515c2563f34173..81eb303ae5b0a311575be64e0e64747d9101d11a 100644
--- a/src/responder/pac/pacsrv.c
+++ b/src/responder/pac/pacsrv.c
@@ -48,30 +48,38 @@
 #define DEFAULT_PAC_FD_LIMIT 8192
 #define DEFAULT_ALLOWED_UIDS "0"
 
-struct sbus_method monitor_pac_methods[] = {
-    { MON_CLI_METHOD_PING, monitor_common_pong },
-    { MON_CLI_METHOD_RES_INIT, monitor_common_res_init },
-    { MON_CLI_METHOD_ROTATE, responder_logrotate },
-    { NULL, NULL }
+struct mon_cli_iface monitor_pac_methods = {
+    { &mon_cli_iface_meta, 0 },
+    .ping = monitor_common_pong,
+    .resInit = monitor_common_res_init,
+    .shutDown = NULL,
+    .goOffline = NULL,
+    .resetOffline = NULL,
+    .rotateLogs = responder_logrotate,
+    .clearMemcache = NULL,
+    .clearEnumCache = NULL,
 };
 
 struct sbus_interface monitor_pac_interface = {
-    MONITOR_INTERFACE,
     MONITOR_PATH,
-    SBUS_DEFAULT_VTABLE,
-    monitor_pac_methods,
+    &monitor_pac_methods.vtable,
     NULL
 };
 
-static struct sbus_method pac_dp_methods[] = {
-    { NULL, NULL }
+static struct data_provider_iface pac_dp_methods = {
+    { &data_provider_iface_meta, 0 },
+    .RegisterService = NULL,
+    .pamHandler = NULL,
+    .sudoHandler = NULL,
+    .autofsHandler = NULL,
+    .hostHandler = NULL,
+    .getDomains = NULL,
+    .getAccountInfo = NULL,
 };
 
 struct sbus_interface pac_dp_interface = {
-    DP_INTERFACE,
     DP_PATH,
-    SBUS_DEFAULT_VTABLE,
-    pac_dp_methods,
+    &pac_dp_methods.vtable,
     NULL
 };
 
diff --git a/src/responder/pam/pamsrv.c b/src/responder/pam/pamsrv.c
index 54416a8d3e59e0ba5eb1bd11fc22626bab19b60b..af1d1493dadcae6f72924a9921ae5c45eb1998d4 100644
--- a/src/responder/pam/pamsrv.c
+++ b/src/responder/pam/pamsrv.c
@@ -47,30 +47,38 @@
 
 #define DEFAULT_PAM_FD_LIMIT 8192
 
-struct sbus_method monitor_pam_methods[] = {
-    { MON_CLI_METHOD_PING, monitor_common_pong },
-    { MON_CLI_METHOD_RES_INIT, monitor_common_res_init },
-    { MON_CLI_METHOD_ROTATE, responder_logrotate },
-    { NULL, NULL }
+struct mon_cli_iface monitor_pam_methods = {
+    { &mon_cli_iface_meta, 0 },
+    .ping = monitor_common_pong,
+    .resInit = monitor_common_res_init,
+    .shutDown = NULL,
+    .goOffline = NULL,
+    .resetOffline = NULL,
+    .rotateLogs = responder_logrotate,
+    .clearMemcache = NULL,
+    .clearEnumCache = NULL,
 };
 
 struct sbus_interface monitor_pam_interface = {
-    MONITOR_INTERFACE,
     MONITOR_PATH,
-    SBUS_DEFAULT_VTABLE,
-    monitor_pam_methods,
+    &monitor_pam_methods.vtable,
     NULL
 };
 
-static struct sbus_method pam_dp_methods[] = {
-        { NULL, NULL }
+static struct data_provider_iface pam_dp_methods = {
+    { &data_provider_iface_meta, 0 },
+    .RegisterService = NULL,
+    .pamHandler = NULL,
+    .sudoHandler = NULL,
+    .autofsHandler = NULL,
+    .hostHandler = NULL,
+    .getDomains = NULL,
+    .getAccountInfo = NULL,
 };
 
 struct sbus_interface pam_dp_interface = {
-    DP_INTERFACE,
     DP_PATH,
-    SBUS_DEFAULT_VTABLE,
-    pam_dp_methods,
+    &pam_dp_methods.vtable,
     NULL
 };
 
diff --git a/src/responder/ssh/sshsrv.c b/src/responder/ssh/sshsrv.c
index ea943afda72fee18ed264a5bb4bfd2cc4bb69753..fb0738f6c8cfb62064659be210d59bfee54827cb 100644
--- a/src/responder/ssh/sshsrv.c
+++ b/src/responder/ssh/sshsrv.c
@@ -28,30 +28,38 @@
 #include "responder/ssh/sshsrv_private.h"
 #include "providers/data_provider.h"
 
-struct sbus_method monitor_ssh_methods[] = {
-    { MON_CLI_METHOD_PING, monitor_common_pong },
-    { MON_CLI_METHOD_RES_INIT, monitor_common_res_init },
-    { MON_CLI_METHOD_ROTATE, responder_logrotate },
-    { NULL, NULL }
+struct mon_cli_iface monitor_ssh_methods = {
+    { &mon_cli_iface_meta, 0 },
+    .ping = monitor_common_pong,
+    .resInit = monitor_common_res_init,
+    .shutDown = NULL,
+    .goOffline = NULL,
+    .resetOffline = NULL,
+    .rotateLogs = responder_logrotate,
+    .clearMemcache = NULL,
+    .clearEnumCache = NULL,
 };
 
 struct sbus_interface monitor_ssh_interface = {
-    MONITOR_INTERFACE,
     MONITOR_PATH,
-    SBUS_DEFAULT_VTABLE,
-    monitor_ssh_methods,
+    &monitor_ssh_methods.vtable,
     NULL
 };
 
-static struct sbus_method ssh_dp_methods[] = {
-    { NULL, NULL }
+static struct data_provider_iface ssh_dp_methods = {
+    { &data_provider_iface_meta, 0 },
+    .RegisterService = NULL,
+    .pamHandler = NULL,
+    .sudoHandler = NULL,
+    .autofsHandler = NULL,
+    .hostHandler = NULL,
+    .getDomains = NULL,
+    .getAccountInfo = NULL,
 };
 
 struct sbus_interface ssh_dp_interface = {
-    DP_INTERFACE,
     DP_PATH,
-    SBUS_DEFAULT_VTABLE,
-    ssh_dp_methods,
+    &ssh_dp_methods.vtable,
     NULL
 };
 
diff --git a/src/responder/sudo/sudosrv.c b/src/responder/sudo/sudosrv.c
index b821c96cd77b17438ed82eb14cfbad46e4bc7cb2..1ad260b3578373664da6aec135a9a3aaa62d4931 100644
--- a/src/responder/sudo/sudosrv.c
+++ b/src/responder/sudo/sudosrv.c
@@ -28,30 +28,38 @@
 #include "responder/sudo/sudosrv_private.h"
 #include "providers/data_provider.h"
 
-struct sbus_method monitor_sudo_methods[] = {
-    { MON_CLI_METHOD_PING, monitor_common_pong },
-    { MON_CLI_METHOD_RES_INIT, monitor_common_res_init },
-    { MON_CLI_METHOD_ROTATE, responder_logrotate },
-    { NULL, NULL }
+struct mon_cli_iface monitor_sudo_methods = {
+    { &mon_cli_iface_meta, 0 },
+    .ping = monitor_common_pong,
+    .resInit = monitor_common_res_init,
+    .shutDown = NULL,
+    .goOffline = NULL,
+    .resetOffline = NULL,
+    .rotateLogs = responder_logrotate,
+    .clearMemcache = NULL,
+    .clearEnumCache = NULL,
 };
 
 struct sbus_interface monitor_sudo_interface = {
-    MONITOR_INTERFACE,
     MONITOR_PATH,
-    SBUS_DEFAULT_VTABLE,
-    monitor_sudo_methods,
+    &monitor_sudo_methods.vtable,
     NULL
 };
 
-static struct sbus_method sudo_dp_methods[] = {
-    { NULL, NULL }
+static struct data_provider_iface sudo_dp_methods = {
+    { &data_provider_iface_meta, 0 },
+    .RegisterService = NULL,
+    .pamHandler = NULL,
+    .sudoHandler = NULL,
+    .autofsHandler = NULL,
+    .hostHandler = NULL,
+    .getDomains = NULL,
+    .getAccountInfo = NULL,
 };
 
 struct sbus_interface sudo_dp_interface = {
-    DP_INTERFACE,
     DP_PATH,
-    SBUS_DEFAULT_VTABLE,
-    sudo_dp_methods,
+    &sudo_dp_methods.vtable,
     NULL
 };
 
diff --git a/src/sbus/sssd_dbus.h b/src/sbus/sssd_dbus.h
index 5e9c1c69ea195a5c32b93c60979feb4554be3d49..3c99b3100e77a259fbdd7f209d2049b855b4bca9 100644
--- a/src/sbus/sssd_dbus.h
+++ b/src/sbus/sssd_dbus.h
@@ -74,18 +74,9 @@ struct sbus_vtable {
 #define DBUS_INTROSPECT_INTERFACE "org.freedesktop.DBus.Introspectable"
 #define DBUS_INTROSPECT_METHOD "Introspect"
 
-#define SBUS_DEFAULT_VTABLE { NULL, sbus_message_handler, NULL, NULL, NULL, NULL }
-
-struct sbus_method {
-    const char *method;
-    sbus_msg_handler_fn fn;
-};
-
 struct sbus_interface {
-    const char *interface;
     const char *path;
-    DBusObjectPathVTable vtable;
-    struct sbus_method *methods;
+    struct sbus_vtable *vtable;
     sbus_msg_handler_fn introspect_fn;
 };
 
diff --git a/src/sbus/sssd_dbus_connection.c b/src/sbus/sssd_dbus_connection.c
index b32164827917de7f37cd1c36dbccf6f265cf4f3e..e3f5e163df1609b1d9fea3540d3eff6c07ea868d 100644
--- a/src/sbus/sssd_dbus_connection.c
+++ b/src/sbus/sssd_dbus_connection.c
@@ -24,10 +24,14 @@
 #include "dbus/dbus.h"
 #include "sbus/sssd_dbus.h"
 #include "sbus/sssd_dbus_private.h"
+#include "sbus/sssd_dbus_meta.h"
 
 /* Types */
 struct dbus_ctx_list;
 
+static DBusObjectPathVTable dbus_object_path_vtable =
+    { NULL, sbus_message_handler, NULL, NULL, NULL, NULL };
+
 struct sbus_interface_p {
     struct sbus_interface_p *prev, *next;
     struct sbus_connection *conn;
@@ -393,6 +397,10 @@ static int sbus_reply_internal_error(DBusMessage *message,
     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
 
+/* Looks up a vtable func, in a struct derived from struct sbus_vtable */
+#define VTABLE_FUNC(vtable, offset) \
+    (*((void **)((char *)(vtable) + (offset))))
+
 /* messsage_handler
  * Receive messages and process them
  */
@@ -401,24 +409,26 @@ DBusHandlerResult sbus_message_handler(DBusConnection *dbus_conn,
                                          void *user_data)
 {
     struct sbus_interface_p *intf_p;
-    const char *method;
+    const char *msg_method;
     const char *path;
     const char *msg_interface;
     DBusMessage *reply = NULL;
-    int i, ret;
-    int found;
+    const struct sbus_method_meta *method;
+    const struct sbus_interface_meta *interface;
+    sbus_msg_handler_fn handler_fn;
+    int ret;
 
     if (!user_data) {
         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
     }
     intf_p = talloc_get_type(user_data, struct sbus_interface_p);
 
-    method = dbus_message_get_member(message);
-    DEBUG(SSSDBG_TRACE_ALL, "Received SBUS method [%s]\n", method);
+    msg_method = dbus_message_get_member(message);
+    DEBUG(SSSDBG_TRACE_ALL, "Received SBUS method [%s]\n", msg_method);
     path = dbus_message_get_path(message);
     msg_interface = dbus_message_get_interface(message);
 
-    if (!method || !path || !msg_interface)
+    if (!msg_method || !path || !msg_interface)
         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
     /* Validate the D-BUS path */
@@ -426,26 +436,33 @@ DBusHandlerResult sbus_message_handler(DBusConnection *dbus_conn,
         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
     /* Validate the method interface */
-    if (strcmp(msg_interface, intf_p->intf->interface) == 0) {
-        found = 0;
-        for (i = 0; intf_p->intf->methods[i].method != NULL; i++) {
-            if (strcmp(method, intf_p->intf->methods[i].method) == 0) {
-                found = 1;
-                ret = intf_p->intf->methods[i].fn(message, intf_p->conn);
-                if (ret != EOK) {
-                    return sbus_reply_internal_error(message, intf_p->conn);
-                }
-                break;
-            }
-        }
+    interface = intf_p->intf->vtable->meta;
+    if (strcmp(msg_interface, interface->name) == 0) {
+        handler_fn = NULL;
+        method = sbus_meta_find_method(interface, msg_method);
+        if (method && method->vtable_offset)
+            handler_fn = VTABLE_FUNC(intf_p->intf->vtable, method->vtable_offset);
 
-        if (!found) {
+        if (!method) {
             /* Reply DBUS_ERROR_UNKNOWN_METHOD */
             DEBUG(SSSDBG_CRIT_FAILURE,
-                  "No matching method found for %s.\n", method);
+                  "No matching method found for %s.\n", msg_method);
             reply = dbus_message_new_error(message, DBUS_ERROR_UNKNOWN_METHOD, NULL);
             sbus_conn_send_reply(intf_p->conn, reply);
             dbus_message_unref(reply);
+
+        } else if (!handler_fn) {
+            /* Reply DBUS_ERROR_NOT_SUPPORTED */
+            DEBUG(SSSDBG_CRIT_FAILURE,
+                  "No handler provided found for %s.\n", msg_method);
+            reply = dbus_message_new_error(message, DBUS_ERROR_NOT_SUPPORTED, NULL);
+            sbus_conn_send_reply(intf_p->conn, reply);
+            dbus_message_unref(reply);
+
+        } else {
+            ret = handler_fn(message, intf_p->conn);
+            if (ret != EOK)
+                return sbus_reply_internal_error(message, intf_p->conn);
         }
     }
     else {
@@ -453,7 +470,7 @@ DBusHandlerResult sbus_message_handler(DBusConnection *dbus_conn,
          * This is usually only useful for system bus connections
          */
         if (strcmp(msg_interface, DBUS_INTROSPECT_INTERFACE) == 0 &&
-            strcmp(method, DBUS_INTROSPECT_METHOD) == 0)
+            strcmp(msg_method, DBUS_INTROSPECT_METHOD) == 0)
         {
             if (intf_p->intf->introspect_fn) {
                 /* If we have been asked for introspection data and we have
@@ -482,7 +499,7 @@ int sbus_conn_add_interface(struct sbus_connection *conn,
     dbus_bool_t dbret;
     const char *path;
 
-    if (!conn || !intf || !intf->vtable.message_function) {
+    if (!conn || !intf || !intf->vtable || !intf->vtable->meta) {
         return EINVAL;
     }
 
@@ -504,7 +521,7 @@ int sbus_conn_add_interface(struct sbus_connection *conn,
     DLIST_ADD(conn->intf_list, intf_p);
 
     dbret = dbus_connection_register_object_path(conn->dbus.conn,
-                                                 path, &intf->vtable, intf_p);
+                                                 path, &dbus_object_path_vtable, intf_p);
     if (!dbret) {
         DEBUG(SSSDBG_FATAL_FAILURE,
               "Could not register object path to the connection.\n");
@@ -585,7 +602,7 @@ static void sbus_reconnect(struct tevent_context *ev,
         while (iter) {
             dbret = dbus_connection_register_object_path(conn->dbus.conn,
                                                          iter->intf->path,
-                                                         &iter->intf->vtable,
+                                                         &dbus_object_path_vtable,
                                                          iter);
             if (!dbret) {
                 DEBUG(SSSDBG_FATAL_FAILURE,
-- 
1.9.0

-------------- next part --------------
>From 251469551a943ab5a0ff04c8dabad3ad0b8ee7bb Mon Sep 17 00:00:00 2001
From: Stef Walter <stefw at redhat.com>
Date: Fri, 10 Jan 2014 11:08:16 +0100
Subject: [PATCH 5/6] sbus: Generate constants from interface definitions
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This is not strictly necessary, but avoids duplicating data
in mulitple places, and makes the interface definitions
benefit dbus callers (a little).

After applying this commit you may need to 'make clean' as
the codegen has changed.

Reviewed-by: Jakub Hrozek <jhrozek at redhat.com>
Reviewed-by: Sumit Bose <sbose at redhat.com>
Reviewed-by: Lukáš Slebodník <lslebodn at redhat.com>
Reviewed-by: Simo Sorce <simo at redhat.com>
(cherry picked from commit c2cc119de8eac712c040b3993f41c967ff2278de)
---
 src/monitor/monitor_iface_generated.h         | 22 ++++++++++++++++++++++
 src/providers/data_provider_iface_generated.h | 21 +++++++++++++++++++++
 src/sbus/sbus_codegen                         | 21 +++++++++++++++++++++
 src/tests/sbus_codegen_tests.c                | 15 +++++++++++++++
 src/tests/sbus_codegen_tests_generated.h      | 17 +++++++++++++++++
 5 files changed, 96 insertions(+)

diff --git a/src/monitor/monitor_iface_generated.h b/src/monitor/monitor_iface_generated.h
index cde774985b3ef7f6ffd575ae67dc3cb2ed29aa2f..bd556616cdc6ccf212a7c5abb4f8f8d3a4f6f158 100644
--- a/src/monitor/monitor_iface_generated.h
+++ b/src/monitor/monitor_iface_generated.h
@@ -6,6 +6,28 @@
 #include "sbus/sssd_dbus.h"
 
 /* ------------------------------------------------------------------------
+ * DBus Constants
+ *
+ * Various constants of interface and method names mostly for use by clients
+ */
+
+/* constants for org.freedesktop.sssd.monitor */
+#define MON_SRV_IFACE "org.freedesktop.sssd.monitor"
+#define MON_SRV_IFACE_GETVERSION "getVersion"
+#define MON_SRV_IFACE_REGISTERSERVICE "RegisterService"
+
+/* constants for org.freedesktop.sssd.service */
+#define MON_CLI_IFACE "org.freedesktop.sssd.service"
+#define MON_CLI_IFACE_PING "ping"
+#define MON_CLI_IFACE_RESINIT "resInit"
+#define MON_CLI_IFACE_SHUTDOWN "shutDown"
+#define MON_CLI_IFACE_GOOFFLINE "goOffline"
+#define MON_CLI_IFACE_RESETOFFLINE "resetOffline"
+#define MON_CLI_IFACE_ROTATELOGS "rotateLogs"
+#define MON_CLI_IFACE_CLEARMEMCACHE "clearMemcache"
+#define MON_CLI_IFACE_CLEARENUMCACHE "clearEnumCache"
+
+/* ------------------------------------------------------------------------
  * DBus Vtable handler structures
  *
  * These structures are filled in by implementors of the different
diff --git a/src/providers/data_provider_iface_generated.h b/src/providers/data_provider_iface_generated.h
index 0851964b1ca5be2b9d9ee92a263852c098c89b38..fc37aa8cbbb39bf23b29e2d3ba5ffe160cb6ab41 100644
--- a/src/providers/data_provider_iface_generated.h
+++ b/src/providers/data_provider_iface_generated.h
@@ -6,6 +6,27 @@
 #include "sbus/sssd_dbus.h"
 
 /* ------------------------------------------------------------------------
+ * DBus Constants
+ *
+ * Various constants of interface and method names mostly for use by clients
+ */
+
+/* constants for org.freedesktop.sssd.dataprovider */
+#define DATA_PROVIDER_IFACE "org.freedesktop.sssd.dataprovider"
+#define DATA_PROVIDER_IFACE_REGISTERSERVICE "RegisterService"
+#define DATA_PROVIDER_IFACE_PAMHANDLER "pamHandler"
+#define DATA_PROVIDER_IFACE_SUDOHANDLER "sudoHandler"
+#define DATA_PROVIDER_IFACE_AUTOFSHANDLER "autofsHandler"
+#define DATA_PROVIDER_IFACE_HOSTHANDLER "hostHandler"
+#define DATA_PROVIDER_IFACE_GETDOMAINS "getDomains"
+#define DATA_PROVIDER_IFACE_GETACCOUNTINFO "getAccountInfo"
+
+/* constants for org.freedesktop.sssd.dataprovider_rev */
+#define DATA_PROVIDER_REV_IFACE "org.freedesktop.sssd.dataprovider_rev"
+#define DATA_PROVIDER_REV_IFACE_UPDATECACHE "updateCache"
+#define DATA_PROVIDER_REV_IFACE_INITGRCHECK "initgrCheck"
+
+/* ------------------------------------------------------------------------
  * DBus Vtable handler structures
  *
  * These structures are filled in by implementors of the different
diff --git a/src/sbus/sbus_codegen b/src/sbus/sbus_codegen
index 86aeff094e2f0a5e713fc7c78fca5372eda71ce9..d2fe5073d9314385a09b9074d61d2b9ab8efbb24 100755
--- a/src/sbus/sbus_codegen
+++ b/src/sbus/sbus_codegen
@@ -295,6 +295,17 @@ def header_vtable(iface, methods):
 
     out("};")
 
+def header_constants(iface):
+    out("")
+    out("/* constants for %s */", iface.name)
+    out("#define %s \"%s\"", iface.c_name().upper(), iface.name)
+    for meth in iface.methods:
+        out("#define %s \"%s\"", meth.fq_c_name().upper(), meth.name)
+    for sig in iface.signals:
+        out("#define %s \"%s\"", sig.fq_c_name().upper(), sig.name)
+    for prop in iface.properties:
+        out("#define %s \"%s\"", prop.fq_c_name().upper(), prop.name)
+
 def generate_header(ifaces, filename):
     basename = os.path.basename(filename)
     guard = "__%s__" % re.sub(r'([^_A-Z0-9])', "_", basename.upper())
@@ -308,6 +319,16 @@ def generate_header(ifaces, filename):
 
     out("")
     out("/* ------------------------------------------------------------------------")
+    out(" * DBus Constants")
+    out(" *")
+    out(" * Various constants of interface and method names mostly for use by clients")
+    out(" */")
+
+    for iface in ifaces:
+        header_constants(iface)
+
+    out("")
+    out("/* ------------------------------------------------------------------------")
     out(" * DBus Vtable handler structures")
     out(" *")
     out(" * These structures are filled in by implementors of the different")
diff --git a/src/tests/sbus_codegen_tests.c b/src/tests/sbus_codegen_tests.c
index 39856fac79ef1b36b069e128754c6a124e6136e6..7386756cd1ed37fe5362634e9432bba5893d6ee3 100644
--- a/src/tests/sbus_codegen_tests.c
+++ b/src/tests/sbus_codegen_tests.c
@@ -144,6 +144,20 @@ START_TEST(test_vtable)
 }
 END_TEST
 
+START_TEST(test_constants)
+{
+    ck_assert_str_eq(COM_PLANETEXPRESS_SHIP, "com.planetexpress.Ship");
+    ck_assert_str_eq(COM_PLANETEXPRESS_SHIP_MOVEUNIVERSE, "MoveUniverse");
+    ck_assert_str_eq(COM_PLANETEXPRESS_SHIP_CRASH_NOW, "Crash");
+    ck_assert_str_eq(COM_PLANETEXPRESS_SHIP_BECAMESENTIENT, "BecameSentient");
+    ck_assert_str_eq(COM_PLANETEXPRESS_SHIP_COLOR, "Color");
+
+    /* constants for com.planetexpress.Pilot */
+    ck_assert_str_eq(TEST_PILOT, "com.planetexpress.Pilot");
+    ck_assert_str_eq(TEST_PILOT_FULLNAME, "FullName");
+}
+END_TEST
+
 Suite *create_suite(void)
 {
     Suite *s = suite_create("sbus_codegen");
@@ -156,6 +170,7 @@ Suite *create_suite(void)
     tcase_add_test(tc, test_properties);
     tcase_add_test(tc, test_signals);
     tcase_add_test(tc, test_vtable);
+    tcase_add_test(tc, test_constants);
 
     /* Add all test cases to the test suite */
     suite_add_tcase(s, tc);
diff --git a/src/tests/sbus_codegen_tests_generated.h b/src/tests/sbus_codegen_tests_generated.h
index 3f762158812189669b2b53aa1d8692bf86c0c10b..f41eca74bbb83dc3fc59ef6a5e8bfcdd9f800acd 100644
--- a/src/tests/sbus_codegen_tests_generated.h
+++ b/src/tests/sbus_codegen_tests_generated.h
@@ -6,6 +6,23 @@
 #include "sbus/sssd_dbus.h"
 
 /* ------------------------------------------------------------------------
+ * DBus Constants
+ *
+ * Various constants of interface and method names mostly for use by clients
+ */
+
+/* constants for com.planetexpress.Ship */
+#define COM_PLANETEXPRESS_SHIP "com.planetexpress.Ship"
+#define COM_PLANETEXPRESS_SHIP_MOVEUNIVERSE "MoveUniverse"
+#define COM_PLANETEXPRESS_SHIP_CRASH_NOW "Crash"
+#define COM_PLANETEXPRESS_SHIP_BECAMESENTIENT "BecameSentient"
+#define COM_PLANETEXPRESS_SHIP_COLOR "Color"
+
+/* constants for com.planetexpress.Pilot */
+#define TEST_PILOT "com.planetexpress.Pilot"
+#define TEST_PILOT_FULLNAME "FullName"
+
+/* ------------------------------------------------------------------------
  * DBus Vtable handler structures
  *
  * These structures are filled in by implementors of the different
-- 
1.9.0

-------------- next part --------------
>From f459765e0b308d71af86fbfb29d3342bdb10af15 Mon Sep 17 00:00:00 2001
From: Stef Walter <stefw at redhat.com>
Date: Fri, 10 Jan 2014 11:23:33 +0100
Subject: [PATCH 6/6] sbus: Use constants to make dbus calls
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This allows us to remove duplicated information, and have the
compiler check that when an method name is changed or removed
the callers are updated.

Reviewed-by: Jakub Hrozek <jhrozek at redhat.com>
Reviewed-by: Sumit Bose <sbose at redhat.com>
Reviewed-by: Lukáš Slebodník <lslebodn at redhat.com>
Reviewed-by: Simo Sorce <simo at redhat.com>
(cherry picked from commit b668c77874c6fed325471bdcf5954979a0d734e2)
---
 src/monitor/monitor.c                        | 18 +++++++++---------
 src/monitor/monitor_interfaces.h             | 17 -----------------
 src/monitor/monitor_sbus.c                   |  4 ++--
 src/providers/data_provider.h                | 17 -----------------
 src/providers/data_provider_be.c             |  4 ++--
 src/providers/data_provider_iface.xml        |  6 ++++++
 src/providers/dp_auth_util.c                 |  4 ++--
 src/providers/proxy/proxy_auth.c             |  4 ++--
 src/providers/proxy/proxy_child.c            |  4 ++--
 src/responder/autofs/autofssrv_dp.c          |  4 ++--
 src/responder/common/responder_dp.c          |  4 ++--
 src/responder/common/responder_get_domains.c |  4 ++--
 src/responder/pam/pamsrv_dp.c                |  4 ++--
 src/responder/ssh/sshsrv_dp.c                |  4 ++--
 src/responder/sudo/sudosrv_dp.c              |  4 ++--
 15 files changed, 37 insertions(+), 65 deletions(-)

diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c
index 20892d0bb743427c808339e69bde492940e44af1..12c3a7702787fafcc1ea2244935f2213b46f6953 100644
--- a/src/monitor/monitor.c
+++ b/src/monitor/monitor.c
@@ -734,7 +734,7 @@ static int service_signal(struct mt_svc *svc, const char *svc_signal)
 
     msg = dbus_message_new_method_call(NULL,
                                        MONITOR_PATH,
-                                       MONITOR_INTERFACE,
+                                       MON_CLI_IFACE,
                                        svc_signal);
     if (!msg) {
         DEBUG(SSSDBG_FATAL_FAILURE,"Out of memory?!\n");
@@ -753,27 +753,27 @@ static int service_signal(struct mt_svc *svc, const char *svc_signal)
 
 static int service_signal_dns_reload(struct mt_svc *svc)
 {
-    return service_signal(svc, MON_CLI_METHOD_RES_INIT);
+    return service_signal(svc, MON_CLI_IFACE_RESINIT);
 }
 static int service_signal_offline(struct mt_svc *svc)
 {
-    return service_signal(svc, MON_CLI_METHOD_OFFLINE);
+    return service_signal(svc, MON_CLI_IFACE_GOOFFLINE);
 }
 static int service_signal_reset_offline(struct mt_svc *svc)
 {
-    return service_signal(svc, MON_CLI_METHOD_RESET_OFFLINE);
+    return service_signal(svc, MON_CLI_IFACE_RESETOFFLINE);
 }
 static int service_signal_rotate(struct mt_svc *svc)
 {
-    return service_signal(svc, MON_CLI_METHOD_ROTATE);
+    return service_signal(svc, MON_CLI_IFACE_ROTATELOGS);
 }
 static int service_signal_clear_memcache(struct mt_svc *svc)
 {
-    return service_signal(svc, MON_CLI_METHOD_CLEAR_MEMCACHE);
+    return service_signal(svc, MON_CLI_IFACE_CLEARMEMCACHE);
 }
 static int service_signal_clear_enum_cache(struct mt_svc *svc)
 {
-    return service_signal(svc, MON_CLI_METHOD_CLEAR_ENUM_CACHE);
+    return service_signal(svc, MON_CLI_IFACE_CLEARENUMCACHE);
 }
 
 static int check_domain_ranges(struct sss_domain_info *domains)
@@ -2377,8 +2377,8 @@ static int service_send_ping(struct mt_svc *svc)
      */
     msg = dbus_message_new_method_call(NULL,
                                        MONITOR_PATH,
-                                       MONITOR_INTERFACE,
-                                       MON_CLI_METHOD_PING);
+                                       MON_CLI_IFACE,
+                                       MON_CLI_IFACE_PING);
     if (!msg) {
         DEBUG(SSSDBG_FATAL_FAILURE,"Out of memory?!\n");
         talloc_zfree(svc->conn);
diff --git a/src/monitor/monitor_interfaces.h b/src/monitor/monitor_interfaces.h
index 308642f7859bb3a06856420db7a8552f4b5b76dd..ef4254a5f59620fe1789135248358bfa6ffe7530 100644
--- a/src/monitor/monitor_interfaces.h
+++ b/src/monitor/monitor_interfaces.h
@@ -29,26 +29,9 @@
 
 /*** Monitor SRV Interface ***/
 #define MON_SRV_PATH "/org/freedesktop/sssd/monitor"
-#define MON_SRV_INTERFACE "org.freedesktop.sssd.monitor"
-
-/* Monitor SRV Methods */
-#define MON_SRV_METHOD_VERSION "getVersion"
-#define MON_SRV_METHOD_REGISTER "RegisterService"
 
 /*** Monitor CLI Interface ***/
 #define MONITOR_PATH "/org/freedesktop/sssd/service"
-#define MONITOR_INTERFACE "org.freedesktop.sssd.service"
-
-/* Monitor CLI Methods */
-#define MON_CLI_METHOD_IDENTITY "getIdentity"
-#define MON_CLI_METHOD_PING "ping"
-#define MON_CLI_METHOD_SHUTDOWN "shutDown"
-#define MON_CLI_METHOD_RES_INIT "resInit"
-#define MON_CLI_METHOD_OFFLINE "goOffline" /* Applicable only to providers */
-#define MON_CLI_METHOD_RESET_OFFLINE "resetOffline" /* Applicable only to providers */
-#define MON_CLI_METHOD_ROTATE "rotateLogs"
-#define MON_CLI_METHOD_CLEAR_MEMCACHE "clearMemcache"
-#define MON_CLI_METHOD_CLEAR_ENUM_CACHE "clearEnumCache"
 
 #define SSSD_SERVICE_PIPE "private/sbus-monitor"
 
diff --git a/src/monitor/monitor_sbus.c b/src/monitor/monitor_sbus.c
index 4b0e221e8df1debbbf715b468c23489509ccc2fe..b1550bcdd1927d62c55e85d0cca66aad0523c3ab 100644
--- a/src/monitor/monitor_sbus.c
+++ b/src/monitor/monitor_sbus.c
@@ -119,8 +119,8 @@ int monitor_common_send_id(struct sbus_connection *conn,
     /* create the message */
     msg = dbus_message_new_method_call(NULL,
                                        MON_SRV_PATH,
-                                       MON_SRV_INTERFACE,
-                                       MON_SRV_METHOD_REGISTER);
+                                       MON_SRV_IFACE,
+                                       MON_SRV_IFACE_REGISTERSERVICE);
     if (msg == NULL) {
         DEBUG(SSSDBG_FATAL_FAILURE, "Out of memory?!\n");
         return ENOMEM;
diff --git a/src/providers/data_provider.h b/src/providers/data_provider.h
index b5f6e1b386f22b2b8e99e6ba92865790873d895a..0714356d34fd93f9fc37eb15d96a182cdd3079ff 100644
--- a/src/providers/data_provider.h
+++ b/src/providers/data_provider.h
@@ -47,23 +47,8 @@
 #define DATA_PROVIDER_VERSION 0x0001
 #define DATA_PROVIDER_PIPE "private/sbus-dp"
 
-#define DP_INTERFACE "org.freedesktop.sssd.dataprovider"
 #define DP_PATH "/org/freedesktop/sssd/dataprovider"
 
-#define DP_METHOD_REGISTER "RegisterService"
-#define DP_METHOD_GETACCTINFO "getAccountInfo"
-#define DP_METHOD_SUDOHANDLER "sudoHandler"
-#define DP_METHOD_AUTOFSHANDLER "autofsHandler"
-#define DP_METHOD_HOSTHANDLER "hostHandler"
-#define DP_METHOD_GETDOMAINS "getDomains"
-
-/* this is a reverse method sent from providers to
- * the nss responder to tell it to update the mmap
- * cache */
-#define DP_REV_INTERFACE "org.freedesktop.sssd.dataprovider_rev"
-#define DP_REV_METHOD_UPDATE_CACHE "updateCache"
-#define DP_REV_METHOD_INITGR_CHECK "initgrCheck"
-
 /**
  * @defgroup pamHandler PAM DBUS request
  * @ingroup sss_pam
@@ -124,8 +109,6 @@
  */
 
 
-#define DP_METHOD_PAMHANDLER "pamHandler"
-
 /**
  * @}
  */ /* end of group pamHandler */
diff --git a/src/providers/data_provider_be.c b/src/providers/data_provider_be.c
index b4f3e91750ac14bc2984b06f05ee9f134190ebec..15b0d1d966cd01f114bfc4e56920f23e4a7866d1 100644
--- a/src/providers/data_provider_be.c
+++ b/src/providers/data_provider_be.c
@@ -851,8 +851,8 @@ static void acctinfo_initgroups_callback(struct be_req *be_req,
     /* Set up null request */
     msg = dbus_message_new_method_call(NULL,
                                        DP_PATH,
-                                       DP_REV_INTERFACE,
-                                       DP_REV_METHOD_INITGR_CHECK);
+                                       DATA_PROVIDER_REV_IFACE,
+                                       DATA_PROVIDER_REV_IFACE_INITGRCHECK);
     if (!msg) {
         DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory?!\n");
         ret = ENOMEM;
diff --git a/src/providers/data_provider_iface.xml b/src/providers/data_provider_iface.xml
index 1f349649316cdadfed747ff4b8bedddb27c3ec6f..90397f1b2a1dabc3b45005340cd503b0746c7bb5 100644
--- a/src/providers/data_provider_iface.xml
+++ b/src/providers/data_provider_iface.xml
@@ -26,6 +26,12 @@
         </method>
     </interface>
 
+    <!--
+      this is a reverse method sent from providers to
+      the nss responder to tell it to update the mmap
+      cache
+    -->
+
     <interface name="org.freedesktop.sssd.dataprovider_rev">
         <annotation value="data_provider_rev_iface" name="org.freedesktop.DBus.GLib.CSymbol"/>
         <method name="updateCache">
diff --git a/src/providers/dp_auth_util.c b/src/providers/dp_auth_util.c
index 00bd58d9ea36555ca5b0e380e0cfb5f7f3485e0c..f8a30c5d4e6da7ce6ac28723032241e2458ea473 100644
--- a/src/providers/dp_auth_util.c
+++ b/src/providers/dp_auth_util.c
@@ -377,8 +377,8 @@ int dp_common_send_id(struct sbus_connection *conn, uint16_t version,
     /* create the message */
     msg = dbus_message_new_method_call(NULL,
                                        DP_PATH,
-                                       DP_INTERFACE,
-                                       DP_METHOD_REGISTER);
+                                       DATA_PROVIDER_IFACE,
+                                       DATA_PROVIDER_IFACE_REGISTERSERVICE);
     if (msg == NULL) {
         DEBUG(SSSDBG_FATAL_FAILURE, "Out of memory?!\n");
         return ENOMEM;
diff --git a/src/providers/proxy/proxy_auth.c b/src/providers/proxy/proxy_auth.c
index b281851265e902085cd3e51dc9de0221c4a9cc0f..24ed0ccdbe937d5e61d304d22777290a3fc65162 100644
--- a/src/providers/proxy/proxy_auth.c
+++ b/src/providers/proxy/proxy_auth.c
@@ -602,8 +602,8 @@ static struct tevent_req *proxy_pam_conv_send(TALLOC_CTX *mem_ctx,
 
     msg = dbus_message_new_method_call(NULL,
                                        DP_PATH,
-                                       DP_INTERFACE,
-                                       DP_METHOD_PAMHANDLER);
+                                       DATA_PROVIDER_IFACE,
+                                       DATA_PROVIDER_IFACE_PAMHANDLER);
     if (msg == NULL) {
         DEBUG(SSSDBG_CRIT_FAILURE, "dbus_message_new_method_call failed.\n");
         talloc_zfree(req);
diff --git a/src/providers/proxy/proxy_child.c b/src/providers/proxy/proxy_child.c
index 395868087f0c915e889401b80d060751e097296a..46b55b9b84a232db752360466933679ebfc3583f 100644
--- a/src/providers/proxy/proxy_child.c
+++ b/src/providers/proxy/proxy_child.c
@@ -432,8 +432,8 @@ int proxy_child_send_id(struct sbus_connection *conn,
     /* create the message */
     msg = dbus_message_new_method_call(NULL,
                                        DP_PATH,
-                                       DP_INTERFACE,
-                                       DP_METHOD_REGISTER);
+                                       DATA_PROVIDER_IFACE,
+                                       DATA_PROVIDER_IFACE_REGISTERSERVICE);
     if (msg == NULL) {
         DEBUG(SSSDBG_FATAL_FAILURE, "Out of memory?!\n");
         return ENOMEM;
diff --git a/src/responder/autofs/autofssrv_dp.c b/src/responder/autofs/autofssrv_dp.c
index 975692aadf86c495720abfa9ce0a1c7778d95883..041f0629eafadb92fc6b8ec7190830a2662b40a0 100644
--- a/src/responder/autofs/autofssrv_dp.c
+++ b/src/responder/autofs/autofssrv_dp.c
@@ -118,8 +118,8 @@ sss_dp_get_autofs_msg(void *pvt)
 
     msg = dbus_message_new_method_call(NULL,
                                        DP_PATH,
-                                       DP_INTERFACE,
-                                       DP_METHOD_AUTOFSHANDLER);
+                                       DATA_PROVIDER_IFACE,
+                                       DATA_PROVIDER_IFACE_AUTOFSHANDLER);
     if (msg == NULL) {
         DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory?!\n");
         return NULL;
diff --git a/src/responder/common/responder_dp.c b/src/responder/common/responder_dp.c
index a9b4ae23a3233f69723798751d2875cfa78ed66e..df7455ce3ead4d84ff124ca54f5b74273c77a6d4 100644
--- a/src/responder/common/responder_dp.c
+++ b/src/responder/common/responder_dp.c
@@ -588,8 +588,8 @@ sss_dp_get_account_msg(void *pvt)
 
     msg = dbus_message_new_method_call(NULL,
                                        DP_PATH,
-                                       DP_INTERFACE,
-                                       DP_METHOD_GETACCTINFO);
+                                       DATA_PROVIDER_IFACE,
+                                       DATA_PROVIDER_IFACE_GETACCOUNTINFO);
     if (msg == NULL) {
         talloc_free(filter);
         DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory?!\n");
diff --git a/src/responder/common/responder_get_domains.c b/src/responder/common/responder_get_domains.c
index ba9a0905fe82f46998814fefc1f91bba2382d967..23b274b52a6e704afd41686f3bb2491698aea3eb 100644
--- a/src/responder/common/responder_get_domains.c
+++ b/src/responder/common/responder_get_domains.c
@@ -94,8 +94,8 @@ sss_dp_get_domains_msg(void *pvt)
 
     msg = dbus_message_new_method_call(NULL,
                                        DP_PATH,
-                                       DP_INTERFACE,
-                                       DP_METHOD_GETDOMAINS);
+                                       DATA_PROVIDER_IFACE,
+                                       DATA_PROVIDER_IFACE_GETDOMAINS);
     if (msg == NULL) {
         DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory?!\n");
         return NULL;
diff --git a/src/responder/pam/pamsrv_dp.c b/src/responder/pam/pamsrv_dp.c
index 4e79eee879cf337301ecd8f1f63d6172b98e4992..8871f198be60d853619e9f3ac6292871755c4af5 100644
--- a/src/responder/pam/pamsrv_dp.c
+++ b/src/responder/pam/pamsrv_dp.c
@@ -128,8 +128,8 @@ int pam_dp_send_req(struct pam_auth_req *preq, int timeout)
 
     msg = dbus_message_new_method_call(NULL,
                                        DP_PATH,
-                                       DP_INTERFACE,
-                                       DP_METHOD_PAMHANDLER);
+                                       DATA_PROVIDER_IFACE,
+                                       DATA_PROVIDER_IFACE_PAMHANDLER);
     if (msg == NULL) {
         DEBUG(SSSDBG_FATAL_FAILURE,"Out of memory?!\n");
         return ENOMEM;
diff --git a/src/responder/ssh/sshsrv_dp.c b/src/responder/ssh/sshsrv_dp.c
index fa18c0f34e618e392f8f71abd77cf54758b99037..fb5e413de847f3287fdcb4a491fb230417ee1862 100644
--- a/src/responder/ssh/sshsrv_dp.c
+++ b/src/responder/ssh/sshsrv_dp.c
@@ -125,8 +125,8 @@ sss_dp_get_ssh_host_msg(void *pvt)
 
     msg = dbus_message_new_method_call(NULL,
                                        DP_PATH,
-                                       DP_INTERFACE,
-                                       DP_METHOD_HOSTHANDLER);
+                                       DATA_PROVIDER_IFACE,
+                                       DATA_PROVIDER_IFACE_HOSTHANDLER);
     if (msg == NULL) {
         DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory?!\n");
         talloc_free(filter);
diff --git a/src/responder/sudo/sudosrv_dp.c b/src/responder/sudo/sudosrv_dp.c
index 483533cccd1915e6566513f622749f9c4249be54..18e51a92728df38af7ce960f5ef545647840cb25 100644
--- a/src/responder/sudo/sudosrv_dp.c
+++ b/src/responder/sudo/sudosrv_dp.c
@@ -141,8 +141,8 @@ sss_dp_get_sudoers_msg(void *pvt)
 
     msg = dbus_message_new_method_call(NULL,
                                        DP_PATH,
-                                       DP_INTERFACE,
-                                       DP_METHOD_SUDOHANDLER);
+                                       DATA_PROVIDER_IFACE,
+                                       DATA_PROVIDER_IFACE_SUDOHANDLER);
     if (msg == NULL) {
         DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory?!\n");
         return NULL;
-- 
1.9.0



More information about the sssd-devel mailing list