11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved. 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met: 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * * Redistributions of source code must retain the above copyright 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer. 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * * Redistributions in binary form must reproduce the above copyright 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer in 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * the documentation and/or other materials provided with the 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * distribution. 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE. 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _INCLUDE_SYS__SYSTEM_PROPERTIES_H 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _INCLUDE_SYS__SYSTEM_PROPERTIES_H 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_ 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#error you should #include <sys/system_properties.h> instead 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/system_properties.h> 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef struct prop_area prop_area; 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttypedef struct prop_msg prop_msg; 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define PROP_AREA_MAGIC 0x504f5250 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define PROP_AREA_VERSION 0x45434f76 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define PROP_SERVICE_NAME "property_service" 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* #define PROP_MAX_ENTRIES 247 */ 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 247 -> 32620 bytes (<32768) */ 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TOC_NAME_LEN(toc) ((toc) >> 24) 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define TOC_TO_INFO(area, toc) ((prop_info*) (((char*) area) + ((toc) & 0xFFFFFF))) 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct prop_area { 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned volatile count; 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned volatile serial; 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned magic; 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned version; 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned reserved[4]; 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned toc[1]; 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define SERIAL_VALUE_LEN(serial) ((serial) >> 24) 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define SERIAL_DIRTY(serial) ((serial) & 1) 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct prop_info { 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char name[PROP_NAME_MAX]; 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned volatile serial; 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char value[PROP_VALUE_MAX]; 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct prop_msg 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project unsigned cmd; 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char name[PROP_NAME_MAX]; 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char value[PROP_VALUE_MAX]; 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define PROP_MSG_SETPROP 1 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** Rules: 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** - there is only one writer, but many readers 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** - prop_area.count will never decrease in value 831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** - once allocated, a prop_info's name will not change 841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** - once allocated, a prop_info's offset will not change 851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** - reading a value requires the following steps 861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** 1. serial = pi->serial 871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** 2. if SERIAL_DIRTY(serial), wait*, then goto 1 881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** 3. memcpy(local, pi->value, SERIAL_VALUE_LEN(serial) + 1) 891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** 4. if pi->serial != serial, goto 2 901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** 911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** - writing a value requires the following steps 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** 1. pi->serial = pi->serial | 1 931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** 2. memcpy(pi->value, local_value, value_len) 941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** 3. pi->serial = (value_len << 24) | ((pi->serial + 1) & 0xffffff) 951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** 961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** Improvements: 971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** - maintain the toc sorted by pi->name to allow lookup 981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** by binary search 991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** 1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/ 1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define PROP_PATH_RAMDISK_DEFAULT "/default.prop" 1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define PROP_PATH_SYSTEM_BUILD "/system/build.prop" 1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define PROP_PATH_SYSTEM_DEFAULT "/system/default.prop" 1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define PROP_PATH_LOCAL_OVERRIDE "/data/local.prop" 1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 109