github.com/openebs/node-disk-manager@v1.9.1-0.20230225014141-4531f06ffa1e/pkg/udev/udev.go (about) 1 /* 2 Copyright 2018 OpenEBS Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 // +build linux,cgo 18 19 package udev 20 21 /* 22 #cgo LDFLAGS: -ludev 23 #include <libudev.h> 24 */ 25 import "C" 26 import ( 27 "errors" 28 ) 29 30 // Udev wraps a libudev udev struct 31 type Udev struct { 32 uptr *C.struct_udev 33 } 34 35 // newUdev is a helper function and returns a pointer to a new udev 36 func newUdev(ptr *C.struct_udev) (*Udev, error) { 37 if ptr == nil { 38 return nil, errors.New("unable to create Udevice object for null struct struct_udev") 39 } 40 u := &Udev{ 41 uptr: ptr, 42 } 43 return u, nil 44 } 45 46 // NewUdev is a function and which returns a pointer to a new Udev 47 func NewUdev() (*Udev, error) { 48 udev := C.udev_new() 49 return newUdev(udev) 50 } 51 52 // NewUdevEnumerate returns a pointer to a Udevenumerate 53 func (u *Udev) NewUdevEnumerate() (*UdevEnumerate, error) { 54 if u == nil { 55 return nil, errors.New("unable to create Udevenumerate object for for null struct struct_udev_enumerate") 56 } 57 enumerateptr := C.udev_enumerate_new(u.uptr) 58 if enumerateptr == nil { 59 return nil, errors.New("unable to create Udevenumerate object for for null struct struct_udev_enumerate") 60 } 61 ue := &UdevEnumerate{ 62 ueptr: enumerateptr, 63 } 64 return ue, nil 65 } 66 67 // UnrefUdev frees udev structure. 68 func (u *Udev) UnrefUdev() { 69 C.udev_unref(u.uptr) 70 } 71 72 // NewDeviceFromSysPath identify the block device currently attached to the system 73 // at given sysPath and returns that pointer of C udev_device structure. The 74 // caller can query all(available) the disk properties using returned C udev_device structure. 75 func (u *Udev) NewDeviceFromSysPath(sysPath string) (*UdevDevice, error) { 76 syspath := C.CString(sysPath) 77 defer freeCharPtr(syspath) 78 return newUdevDevice(C.udev_device_new_from_syspath(u.uptr, syspath)) 79 } 80 81 // NewDeviceFromNetlink use newUdeviceMonitor() and use returns UdevMonitor pointer in success 82 // The function returns nil on failure it can monitor udev or kernel as source. 83 func (u *Udev) NewDeviceFromNetlink(source string) (*UdevMonitor, error) { 84 monitorSources := C.CString(source) 85 defer freeCharPtr(monitorSources) 86 return newUdeviceMonitor(C.udev_monitor_new_from_netlink(u.uptr, monitorSources)) 87 }