1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * you may not use this file except in compliance with the License. 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * You may obtain a copy of the License at 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * See the License for the specific language governing permissions and 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * limitations under the License. 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define LOG_TAG "properties" 18d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin// #define LOG_NDEBUG 0 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 22d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin#include <ctype.h> 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h> 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <cutils/sockets.h> 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h> 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <assert.h> 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <cutils/properties.h> 29d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin#include <stdbool.h> 30d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin#include <inttypes.h> 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "loghack.h" 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 33d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkinint8_t property_get_bool(const char *key, int8_t default_value) { 34d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin if (!key) { 35d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin return default_value; 36d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin } 37d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin 38d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin int8_t result = default_value; 39d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin char buf[PROPERTY_VALUE_MAX] = {'\0',}; 40d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin 41d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin int len = property_get(key, buf, ""); 42d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin if (len == 1) { 43d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin char ch = buf[0]; 44d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin if (ch == '0' || ch == 'n') { 45d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin result = false; 46d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin } else if (ch == '1' || ch == 'y') { 47d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin result = true; 48d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin } 49d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin } else if (len > 1) { 50d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin if (!strcmp(buf, "no") || !strcmp(buf, "false") || !strcmp(buf, "off")) { 51d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin result = false; 52d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin } else if (!strcmp(buf, "yes") || !strcmp(buf, "true") || !strcmp(buf, "on")) { 53d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin result = true; 54d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin } 55d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin } 56d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin 57d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin return result; 58d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin} 59d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin 60d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin// Convert string property to int (default if fails); return default value if out of bounds 61d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkinstatic intmax_t property_get_imax(const char *key, intmax_t lower_bound, intmax_t upper_bound, 62d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin intmax_t default_value) { 63d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin if (!key) { 64d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin return default_value; 65d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin } 66d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin 67d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin intmax_t result = default_value; 68d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin char buf[PROPERTY_VALUE_MAX] = {'\0',}; 69d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin char *end = NULL; 70d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin 71d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin int len = property_get(key, buf, ""); 72d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin if (len > 0) { 73d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin int tmp = errno; 74d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin errno = 0; 75d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin 76d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin // Infer base automatically 77d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin result = strtoimax(buf, &end, /*base*/0); 78d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin if ((result == INTMAX_MIN || result == INTMAX_MAX) && errno == ERANGE) { 79d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin // Over or underflow 80d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin result = default_value; 818efea957beb3af682095c0bd6aa4c68ad531c7daIgor Murashkin ALOGV("%s(%s,%" PRIdMAX ") - overflow", __FUNCTION__, key, default_value); 82d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin } else if (result < lower_bound || result > upper_bound) { 83d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin // Out of range of requested bounds 84d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin result = default_value; 858efea957beb3af682095c0bd6aa4c68ad531c7daIgor Murashkin ALOGV("%s(%s,%" PRIdMAX ") - out of range", __FUNCTION__, key, default_value); 86d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin } else if (end == buf) { 87d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin // Numeric conversion failed 88d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin result = default_value; 898efea957beb3af682095c0bd6aa4c68ad531c7daIgor Murashkin ALOGV("%s(%s,%" PRIdMAX ") - numeric conversion failed", 908efea957beb3af682095c0bd6aa4c68ad531c7daIgor Murashkin __FUNCTION__, key, default_value); 91d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin } 92d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin 93d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin errno = tmp; 94d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin } 95d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin 96d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin return result; 97d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin} 98d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin 99d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkinint64_t property_get_int64(const char *key, int64_t default_value) { 100d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin return (int64_t)property_get_imax(key, INT64_MIN, INT64_MAX, default_value); 101d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin} 102d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin 103d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkinint32_t property_get_int32(const char *key, int32_t default_value) { 104d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin return (int32_t)property_get_imax(key, INT32_MIN, INT32_MAX, default_value); 105d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin} 106d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_LIBC_SYSTEM_PROPERTIES 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_ 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/_system_properties.h> 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint property_set(const char *key, const char *value) 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 114eb1f0c6fd162fe34d91e8766e53e440349130a36Brad Fitzpatrick return __system_property_set(key, value); 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint property_get(const char *key, char *value, const char *default_value) 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len; 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = __system_property_get(key, value); 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len > 0) { 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return len; 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(default_value) { 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = strlen(default_value); 127d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin if (len >= PROPERTY_VALUE_MAX) { 128d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin len = PROPERTY_VALUE_MAX - 1; 129d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin } 130d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin memcpy(value, default_value, len); 131d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin value[len] = '\0'; 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return len; 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 136e7bb159d16f9e60850a3c79cc388587959015a65Greg Hackmannstruct property_list_callback_data 137e7bb159d16f9e60850a3c79cc388587959015a65Greg Hackmann{ 138e7bb159d16f9e60850a3c79cc388587959015a65Greg Hackmann void (*propfn)(const char *key, const char *value, void *cookie); 139e7bb159d16f9e60850a3c79cc388587959015a65Greg Hackmann void *cookie; 140e7bb159d16f9e60850a3c79cc388587959015a65Greg Hackmann}; 141e7bb159d16f9e60850a3c79cc388587959015a65Greg Hackmann 142e7bb159d16f9e60850a3c79cc388587959015a65Greg Hackmannstatic void property_list_callback(const prop_info *pi, void *cookie) 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char name[PROP_NAME_MAX]; 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char value[PROP_VALUE_MAX]; 146e7bb159d16f9e60850a3c79cc388587959015a65Greg Hackmann struct property_list_callback_data *data = cookie; 147e7bb159d16f9e60850a3c79cc388587959015a65Greg Hackmann 148e7bb159d16f9e60850a3c79cc388587959015a65Greg Hackmann __system_property_read(pi, name, value); 149e7bb159d16f9e60850a3c79cc388587959015a65Greg Hackmann data->propfn(name, value, data->cookie); 150e7bb159d16f9e60850a3c79cc388587959015a65Greg Hackmann} 151e7bb159d16f9e60850a3c79cc388587959015a65Greg Hackmann 152e7bb159d16f9e60850a3c79cc388587959015a65Greg Hackmannint property_list( 153e7bb159d16f9e60850a3c79cc388587959015a65Greg Hackmann void (*propfn)(const char *key, const char *value, void *cookie), 154e7bb159d16f9e60850a3c79cc388587959015a65Greg Hackmann void *cookie) 155e7bb159d16f9e60850a3c79cc388587959015a65Greg Hackmann{ 156e7bb159d16f9e60850a3c79cc388587959015a65Greg Hackmann struct property_list_callback_data data = { propfn, cookie }; 157e7bb159d16f9e60850a3c79cc388587959015a65Greg Hackmann return __system_property_foreach(property_list_callback, &data); 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#elif defined(HAVE_SYSTEM_PROPERTY_SERVER) 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * The Linux simulator provides a "system property server" that uses IPC 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * to set/get/list properties. The file descriptor is shared by all 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * threads in the process, so we use a mutex to ensure that requests 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * from multiple threads don't get interleaved. 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/types.h> 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/socket.h> 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/un.h> 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <pthread.h> 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic pthread_once_t gInitOnce = PTHREAD_ONCE_INIT; 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic pthread_mutex_t gPropertyFdLock = PTHREAD_MUTEX_INITIALIZER; 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int gPropFd = -1; 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Connect to the properties server. 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Returns the socket descriptor on success. 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int connectToServer(const char* fileName) 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int sock = -1; 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int cc; 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct sockaddr_un addr; 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sock = socket(AF_UNIX, SOCK_STREAM, 0); 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (sock < 0) { 192ae8b56c0d17a97aff0b98e6405c7cc9811bbbc3dSteve Block ALOGW("UNIX domain socket create failed (errno=%d)\n", errno); 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* connect to socket; fails if file doesn't exist */ 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(addr.sun_path, fileName); // max 108 bytes 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project addr.sun_family = AF_UNIX; 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project cc = connect(sock, (struct sockaddr*) &addr, SUN_LEN(&addr)); 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (cc < 0) { 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // ENOENT means socket file doesn't exist 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // ECONNREFUSED means socket exists but nobody is listening 203ae8b56c0d17a97aff0b98e6405c7cc9811bbbc3dSteve Block //ALOGW("AF_UNIX connect failed for '%s': %s\n", 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // fileName, strerror(errno)); 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project close(sock); 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return sock; 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Perform one-time initialization. 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void init(void) 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project assert(gPropFd == -1); 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gPropFd = connectToServer(SYSTEM_PROPERTY_PIPE_NAME); 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (gPropFd < 0) { 221ae8b56c0d17a97aff0b98e6405c7cc9811bbbc3dSteve Block //ALOGW("not connected to system property server\n"); 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 22369f4cd7f5add7a7c7f5915e5292aab7eb2a42e9fSteve Block //ALOGV("Connected to system property server\n"); 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint property_get(const char *key, char *value, const char *default_value) 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char sendBuf[1+PROPERTY_KEY_MAX]; 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char recvBuf[1+PROPERTY_VALUE_MAX]; 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len = -1; 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 23369f4cd7f5add7a7c7f5915e5292aab7eb2a42e9fSteve Block //ALOGV("PROPERTY GET [%s]\n", key); 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_once(&gInitOnce, init); 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (gPropFd < 0) { 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* this mimics the behavior of the device implementation */ 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (default_value != NULL) { 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(value, default_value); 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = strlen(value); 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return len; 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (strlen(key) >= PROPERTY_KEY_MAX) return -1; 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memset(sendBuf, 0xdd, sizeof(sendBuf)); // placate valgrind 248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sendBuf[0] = (char) kSystemPropertyGet; 250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(sendBuf+1, key); 251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_lock(&gPropertyFdLock); 253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (write(gPropFd, sendBuf, sizeof(sendBuf)) != sizeof(sendBuf)) { 254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_unlock(&gPropertyFdLock); 255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (read(gPropFd, recvBuf, sizeof(recvBuf)) != sizeof(recvBuf)) { 258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_unlock(&gPropertyFdLock); 259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_unlock(&gPropertyFdLock); 262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* first byte is 0 if value not defined, 1 if found */ 264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (recvBuf[0] == 0) { 265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (default_value != NULL) { 266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(value, default_value); 267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = strlen(value); 268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* 270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * If the value isn't defined, hand back an empty string and 271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * a zero length, rather than a failure. This seems wrong, 272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * since you can't tell the difference between "undefined" and 273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * "defined but empty", but it's what the device does. 274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project value[0] = '\0'; 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = 0; 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (recvBuf[0] == 1) { 279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(value, recvBuf+1); 280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = strlen(value); 281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 28201dda204cd28fe181691b4a44a51be7e5666d0c8Steve Block ALOGE("Got strange response to property_get request (%d)\n", 283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project recvBuf[0]); 284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project assert(0); 285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 28769f4cd7f5add7a7c7f5915e5292aab7eb2a42e9fSteve Block //ALOGV("PROP [found=%d def='%s'] (%d) [%s]: [%s]\n", 288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // recvBuf[0], default_value, len, key, value); 289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return len; 291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint property_set(const char *key, const char *value) 295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char sendBuf[1+PROPERTY_KEY_MAX+PROPERTY_VALUE_MAX]; 297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char recvBuf[1]; 298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int result = -1; 299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 30069f4cd7f5add7a7c7f5915e5292aab7eb2a42e9fSteve Block //ALOGV("PROPERTY SET [%s]: [%s]\n", key, value); 301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_once(&gInitOnce, init); 303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (gPropFd < 0) 304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (strlen(key) >= PROPERTY_KEY_MAX) return -1; 307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (strlen(value) >= PROPERTY_VALUE_MAX) return -1; 308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memset(sendBuf, 0xdd, sizeof(sendBuf)); // placate valgrind 310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sendBuf[0] = (char) kSystemPropertySet; 312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(sendBuf+1, key); 313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(sendBuf+1+PROPERTY_KEY_MAX, value); 314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_lock(&gPropertyFdLock); 316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (write(gPropFd, sendBuf, sizeof(sendBuf)) != sizeof(sendBuf)) { 317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_unlock(&gPropertyFdLock); 318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (read(gPropFd, recvBuf, sizeof(recvBuf)) != sizeof(recvBuf)) { 321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_unlock(&gPropertyFdLock); 322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_mutex_unlock(&gPropertyFdLock); 325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (recvBuf[0] != 1) 327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint property_list(void (*propfn)(const char *key, const char *value, void *cookie), 332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project void *cookie) 333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 33469f4cd7f5add7a7c7f5915e5292aab7eb2a42e9fSteve Block //ALOGV("PROPERTY LIST\n"); 335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pthread_once(&gInitOnce, init); 336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (gPropFd < 0) 337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* SUPER-cheesy place-holder implementation for Win32 */ 345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <cutils/threads.h> 347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic mutex_t env_lock = MUTEX_INITIALIZER; 349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint property_get(const char *key, char *value, const char *default_value) 351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char ename[PROPERTY_KEY_MAX + 6]; 353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *p; 354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len; 355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = strlen(key); 357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len >= PROPERTY_KEY_MAX) return -1; 358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memcpy(ename, "PROP_", 5); 359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memcpy(ename + 5, key, len + 1); 360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mutex_lock(&env_lock); 362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p = getenv(ename); 364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(p == 0) p = ""; 365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = strlen(p); 366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len >= PROPERTY_VALUE_MAX) { 367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = PROPERTY_VALUE_MAX - 1; 368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((len == 0) && default_value) { 371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = strlen(default_value); 372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memcpy(value, default_value, len + 1); 373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memcpy(value, p, len); 375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project value[len] = 0; 376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mutex_unlock(&env_lock); 379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return len; 381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint property_set(const char *key, const char *value) 385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char ename[PROPERTY_KEY_MAX + 6]; 387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *p; 388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len; 389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int r; 390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(strlen(value) >= PROPERTY_VALUE_MAX) return -1; 392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = strlen(key); 394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(len >= PROPERTY_KEY_MAX) return -1; 395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memcpy(ename, "PROP_", 5); 396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memcpy(ename + 5, key, len + 1); 397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mutex_lock(&env_lock); 399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef HAVE_MS_C_RUNTIME 400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char temp[256]; 402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project snprintf( temp, sizeof(temp), "%s=%s", ename, value); 403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project putenv(temp); 404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = 0; 405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = setenv(ename, value, 1); 408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mutex_unlock(&env_lock); 410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return r; 412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint property_list(void (*propfn)(const char *key, const char *value, void *cookie), 415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project void *cookie) 416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 421