internal MacSerialStream(MacSerialDevice device) : base(device) { string fileSystemName = device.GetFileSystemName(); int ret; int handle = NativeMethods.retry(() => NativeMethods.open(fileSystemName, NativeMethods.oflag.RDWR | NativeMethods.oflag.NOCTTY | NativeMethods.oflag.NONBLOCK)); if (handle < 0) { var error = (NativeMethods.error)Marshal.GetLastWin32Error(); if (error == NativeMethods.error.EACCES) { throw DeviceException.CreateUnauthorizedAccessException(device, "Not permitted to open serial device at " + fileSystemName + "."); } else { throw DeviceException.CreateIOException(device, "Unable to open serial device (" + error.ToString() + ")."); } } ret = NativeMethods.retry(() => NativeMethods.ioctl(handle, NativeMethods.TIOCEXCL)); if (ret < 0) { NativeMethods.retry(() => NativeMethods.close(handle)); throw new IOException("Unable to open serial device exclusively."); } /* * ret = NativeMethods.retry(() => NativeMethods.fcntl(handle, NativeMethods.F_SETFL, 0)); * if (ret < 0) * { * NativeMethods.retry(() => NativeMethods.ioctl(handle, NativeMethods.TIOCNXCL)); * NativeMethods.retry(() => NativeMethods.close(handle)); * throw new IOException("Unable to remove blocking from port."); * } */ ret = NativeMethods.retry(() => NativeMethods.tcgetattr(handle, out _oldSettings)); if (ret < 0) { NativeMethods.retry(() => NativeMethods.ioctl(handle, NativeMethods.TIOCNXCL)); NativeMethods.retry(() => NativeMethods.close(handle)); throw new IOException("Unable to get serial port settings."); } _newSettings = _oldSettings; NativeMethods.cfmakeraw(ref _newSettings); _handle = handle; InitSettings(); UpdateSettings(); }
internal static int DeviceHandleFromPath(string path, HidDevice hidDevice, NativeMethods.oflag oflag) { IntPtr udev = NativeMethodsLibudev.Instance.udev_new(); if (IntPtr.Zero != udev) { try { IntPtr device = NativeMethodsLibudev.Instance.udev_device_new_from_syspath(udev, path); if (IntPtr.Zero != device) { try { string devnode = NativeMethodsLibudev.Instance.udev_device_get_devnode(device); if (devnode != null) { int handle = NativeMethods.retry(() => NativeMethods.open(devnode, oflag)); if (handle < 0) { var error = (NativeMethods.error)Marshal.GetLastWin32Error(); if (error == NativeMethods.error.EACCES) { throw DeviceException.CreateUnauthorizedAccessException(hidDevice, "Not permitted to open HID class device at " + devnode + "."); } else { throw DeviceException.CreateIOException(hidDevice, "Unable to open HID class device (" + error.ToString() + ")."); } } return(handle); } } finally { NativeMethodsLibudev.Instance.udev_device_unref(device); } } } finally { NativeMethodsLibudev.Instance.udev_unref(udev); } } throw new FileNotFoundException("HID class device not found."); }