diff --git a/panda/src/device/evdevInputDevice.cxx b/panda/src/device/evdevInputDevice.cxx index 4aa94e023d..bb91144d6a 100644 --- a/panda/src/device/evdevInputDevice.cxx +++ b/panda/src/device/evdevInputDevice.cxx @@ -181,7 +181,10 @@ do_set_vibration(double strong, double weak) { play.code = _ff_id; play.value = 1; - write(_fd, &play, sizeof(play)); + if (write(_fd, &play, sizeof(play)) < 0) { + device_cat.warning() + << "Failed to write force-feedback event: " << strerror(errno) << "\n"; + } } } @@ -301,22 +304,22 @@ init_device() { int num_bits = ioctl(_fd, EVIOCGBIT(EV_ABS, sizeof(axes)), axes) << 3; for (int i = 0; i < num_bits; ++i) { if (test_bit(i, axes)) { - // Emulate D-Pad buttons if necessary. - if (i > ABS_HAT0Y) { + if (i >= ABS_HAT0X) { set_control_map(i, C_none); - } else if (i == ABS_HAT0X && emulate_dpad) { - _dpad_x_axis = i; - _dpad_left_button = (int)_buttons.size(); - _buttons.push_back(ButtonState(GamepadButton::dpad_left())); - _buttons.push_back(ButtonState(GamepadButton::dpad_right())); - - } else if (i == ABS_HAT0Y && emulate_dpad) { - _dpad_y_axis = i; - _dpad_up_button = (int)_buttons.size(); - _buttons.push_back(ButtonState(GamepadButton::dpad_up())); - _buttons.push_back(ButtonState(GamepadButton::dpad_down())); + // Emulate D-Pad buttons if necessary. + if (i == ABS_HAT0X && emulate_dpad) { + _dpad_x_axis = i; + _dpad_left_button = (int)_buttons.size(); + _buttons.push_back(ButtonState(GamepadButton::dpad_left())); + _buttons.push_back(ButtonState(GamepadButton::dpad_right())); + } else if (i == ABS_HAT0Y && emulate_dpad) { + _dpad_y_axis = i; + _dpad_up_button = (int)_buttons.size(); + _buttons.push_back(ButtonState(GamepadButton::dpad_up())); + _buttons.push_back(ButtonState(GamepadButton::dpad_down())); + } } else { set_control_map(i, axis_map[i]); } @@ -379,27 +382,30 @@ init_device() { sprintf(path, "/sys/class/input/event%d/device/device/../product", _index); FILE *f = fopen(path, "r"); if (f) { - fgets(buffer, sizeof(buffer), f); - buffer[strcspn(buffer, "\r\n")] = 0; - if (buffer[0] != 0) { - _name.assign(buffer); + if (fgets(buffer, sizeof(buffer), f) != NULL) { + buffer[strcspn(buffer, "\r\n")] = 0; + if (buffer[0] != 0) { + _name.assign(buffer); + } } fclose(f); } sprintf(path, "/sys/class/input/event%d/device/device/../manufacturer", _index); f = fopen(path, "r"); if (f) { - fgets(buffer, sizeof(buffer), f); - buffer[strcspn(buffer, "\r\n")] = 0; - _manufacturer.assign(buffer); + if (fgets(buffer, sizeof(buffer), f) != NULL) { + buffer[strcspn(buffer, "\r\n")] = 0; + _manufacturer.assign(buffer); + } fclose(f); } sprintf(path, "/sys/class/input/event%d/device/device/../serial", _index); f = fopen(path, "r"); if (f) { - fgets(buffer, sizeof(buffer), f); - buffer[strcspn(buffer, "\r\n")] = 0; - _serial_number.assign(buffer); + if (fgets(buffer, sizeof(buffer), f) != NULL) { + buffer[strcspn(buffer, "\r\n")] = 0; + _serial_number.assign(buffer); + } fclose(f); } diff --git a/panda/src/device/linuxJoystickDevice.cxx b/panda/src/device/linuxJoystickDevice.cxx index f6ab5c7438..8c3a91cb6b 100644 --- a/panda/src/device/linuxJoystickDevice.cxx +++ b/panda/src/device/linuxJoystickDevice.cxx @@ -319,40 +319,47 @@ open_device() { sprintf(path, "/sys/class/input/js%d/device/id/vendor", _index); FILE *f = fopen(path, "r"); if (f) { - fscanf(f, "%hx", &_vendor_id); + if (fscanf(f, "%hx", &_vendor_id) < 1) { + _vendor_id = 0; + } fclose(f); } sprintf(path, "/sys/class/input/js%d/device/id/product", _index); f = fopen(path, "r"); if (f) { - fscanf(f, "%hx", &_product_id); + if (fscanf(f, "%hx", &_product_id) < 1) { + _product_id = 0; + } fclose(f); } char buffer[256]; sprintf(path, "/sys/class/input/js%d/device/device/../product", _index); f = fopen(path, "r"); if (f) { - fgets(buffer, sizeof(buffer), f); - buffer[strcspn(buffer, "\r\n")] = 0; - if (buffer[0] != 0) { - _name.assign(buffer); + if (fgets(buffer, sizeof(buffer), f) != NULL) { + buffer[strcspn(buffer, "\r\n")] = 0; + if (buffer[0] != 0) { + _name.assign(buffer); + } } fclose(f); } sprintf(path, "/sys/class/input/js%d/device/device/../manufacturer", _index); f = fopen(path, "r"); if (f) { - fgets(buffer, sizeof(buffer), f); - buffer[strcspn(buffer, "\r\n")] = 0; - _manufacturer.assign(buffer); + if (fgets(buffer, sizeof(buffer), f) != NULL) { + buffer[strcspn(buffer, "\r\n")] = 0; + _manufacturer.assign(buffer); + } fclose(f); } sprintf(path, "/sys/class/input/js%d/device/device/../serial", _index); f = fopen(path, "r"); if (f) { - fgets(buffer, sizeof(buffer), f); - buffer[strcspn(buffer, "\r\n")] = 0; - _serial_number.assign(buffer); + if (fgets(buffer, sizeof(buffer), f) != NULL) { + buffer[strcspn(buffer, "\r\n")] = 0; + _serial_number.assign(buffer); + } fclose(f); }