| // |
| // Copyright 2016 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| |
| #define LOG_TAG "properties" |
| |
| #include <ctype.h> |
| #include <stdbool.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <unistd.h> |
| |
| #include <cutils/properties.h> |
| #include <log/log.h> |
| |
| static const int MAX_PROPERTIES = 5; |
| |
| struct property { |
| char key[PROP_KEY_MAX + 2]; |
| char value[PROP_VALUE_MAX + 2]; |
| }; |
| |
| int num_properties = 0; |
| struct property properties[MAX_PROPERTIES]; |
| |
| // Find the correct entry. |
| static int property_find(const char *key) { |
| for (int i = 0; i < num_properties; i++) { |
| if (strncmp(properties[i].key, key, PROP_KEY_MAX) == 0) { |
| return i; |
| } |
| } |
| return MAX_PROPERTIES; |
| } |
| |
| int property_set(const char *key, const char *value) { |
| if (strnlen(value, PROP_VALUE_MAX) > PROP_VALUE_MAX) return -1; |
| |
| // Check to see if the property exists. |
| int prop_index = property_find(key); |
| |
| if (prop_index == MAX_PROPERTIES) { |
| if (num_properties >= MAX_PROPERTIES) return -1; |
| prop_index = num_properties; |
| num_properties += 1; |
| } |
| |
| // This is test code. Be nice and don't push the boundary cases! |
| strncpy(properties[prop_index].key, key, PROP_KEY_MAX + 1); |
| strncpy(properties[prop_index].value, value, PROP_VALUE_MAX + 1); |
| return 0; |
| } |
| |
| int property_get(const char *key, char *value, const char *default_value) { |
| // This doesn't mock the behavior of default value |
| if (default_value != NULL) ALOGE("%s: default_value is ignored!", __func__); |
| |
| // Check to see if the property exists. |
| int prop_index = property_find(key); |
| |
| if (prop_index == MAX_PROPERTIES) return 0; |
| |
| int len = strlen(properties[prop_index].value); |
| memcpy(value, properties[prop_index].value, len); |
| value[len] = '\0'; |
| return len; |
| } |