blob: 42d749e2dab5e40cbf1ed9df02de7c7bb118a553 [file] [log] [blame]
julhal012c18fbf2021-02-01 08:29:28 +00001/*
2 * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include "config_ramstore.h"
Julian Hall7048d302021-06-03 16:07:28 +01008#include <config/interface/config_store.h>
julhal012c18fbf2021-02-01 08:29:28 +00009#include <stdlib.h>
10#include <string.h>
11#include <stdint.h>
12
13/**
14 * Variable length container for a configuration object.
15 */
16struct config_container
17{
Julian Hall7048d302021-06-03 16:07:28 +010018 enum config_classifier classifier;
19 char name[32];
20 unsigned int instance;
julhal012c18fbf2021-02-01 08:29:28 +000021 size_t size;
22 struct config_container *next;
23};
24
Julian Hall7048d302021-06-03 16:07:28 +010025static struct config_container *config_container_create(enum config_classifier classifier,
26 const char *name, unsigned int instance,
27 const void *data, size_t size)
julhal012c18fbf2021-02-01 08:29:28 +000028{
29 struct config_container *container = malloc(sizeof(struct config_container) + size);
30
31 if (container) {
32
Julian Hall7048d302021-06-03 16:07:28 +010033 container->classifier = classifier;
34 strncpy(container->name, name, sizeof(container->name));
35 container->name[sizeof(container->name) - 1] = '\0';
36 container->instance = instance;
julhal012c18fbf2021-02-01 08:29:28 +000037 container->size = size;
38 container->next = NULL;
39
40 memcpy((uint8_t*)container + sizeof(struct config_container), data, size);
41 }
42
43 return container;
44}
45
46static void config_container_destroy(struct config_container *container)
47{
48 free(container);
49}
50
51static const void *config_container_data(const struct config_container *container)
52{
53 return (const uint8_t*)container + sizeof(struct config_container);
54}
55
56/**
57 * Singleton config_ramstore instance
58 */
59static struct config_ramstore
60{
Julian Hall7048d302021-06-03 16:07:28 +010061 struct config_container *object_list;
julhal012c18fbf2021-02-01 08:29:28 +000062} ramstore = {0};
63
64
65void config_ramstore_init(void)
66{
Julian Hall7048d302021-06-03 16:07:28 +010067
julhal012c18fbf2021-02-01 08:29:28 +000068}
69
70void config_ramstore_deinit(void)
71{
Julian Hall7048d302021-06-03 16:07:28 +010072 while (ramstore.object_list) {
julhal012c18fbf2021-02-01 08:29:28 +000073
Julian Hall7048d302021-06-03 16:07:28 +010074 struct config_container *next = ramstore.object_list->next;
75 free(ramstore.object_list);
76 ramstore.object_list = next;
julhal012c18fbf2021-02-01 08:29:28 +000077 }
78}
79
Julian Hall7048d302021-06-03 16:07:28 +010080bool config_store_add(enum config_classifier classifier,
81 const char *name,
82 unsigned int instance,
83 const void *data,
84 size_t data_len)
julhal012c18fbf2021-02-01 08:29:28 +000085{
86 struct config_container *container;
87
Julian Hall7048d302021-06-03 16:07:28 +010088 container = config_container_create(classifier, name, instance, data, data_len);
89 if (!container) return false;
julhal012c18fbf2021-02-01 08:29:28 +000090
Julian Hall7048d302021-06-03 16:07:28 +010091 container->next = ramstore.object_list;
92 ramstore.object_list = container;
julhal012c18fbf2021-02-01 08:29:28 +000093
Julian Hall7048d302021-06-03 16:07:28 +010094 return true;
julhal012c18fbf2021-02-01 08:29:28 +000095}
96
Julian Hall7048d302021-06-03 16:07:28 +010097bool config_store_query(enum config_classifier classifier,
98 const char *name,
99 unsigned int instance,
100 void *data,
101 size_t data_buf_size)
julhal012c18fbf2021-02-01 08:29:28 +0000102{
Julian Hall7048d302021-06-03 16:07:28 +0100103 bool success = false;
104 const struct config_container *container = ramstore.object_list;
julhal012c18fbf2021-02-01 08:29:28 +0000105
106 while (container) {
107
Julian Hall7048d302021-06-03 16:07:28 +0100108 if ((container->classifier == classifier) &&
109 (strcmp(container->name, name) == 0) &&
110 (container->instance == instance)) {
julhal012c18fbf2021-02-01 08:29:28 +0000111
Julian Hall7048d302021-06-03 16:07:28 +0100112 if (data_buf_size == container->size) {
julhal012c18fbf2021-02-01 08:29:28 +0000113
Julian Hall7048d302021-06-03 16:07:28 +0100114 memcpy(data, config_container_data(container), container->size);
115 success = true;
julhal012c18fbf2021-02-01 08:29:28 +0000116 }
117
118 break;
119 }
120
121 container = container->next;
122 }
123
Julian Hall7048d302021-06-03 16:07:28 +0100124 return success;
julhal012c18fbf2021-02-01 08:29:28 +0000125}
126
Julian Hall7048d302021-06-03 16:07:28 +0100127unsigned int config_store_count(enum config_classifier classifier)
julhal0137e1aea2021-02-09 15:22:20 +0000128{
129 unsigned int count = 0;
130
Julian Hall7048d302021-06-03 16:07:28 +0100131 const struct config_container *container = ramstore.object_list;
julhal0137e1aea2021-02-09 15:22:20 +0000132
133 while (container) {
134
Julian Hall7048d302021-06-03 16:07:28 +0100135 if (container->classifier == classifier) ++count;
julhal0137e1aea2021-02-09 15:22:20 +0000136 container = container->next;
137 }
138
139 return count;
140}