00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifdef HAVE_CONFIG_H
00027 # include <config.h>
00028 #endif
00029
00030 #include <stdlib.h>
00031
00032 #include "mntdbus.h"
00033 #include "errmanager.h"
00034 #include "libmnt/libmnt.h"
00035 #include "dbug_mem.h"
00036
00037
00051 char *mntdbus_getenv(char *name)
00052 {
00053 char *value = NULL;
00054
00055 value = getenv(name);
00056 if (value == NULL) {
00057 MSG_ERR("No '%s' in environment found!", name);
00058 return NULL;
00059 }
00060 if (strlen(value)==0) {
00061 MSG_ERR("'%s' is empty!", name);
00062 return NULL;
00063 }
00064 return value;
00065 }
00066
00067
00072 DBusConnection *mntdbus_init(void)
00073 {
00074 DBusConnection *conn = NULL;
00075 DBusError error;
00076
00077
00078 dbus_error_init(&error);
00079 conn = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
00080 if (conn==NULL) {
00081 MSG_ERR("Couldn't connect to DBUS, error %s: %s",
00082 error.name, error.message);
00083 goto error;
00084 }
00085
00086
00087 if (!dbus_bus_service_exists(conn, DBUS_SERVICE_MNT, &error)) {
00088 MSG_ERR("Service '%s' doesn't exist !\n", DBUS_SERVICE_MNT);
00089 goto error;
00090 }
00091
00092 if (dbus_bus_acquire_service(conn, DBUS_SERVICE_MNT, 0, &error) == -1) {
00093 MSG_ERR("Error Acquiring service '" DBUS_SERVICE_MNT "'\n");
00094 if (dbus_error_is_set(&error)) {
00095 MSG_ERR("Can't acquire '" DBUS_SERVICE_MNT "' service, error %s: %s'",
00096 error.name, error.message);
00097 }
00098 goto error;
00099 }
00100
00101 goto cleanup;
00102
00103 error:
00104 if (conn != NULL) {
00105 dbus_connection_disconnect(conn);
00106 }
00107 conn = NULL;
00108
00109 cleanup:
00110 if (dbus_error_is_set(&error)) {
00111 dbus_error_free(&error);
00112 }
00113
00114 return conn;
00115 }
00116
00117
00122 void mntdbus_quit(DBusConnection* conn)
00123 {
00124
00125 if (conn == NULL) {
00126 MSG_ERR("Connection is NULL ! Cannot disconnect.");
00127 return;
00128 }
00129
00130 dbus_connection_disconnect(conn);
00131
00132 return;
00133 }
00134
00135
00145 int _mntdbus_signal(DBusConnection* conn, char *signalname, char *subsystem, char *devname)
00146 {
00147 DBusMessage *message = NULL;
00148 DBusMessageIter it;
00149 char *dbuspath = NULL;
00150 char *dbusinterface = NULL;
00151
00152
00153 if (conn == NULL) {
00154 MSG_ERR("Connection is NULL ! Cannot send device signal ('%s', '%s', '%s').",
00155 signalname, subsystem, devname);
00156 return -1;
00157 }
00158
00159
00160 if (strcmp(subsystem, "block") == 0) {
00161 dbuspath = DBUS_PATH_MNT_BLOCK;
00162 dbusinterface = DBUS_INTERFACE_MNT_BLOCK;
00163 } else if (strcmp(subsystem, "disc") == 0) {
00164 dbuspath = DBUS_PATH_MNT_DISC;
00165 dbusinterface = DBUS_INTERFACE_MNT_DISC;
00166 } else if (strcmp(subsystem, "tty") == 0) {
00167 dbuspath = DBUS_PATH_MNT_TTY;
00168 dbusinterface = DBUS_INTERFACE_MNT_TTY;
00169 }
00170
00171
00172 if ((dbuspath==NULL) || (dbusinterface==NULL)) {
00173 return -1;
00174 }
00175
00176
00177 message = dbus_message_new_signal(
00178 dbuspath,
00179 dbusinterface,
00180 signalname);
00181 if (message==NULL) {
00182 MSG_EMERG("Out of memory");
00183 return -1;
00184 }
00185
00186
00187 dbus_message_iter_init(message, &it);
00188 dbus_message_iter_append_string(&it, devname);
00189
00190
00191 if (!dbus_connection_send(conn, message, NULL)) {
00192 MSG_EMERG("error broadcasting message");
00193 return -1;
00194 }
00195
00196 dbus_message_unref(message);
00197
00198 dbus_connection_flush(conn);
00199
00200 return 0;
00201 }
00202
00203
00211 int mntdbus_add(DBusConnection* conn, char *subsystem, char *devname)
00212 {
00213 MSG_DEBUG("mntdbus_add('%s', '%s') called.", subsystem, devname);
00214
00215
00216 if (conn == NULL) {
00217 MSG_ERR("Connection is NULL ! Cannot send Add('%s', '%s').",
00218 subsystem, devname);
00219 return -1;
00220 }
00221
00222
00223 return _mntdbus_signal(conn, "Add", subsystem, devname);
00224 }
00225
00226
00234 int mntdbus_remove(DBusConnection* conn, char *subsystem, char *devname)
00235 {
00236 MSG_DEBUG("mntdbus_remove('%s', '%s') called.", subsystem, devname);
00237
00238
00239 if (conn == NULL) {
00240 MSG_ERR("Connection is NULL ! Cannot send Remove('%s', '%s').",
00241 subsystem, devname);
00242 return -1;
00243 }
00244
00245
00246 return _mntdbus_signal(conn, "Remove", subsystem, devname);
00247 }
00248
00249