Example #1
0
File: udev.go Project: jessta/udev
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)

}
Example #2
0
// 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
}
Example #3
0
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
}