blob: afad93b61517466ef041c2157533106aa88b5537 [file] [log] [blame]
/*
* Copyright (C) 2015 Red Hat, Inc.
*
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
*/
#include "lib.h"
#include "toolcontext.h"
#include "lvmnotify.h"
#define LVM_DBUS_DESTINATION "com.redhat.lvmdbus1"
#define LVM_DBUS_PATH "/com/redhat/lvmdbus1/Manager"
#define LVM_DBUS_INTERFACE "com.redhat.lvmdbus1.Manager"
#ifdef NOTIFYDBUS_SUPPORT
#include <systemd/sd-bus.h>
int lvmnotify_is_supported(void)
{
return 1;
}
void lvmnotify_send(struct cmd_context *cmd)
{
sd_bus *bus = NULL;
sd_bus_message *m = NULL;
sd_bus_error error = SD_BUS_ERROR_NULL;
const char *cmd_name;
int ret;
int result = 0;
if (!cmd->vg_notify && !cmd->lv_notify && !cmd->pv_notify)
return;
cmd->vg_notify = 0;
cmd->lv_notify = 0;
cmd->pv_notify = 0;
cmd_name = get_cmd_name();
ret = sd_bus_open_system(&bus);
if (ret < 0) {
log_debug_dbus("Failed to connect to dbus: %d", ret);
return;
}
log_debug_dbus("Nofify dbus at %s.", LVM_DBUS_DESTINATION);
ret = sd_bus_call_method(bus,
LVM_DBUS_DESTINATION,
LVM_DBUS_PATH,
LVM_DBUS_INTERFACE,
"ExternalEvent",
&error,
&m,
"s",
cmd_name);
if (ret < 0) {
log_warn("WARNING: D-Bus notification failed: %s", error.message);
goto out;
}
ret = sd_bus_message_read(m, "i", &result);
if (ret < 0)
log_debug_dbus("Failed to parse dbus response message: %d", ret);
if (result)
log_debug_dbus("Bad return value from dbus service: %d", result);
out:
sd_bus_error_free(&error);
sd_bus_message_unref(m);
sd_bus_unref(bus);
}
void set_vg_notify(struct cmd_context *cmd)
{
cmd->vg_notify = 1;
}
void set_lv_notify(struct cmd_context *cmd)
{
cmd->lv_notify = 1;
}
void set_pv_notify(struct cmd_context *cmd)
{
cmd->pv_notify = 1;
}
#else
int lvmnotify_is_supported(void)
{
return 0;
}
void lvmnotify_send(struct cmd_context *cmd)
{
}
void set_vg_notify(struct cmd_context *cmd)
{
}
void set_lv_notify(struct cmd_context *cmd)
{
}
void set_pv_notify(struct cmd_context *cmd)
{
}
#endif