46 static void trigger_udev_error_cb (gpointer data);
47 bool trigger_init (
void);
48 static gboolean trigger_udev_input_cb (GIOChannel *iochannel, GIOCondition cond, gpointer data);
49 void trigger_stop (
void);
50 static void trigger_parse_udev_properties(
struct udev_device *dev);
56 static struct udev *trigger_udev_handle = 0;
57 static struct udev_monitor *trigger_udev_monitor = 0;
58 static guint trigger_udev_watch_id = 0;
59 static gchar *trigger_udev_sysname = 0;
65 static void trigger_udev_error_cb (gpointer data)
71 log_debug(
"trigger watch destroyed\n!");
77 bool trigger_init(
void)
85 struct udev_device *dev = 0;
90 if( !(devpath = config_check_trigger()) ) {
91 log_err(
"No trigger path. Not starting trigger.\n");
95 if( !(subsystem = config_get_trigger_subsystem()) ) {
96 log_err(
"No trigger subsystem. Not starting trigger.\n");
101 if( !(trigger_udev_handle = udev_new()) ) {
102 log_err(
"Can't create udev\n");
105 dev = udev_device_new_from_syspath(trigger_udev_handle, devpath);
107 log_err(
"Unable to find the trigger device.");
111 trigger_udev_sysname = g_strdup(udev_device_get_sysname(dev));
112 log_debug(
"device name = %s\n", trigger_udev_sysname);
114 trigger_udev_monitor = udev_monitor_new_from_netlink(trigger_udev_handle,
116 if( !trigger_udev_monitor ) {
117 log_err(
"Unable to monitor the netlink\n");
121 ret = udev_monitor_filter_add_match_subsystem_devtype(trigger_udev_monitor,
125 log_err(
"Udev match failed.\n");
129 ret = udev_monitor_enable_receiving(trigger_udev_monitor);
131 log_err(
"Failed to enable monitor recieving.\n");
136 trigger_parse_udev_properties(dev);
138 chn = g_io_channel_unix_new(udev_monitor_get_fd(trigger_udev_monitor));
142 trigger_udev_watch_id = g_io_add_watch_full(chn,
145 trigger_udev_input_cb,
147 trigger_udev_error_cb);
150 log_debug(
"Trigger enabled!\n");
155 g_io_channel_unref(chn);
158 udev_device_unref(dev);
170 static gboolean trigger_udev_input_cb(GIOChannel *iochannel G_GNUC_UNUSED, GIOCondition cond,
171 gpointer data G_GNUC_UNUSED)
173 LOG_REGISTER_CONTEXT;
175 struct udev_device *dev;
180 dev = udev_monitor_receive_device (trigger_udev_monitor);
184 if(strcmp(trigger_udev_sysname, udev_device_get_sysname(dev))) {
185 log_crit(
"name does not match, disabling udev trigger io-watch");
186 trigger_udev_watch_id = 0;
190 if(!strcmp(udev_device_get_action(dev),
"change"))
192 log_debug(
"Trigger event recieved.\n");
193 trigger_parse_udev_properties(dev);
195 udev_device_unref(dev);
200 log_debug(
"Bad trigger data. Stopping\n");
201 trigger_udev_watch_id = 0;
211 void trigger_stop(
void)
213 LOG_REGISTER_CONTEXT;
215 if(trigger_udev_watch_id)
217 g_source_remove(trigger_udev_watch_id);
218 trigger_udev_watch_id = 0;
220 if(trigger_udev_monitor)
222 udev_monitor_unref(trigger_udev_monitor);
223 trigger_udev_monitor = 0;
225 if(trigger_udev_handle)
227 udev_unref(trigger_udev_handle);
228 trigger_udev_handle = 0;
230 g_free(trigger_udev_sysname),
231 trigger_udev_sysname = 0;
234 static void trigger_parse_udev_properties(
struct udev_device *dev)
236 LOG_REGISTER_CONTEXT;
238 char *trigger_property = 0;
239 char *trigger_value = 0;
240 char *trigger_mode = 0;
242 const char *value = 0;
247 if( !(trigger_mode = config_get_trigger_mode()) )
250 if( !(trigger_property = config_get_trigger_property()) )
253 if( !(value = udev_device_get_property_value(dev, trigger_property)) )
256 if( (trigger_value = config_get_trigger_value()) ) {
257 if( strcmp(trigger_value, value) )
265 free(trigger_property);