xref: /openbmc/skeleton/libopenbmc_intf/gpio_json.c (revision 0d259e38fce8bbb3155bed8e529391fff2ec6570)
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