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  }