1ea3d8a41SMatt Spinler /**
2ea3d8a41SMatt Spinler * Copyright © 2018 IBM Corporation
3ea3d8a41SMatt Spinler *
4ea3d8a41SMatt Spinler * Licensed under the Apache License, Version 2.0 (the "License");
5ea3d8a41SMatt Spinler * you may not use this file except in compliance with the License.
6ea3d8a41SMatt Spinler * You may obtain a copy of the License at
7ea3d8a41SMatt Spinler *
8ea3d8a41SMatt Spinler * http://www.apache.org/licenses/LICENSE-2.0
9ea3d8a41SMatt Spinler *
10ea3d8a41SMatt Spinler * Unless required by applicable law or agreed to in writing, software
11ea3d8a41SMatt Spinler * distributed under the License is distributed on an "AS IS" BASIS,
12ea3d8a41SMatt Spinler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ea3d8a41SMatt Spinler * See the License for the specific language governing permissions and
14ea3d8a41SMatt Spinler * limitations under the License.
15ea3d8a41SMatt Spinler */
16ea3d8a41SMatt Spinler #include <stdio.h>
17ea3d8a41SMatt Spinler #include <stdlib.h>
18ea3d8a41SMatt Spinler #include "gpio_json.h"
19ea3d8a41SMatt Spinler
20ea3d8a41SMatt Spinler #define GPIO_FILE "/etc/default/obmc/gpio/gpio_defs.json"
21ea3d8a41SMatt Spinler
load_json()22ea3d8a41SMatt Spinler cJSON* load_json()
23ea3d8a41SMatt Spinler {
24ea3d8a41SMatt Spinler FILE* fd = fopen(GPIO_FILE, "r");
25ea3d8a41SMatt Spinler if (!fd)
26ea3d8a41SMatt Spinler {
27ea3d8a41SMatt Spinler fprintf(stderr, "Unable to open GPIO JSON file %s\n", GPIO_FILE);
28ea3d8a41SMatt Spinler return NULL;
29ea3d8a41SMatt Spinler }
30ea3d8a41SMatt Spinler
31ea3d8a41SMatt Spinler fseek(fd, 0, SEEK_END);
32*0d259e38SPatrick Williams size_t size = (size_t) ftell(fd);
33ea3d8a41SMatt Spinler rewind(fd);
34ea3d8a41SMatt Spinler
35ea3d8a41SMatt Spinler char* data = malloc(size + 1);
36ea3d8a41SMatt Spinler
37ea3d8a41SMatt Spinler size_t rc = fread(data, 1, size, fd);
38ea3d8a41SMatt Spinler fclose(fd);
39ea3d8a41SMatt Spinler if (rc != size)
40ea3d8a41SMatt Spinler {
41ea3d8a41SMatt Spinler free(data);
42*0d259e38SPatrick Williams fprintf(stderr, "Only read %zd out of %zd bytes of GPIO file %s\n",
43ea3d8a41SMatt Spinler rc, size, GPIO_FILE);
44ea3d8a41SMatt Spinler return NULL;
45ea3d8a41SMatt Spinler }
46ea3d8a41SMatt Spinler
47ea3d8a41SMatt Spinler data[size] = '\0';
48ea3d8a41SMatt Spinler cJSON* json = cJSON_Parse(data);
49ea3d8a41SMatt Spinler free(data);
50ea3d8a41SMatt Spinler
51ea3d8a41SMatt Spinler if (json == NULL)
52ea3d8a41SMatt Spinler {
53ea3d8a41SMatt Spinler fprintf(stderr, "Failed parsing GPIO file %s\n", GPIO_FILE);
54ea3d8a41SMatt Spinler
55ea3d8a41SMatt Spinler const char* error_loc = cJSON_GetErrorPtr();
56ea3d8a41SMatt Spinler if (error_loc != NULL)
57ea3d8a41SMatt Spinler {
58ea3d8a41SMatt Spinler fprintf(stderr, "JSON error at %s\n", error_loc);
59ea3d8a41SMatt Spinler }
60ea3d8a41SMatt Spinler }
61ea3d8a41SMatt Spinler return json;
62ea3d8a41SMatt Spinler }
63