func (m Monitor) AddFilter(subsystem string, devtype string) error { err := C.udev_monitor_filter_add_match_subsystem_devtype(m.ptr, C.CString(subsystem), C.CString(devtype)) if err == 0 { return nil } return Error(err) }
// FilterAddMatchSubsystem adds a filter matching the device against a subsystem. // This filter is efficiently executed inside the kernel, and libudev subscribers will usually not be woken up for devices which do not match. // The filter must be installed before the monitor is switched to listening mode with the DeviceChan function. func (m *Monitor) FilterAddMatchSubsystem(subsystem string) (err error) { m.lock() defer m.unlock() s := C.CString(subsystem) defer freeCharPtr(s) if C.udev_monitor_filter_add_match_subsystem_devtype(m.ptr, s, nil) != 0 { err = errors.New("udev: udev_monitor_filter_add_match_subsystem_devtype failed") } return }
func MonitorUdev(subsystem string) (*Monitor, error) { cName := C.CString("udev") defer C.free(unsafe.Pointer(cName)) udev := C.udev_new() udev_monitor := C.udev_monitor_new_from_netlink(udev, cName) if udev_monitor == nil { C.udev_unref(udev) return nil, Error{"udev_monitor_new_from_netlink"} } if subsystem != "" { cSubsystem := C.CString(subsystem) defer C.free(unsafe.Pointer(cSubsystem)) if C.udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, cSubsystem, nil) < 0 { C.udev_monitor_unref(udev_monitor) C.udev_unref(udev) return nil, Error{"udev_monitor_filter_add_match_subsystem_devtype"} } } if C.udev_monitor_enable_receiving(udev_monitor) < 0 { C.udev_monitor_unref(udev_monitor) C.udev_unref(udev) return nil, Error{"udev_monitor_enable_receiving"} } // set blocking if fd := C.udev_monitor_get_fd(udev_monitor); fd < 0 { C.udev_monitor_unref(udev_monitor) C.udev_unref(udev) return nil, Error{"udev_monitor_get_fd"} } else if err := syscall.SetNonblock(int(fd), false); err != nil { C.udev_monitor_unref(udev_monitor) C.udev_unref(udev) return nil, err } return &Monitor{udev, udev_monitor}, nil }