1  /*
2   * WPA Supplicant / dbus-based control interface
3   * Copyright (c) 2006, Dan Williams <dcbw@redhat.com> and Red Hat, Inc.
4   * Copyright (c) 2009, Witold Sowa <witold.sowa@gmail.com>
5   *
6   * This software may be distributed under the terms of the BSD license.
7   * See README for more details.
8   */
9  
10  #ifndef WPA_DBUS_CTRL_H
11  #define WPA_DBUS_CTRL_H
12  
13  #include <dbus/dbus.h>
14  
15  struct wpa_signal_info;
16  
17  typedef DBusMessage * (*WPADBusMethodHandler)(DBusMessage *message,
18  					      void *user_data);
19  typedef void (*WPADBusArgumentFreeFunction)(void *handler_arg);
20  
21  struct wpa_dbus_property_desc;
22  typedef dbus_bool_t (*WPADBusPropertyAccessor)(
23  	const struct wpa_dbus_property_desc *property_desc,
24  	DBusMessageIter *iter, DBusError *error, void *user_data);
25  #define DECLARE_ACCESSOR(f) \
26  dbus_bool_t f(const struct wpa_dbus_property_desc *property_desc, \
27  	      DBusMessageIter *iter, DBusError *error, void *user_data)
28  
29  struct wpa_dbus_object_desc {
30  	DBusConnection *connection;
31  	char *path;
32  
33  	/* list of methods, properties and signals registered with object */
34  	const struct wpa_dbus_method_desc *methods;
35  	const struct wpa_dbus_signal_desc *signals;
36  	const struct wpa_dbus_property_desc *properties;
37  
38  	/* property changed flags */
39  	u8 *prop_changed_flags;
40  
41  	/* argument for method handlers and properties
42  	 * getter and setter functions */
43  	void *user_data;
44  	/* function used to free above argument */
45  	WPADBusArgumentFreeFunction user_data_free_func;
46  };
47  
48  enum dbus_arg_direction { ARG_IN, ARG_OUT };
49  
50  struct wpa_dbus_argument {
51  	char *name;
52  	char *type;
53  	enum dbus_arg_direction dir;
54  };
55  
56  #define END_ARGS { NULL, NULL, ARG_IN }
57  
58  /**
59   * struct wpa_dbus_method_desc - DBus method description
60   */
61  struct wpa_dbus_method_desc {
62  	/* method name */
63  	const char *dbus_method;
64  	/* method interface */
65  	const char *dbus_interface;
66  	/* method handling function */
67  	WPADBusMethodHandler method_handler;
68  	/* array of arguments */
69  	struct wpa_dbus_argument args[4];
70  };
71  
72  /**
73   * struct wpa_dbus_signal_desc - DBus signal description
74   */
75  struct wpa_dbus_signal_desc {
76  	/* signal name */
77  	const char *dbus_signal;
78  	/* signal interface */
79  	const char *dbus_interface;
80  	/* array of arguments */
81  	struct wpa_dbus_argument args[4];
82  };
83  
84  /**
85   * struct wpa_dbus_property_desc - DBus property description
86   */
87  struct wpa_dbus_property_desc {
88  	/* property name */
89  	const char *dbus_property;
90  	/* property interface */
91  	const char *dbus_interface;
92  	/* property type signature in DBus type notation */
93  	const char *type;
94  	/* property getter function */
95  	WPADBusPropertyAccessor getter;
96  	/* property setter function */
97  	WPADBusPropertyAccessor setter;
98  	/* other data */
99  	const char *data;
100  };
101  
102  
103  #define WPAS_DBUS_OBJECT_PATH_MAX 150
104  #define WPAS_DBUS_INTERFACE_MAX 150
105  #define WPAS_DBUS_METHOD_SIGNAL_PROP_MAX 50
106  #define WPAS_DBUS_AUTH_MODE_MAX 64
107  
108  #define WPA_DBUS_INTROSPECTION_INTERFACE "org.freedesktop.DBus.Introspectable"
109  #define WPA_DBUS_INTROSPECTION_METHOD "Introspect"
110  #define WPA_DBUS_PROPERTIES_INTERFACE "org.freedesktop.DBus.Properties"
111  #define WPA_DBUS_PROPERTIES_GET "Get"
112  #define WPA_DBUS_PROPERTIES_SET "Set"
113  #define WPA_DBUS_PROPERTIES_GETALL "GetAll"
114  
115  void free_dbus_object_desc(struct wpa_dbus_object_desc *obj_dsc);
116  
117  int wpa_dbus_ctrl_iface_init(struct wpas_dbus_priv *iface, char *dbus_path,
118  			     char *dbus_service,
119  			     struct wpa_dbus_object_desc *obj_desc);
120  
121  int wpa_dbus_register_object_per_iface(
122  	struct wpas_dbus_priv *ctrl_iface,
123  	const char *path, const char *ifname,
124  	struct wpa_dbus_object_desc *obj_desc);
125  
126  int wpa_dbus_unregister_object_per_iface(
127  	struct wpas_dbus_priv *ctrl_iface,
128  	const char *path);
129  
130  dbus_bool_t wpa_dbus_get_object_properties(struct wpas_dbus_priv *iface,
131  					   const char *path,
132  					   const char *interface,
133  					   DBusMessageIter *iter);
134  
135  
136  void wpa_dbus_flush_all_changed_properties(DBusConnection *con);
137  
138  void wpa_dbus_flush_object_changed_properties(DBusConnection *con,
139  					      const char *path);
140  
141  void wpa_dbus_mark_property_changed(struct wpas_dbus_priv *iface,
142  				    const char *path, const char *interface,
143  				    const char *property);
144  
145  DBusMessage * wpa_dbus_introspect(DBusMessage *message,
146  				  struct wpa_dbus_object_desc *obj_dsc);
147  
148  char * wpas_dbus_new_decompose_object_path(const char *path, const char *sep,
149  					   char **item);
150  
151  DBusMessage *wpas_dbus_reply_new_from_error(DBusMessage *message,
152  					    DBusError *error,
153  					    const char *fallback_name,
154  					    const char *fallback_string);
155  
156  int wpas_dbus_new_from_signal_information(DBusMessageIter *iter,
157  					  struct wpa_signal_info *si);
158  
159  #endif /* WPA_DBUS_CTRL_H */
160