OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2010 Google Inc. All Rights Reserved. | 2 * Copyright 2010 Google Inc. All Rights Reserved. |
3 * | 3 * |
4 * This program is free software; you can redistribute it and/or | 4 * This program is free software; you can redistribute it and/or |
5 * modify it under the terms of the GNU General Public License | 5 * modify it under the terms of the GNU General Public License |
6 * as published by the Free Software Foundation; either version 2 | 6 * as published by the Free Software Foundation; either version 2 |
7 * of the License, or (at your option) any later version. | 7 * of the License, or (at your option) any later version. |
8 * | 8 * |
9 * This program is distributed in the hope that it will be useful, | 9 * This program is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 data->struct_minor_version = 0; | 202 data->struct_minor_version = 0; |
203 | 203 |
204 if (vendor) { | 204 if (vendor) { |
205 data->vendor = string_index; | 205 data->vendor = string_index; |
206 string_index++; | 206 string_index++; |
207 sprintf(string_ptr, "%s%c", vendor, '\0'); | 207 sprintf(string_ptr, "%s%c", vendor, '\0'); |
208 string_ptr += strlen(vendor) + 1; | 208 string_ptr += strlen(vendor) + 1; |
209 } | 209 } |
210 | 210 |
211 if (desc) { | 211 if (desc) { |
212 data->description = 2; | 212 data->description = string_index; |
213 string_index++; | 213 string_index++; |
214 sprintf(string_ptr, "%s%c", desc, '\0'); | 214 sprintf(string_ptr, "%s%c", desc, '\0'); |
215 string_ptr += strlen(desc) + 1; | 215 string_ptr += strlen(desc) + 1; |
216 } | 216 } |
217 | 217 |
218 data->major_version = 0; | 218 data->major_version = 2; |
219 data->minor_version = 1; | 219 data->minor_version = 0; |
220 | 220 |
221 if (variant) { | 221 if (variant) { |
222 data->variant = string_index; | 222 data->variant = string_index; |
223 string_index++; | 223 string_index++; |
224 sprintf(string_ptr, "%s%c", variant, '\0'); | 224 sprintf(string_ptr, "%s%c", variant, '\0'); |
225 string_ptr += strlen(variant) + 1; | 225 string_ptr += strlen(variant) + 1; |
226 } | 226 } |
227 | 227 |
228 memset(&data->reserved[0], 0, 5); | 228 memset(&data->reserved[0], 0, 5); |
229 | 229 |
230 if (uuid_parse(uuid, &data->uuid[0]) < 0) { | 230 if (uuid_parse(uuid, &data->uuid[0]) < 0) { |
231 fprintf(stderr, "invalid UUID \"%s\" specified\n", uuid); | 231 fprintf(stderr, "invalid UUID \"%s\" specified\n", uuid); |
232 goto vpd_create_type241_fail; | 232 goto vpd_create_type241_fail; |
233 } | 233 } |
234 | 234 |
235 data->offset = offset; | 235 data->offset = offset; |
236 data->size = size; | 236 data->size = size; |
237 | 237 |
238 return total_len; | 238 return total_len; |
239 | 239 |
240 vpd_create_type241_fail: | 240 vpd_create_type241_fail: |
241 return -1; | 241 return -1; |
242 } | 242 } |
243 | 243 |
| 244 /** |
| 245 * vpd_type241_size - return the size of type 241 structure table. |
| 246 * |
| 247 * Type 241 structure contains 3 variant length of string at end of table. |
| 248 * It is non-trival to get the length by sizeof(vpd_table_binary_blob_pointer). |
| 249 * This function can help by adding 3 strlen(NULL-terminated string). |
| 250 * |
| 251 * @header: pointer to the start address of this structure table. |
| 252 * |
| 253 * returns total size of this structure table. |
| 254 * returns <0 to indicate failure |
| 255 */ |
| 256 int vpd_type241_size(struct vpd_header *header) { |
| 257 uint8_t *ptr = ((uint8_t*)header) + header->length; |
| 258 int length = sizeof(struct vpd_header) + |
| 259 sizeof(struct vpd_table_binary_blob_pointer); |
| 260 int i; |
| 261 |
| 262 /* Sanity check */ |
| 263 if (header->type != VPD_TYPE_BINARY_BLOB_POINTER) return -1; |
| 264 |
| 265 for (i = 0; i < 3; ++i) { |
| 266 int len = strlen(ptr) + 1; |
| 267 length += len; |
| 268 ptr += len; |
| 269 } |
| 270 length++; /* Additional null(0) to indicate end of set. |
| 271 * Refer to SMBIOS spec 3.1.3 Text Strings. */ |
| 272 return length; |
| 273 } |
| 274 |
244 void vpd_free_table(void *data) | 275 void vpd_free_table(void *data) |
245 { | 276 { |
246 uint8_t *foo = data; | 277 uint8_t *foo = data; |
247 | 278 |
248 /* clean-up is trivially simple, for now... */ | 279 /* clean-up is trivially simple, for now... */ |
249 free(foo); | 280 free(foo); |
250 } | 281 } |
OLD | NEW |