Ticket #4281: acpi_battery.cpp.patch
File acpi_battery.cpp.patch, 6.0 KB (added by , 15 years ago) |
---|
-
Data/projects/haiku/trunk/src/add-ons/kernel/drivers/power/acpi_battery/acpi_battery.cpp
49 49 &buffer); 50 50 if (status != B_OK) 51 51 goto exit; 52 52 53 53 object = (acpi_object_type*)buffer.pointer; 54 if (object->object_type != ACPI_TYPE_PACKAGE || 55 object->data.package.count < 4) { 56 status = B_ERROR; 57 goto exit; 58 } 54 59 55 60 pointer = object->data.package.objects; 56 61 57 batteryStatus->state = pointer->data.integer; 62 batteryStatus->state = (pointer->object_type == ACPI_TYPE_INTEGER) ? 63 pointer->data.integer : -1; 58 64 pointer++; 59 batteryStatus->current_rate = pointer->data.integer; 65 batteryStatus->current_rate = (pointer->object_type == ACPI_TYPE_INTEGER) ? 66 pointer->data.integer : -1; 60 67 pointer++; 61 batteryStatus->capacity = pointer->data.integer; 68 batteryStatus->capacity = (pointer->object_type == ACPI_TYPE_INTEGER) ? 69 pointer->data.integer : -1; 62 70 pointer++; 63 batteryStatus->voltage = pointer->data.integer; 71 batteryStatus->voltage = (pointer->object_type == ACPI_TYPE_INTEGER) ? 72 pointer->data.integer : -1; 64 73 65 74 exit: 66 75 free(buffer.pointer); 67 76 return status; 68 77 } … … 85 94 if (status != B_OK) 86 95 goto exit; 87 96 88 97 object = (acpi_object_type*)buffer.pointer; 89 98 if (object->object_type != ACPI_TYPE_PACKAGE || 90 object->data.package.count < 13) 99 object->data.package.count < 13) { 100 status = B_ERROR; 91 101 goto exit; 102 } 92 103 93 104 pointer = object->data.package.objects; 94 105 95 batteryInfo->power_unit = pointer->data.integer; 106 batteryInfo->power_unit = (pointer->object_type == ACPI_TYPE_INTEGER) ? 107 pointer->data.integer : -1; 96 108 pointer ++; 97 batteryInfo->design_capacity = pointer->data.integer; 109 batteryInfo->design_capacity = (pointer->object_type == ACPI_TYPE_INTEGER) ? 110 pointer->data.integer : -1; 98 111 pointer ++; 99 batteryInfo->last_full_charge = pointer->data.integer; 112 batteryInfo->last_full_charge = (pointer->object_type == ACPI_TYPE_INTEGER) ? 113 pointer->data.integer : -1; 100 114 pointer ++; 101 batteryInfo->technology = pointer->data.integer; 115 batteryInfo->technology = (pointer->object_type == ACPI_TYPE_INTEGER) ? 116 pointer->data.integer : -1; 102 117 pointer ++; 103 batteryInfo->design_voltage = pointer->data.integer; 118 batteryInfo->design_voltage = (pointer->object_type == ACPI_TYPE_INTEGER) ? 119 pointer->data.integer : -1; 104 120 pointer ++; 105 batteryInfo->design_capacity_warning = pointer->data.integer; 121 batteryInfo->design_capacity_warning = (pointer->object_type == ACPI_TYPE_INTEGER) ? 122 pointer->data.integer : -1; 106 123 pointer ++; 107 batteryInfo->design_capacity_low = pointer->data.integer; 124 batteryInfo->design_capacity_low = (pointer->object_type == ACPI_TYPE_INTEGER) ? 125 pointer->data.integer : -1; 108 126 pointer ++; 109 batteryInfo->capacity_granularity_1 = pointer->data.integer; 127 batteryInfo->capacity_granularity_1 = (pointer->object_type == ACPI_TYPE_INTEGER) ? 128 pointer->data.integer : -1; 110 129 pointer ++; 111 batteryInfo->capacity_granularity_2 = pointer->data.integer; 130 batteryInfo->capacity_granularity_2 = (pointer->object_type == ACPI_TYPE_INTEGER) ? 131 pointer->data.integer : -1; 112 132 pointer ++; 113 strcpy(batteryInfo->model_number, pointer->data.string.string); 133 strlcpy(batteryInfo->model_number, sizeof(batteryInfo->model_number), 134 (pointer->object_type == ACPI_TYPE_STRING) ? pointer->data.string.string : ""); 114 135 pointer ++; 115 strcpy(batteryInfo->serial_number, pointer->data.string.string); 136 strlcpy(batteryInfo->serial_number, sizeof(batteryInfo->serial_number), 137 (pointer->object_type == ACPI_TYPE_STRING) ? pointer->data.string.string : ""); 116 138 pointer ++; 117 strcpy(batteryInfo->type, pointer->data.string.string); 139 strlcpy(batteryInfo->type, sizeof(batteryInfo->type), 140 (pointer->object_type == ACPI_TYPE_STRING) ? pointer->data.string.string : ""); 118 141 pointer ++; 119 strcpy(batteryInfo->oem_info, pointer->data.string.string); 142 strlcpy(batteryInfo->oem_info, sizeof(batteryInfo->oem_info), 143 (pointer->object_type == ACPI_TYPE_STRING) ? pointer->data.string.string : ""); 120 144 121 145 exit: 122 146 free(buffer.pointer); 123 147 return status; 124 148 } … … 285 309 acpi_battery_control(void* _cookie, uint32 op, void* arg, size_t len) 286 310 { 287 311 battery_device_cookie* device = (battery_device_cookie*)_cookie; 288 312 status_t err = B_ERROR; 289 313 290 uint32* magicId;291 acpi_battery_info* batteryInfo;292 acpi_extended_battery_info* extBatteryInfo;293 314 switch (op) { 294 case IDENTIFY_DEVICE: 315 case IDENTIFY_DEVICE: { 295 316 if (len < sizeof(uint32)) 296 return B_IO_ERROR; 297 magicId = (uint32*)arg; 298 *magicId = kMagicACPIBatteryID; 299 err = B_OK; 300 break; 317 return B_BAD_VALUE; 318 uint32 magicId = kMagicACPIBatteryID; 319 return user_memcpy(arg, &magicId, sizeof(magicId)); 320 } 301 321 302 case GET_BATTERY_INFO: 322 case GET_BATTERY_INFO: { 303 323 if (len < sizeof(acpi_battery_info)) 304 return B_IO_ERROR; 305 batteryInfo = (acpi_battery_info*)arg; 306 err = ReadBatteryStatus(device->driver_cookie, batteryInfo); 307 break; 324 return B_BAD_VALUE; 325 326 acpi_battery_info batteryInfo; 327 err = ReadBatteryStatus(device->driver_cookie, &batteryInfo); 328 if (err != B_OK) 329 return err; 330 return user_memcpy(arg, &batteryInfo, sizeof(batteryInfo)); 331 } 308 332 309 case GET_EXTENDED_BATTERY_INFO: 333 case GET_EXTENDED_BATTERY_INFO: { 310 334 if (len < sizeof(acpi_extended_battery_info)) 311 return B_IO_ERROR; 312 extBatteryInfo = (acpi_extended_battery_info*)arg; 313 err = ReadBatteryInfo(device->driver_cookie, extBatteryInfo); 314 break; 335 return B_BAD_VALUE; 336 337 acpi_extended_battery_info extBatteryInfo; 338 err = ReadBatteryInfo(device->driver_cookie, &extBatteryInfo); 339 if (err != B_OK) 340 return err; 341 return user_memcpy(arg, &extBatteryInfo, sizeof(extBatteryInfo)); 342 } 315 343 316 344 case WATCH_BATTERY: 317 345 sBatteryCondition.Wait(); 318 346 if (atomic_get(&(device->stop_watching))) { 319 347 atomic_set(&(device->stop_watching), 0);