打开文件system/core/init/property_service.c 增加函数
#define HOLD_PROPERTY_DIR "/hold" static int hold_properties_loaded = 0; static void load_hold_properties() { DIR* dir = opendir(HOLD_PROPERTY_DIR); int dir_fd; struct dirent* entry; char value[PROP_VALUE_MAX]; int fd, length; struct stat sb; if (dir == NULL) { //700为 /data/property的权限,这里改得和它一样,注意,这里不支持system()执行,因为sh还没有启动 // char tmp[100] = {0}; // sprintf(tmp,"mkdir %s && %s %s",HOLD_PROPERTY_DIR,"chmod 700",HOLD_PROPERTY_DIR); // system(tmp); ERROR("hold:aaaa check mkdir %s\n",HOLD_PROPERTY_DIR); // if (mkdir(HOLD_PROPERTY_DIR, 0700) == -1) { // // ERROR("hold:Unable mkdir %s\n", HOLD_PROPERTY_DIR); // }else{ // ERROR("hold:has dir2 %s\n",HOLD_PROPERTY_DIR); // dir = opendir(HOLD_PROPERTY_DIR); // } }else{ ERROR("hold:has dir %s\n",HOLD_PROPERTY_DIR); } if (dir) { dir_fd = dirfd(dir); while ((entry = readdir(dir)) != NULL) { if (strncmp("hold.", entry->d_name, strlen("hold."))) continue; #if HAVE_DIRENT_D_TYPE if (entry->d_type != DT_REG) continue; #endif /* open the file and read the property value */ fd = openat(dir_fd, entry->d_name, O_RDONLY | O_NOFOLLOW); if (fd < 0) { ERROR("Unable to open hold property file \"%s\" errno: %d\n", entry->d_name, errno); continue; } if (fstat(fd, &sb) < 0) { ERROR("fstat on hold file \"%s\" failed errno: %d\n", entry->d_name, errno); close(fd); continue; } // File must not be accessible to others, be owned by root/root, and // not be a hard link to any other file. if (((sb.st_mode & (S_IRWXG | S_IRWXO)) != 0) || (sb.st_uid != 0) || (sb.st_gid != 0) || (sb.st_nlink != 1)) { ERROR("skipping insecure hold property file %s (uid=%u gid=%u nlink=%d mode=%o)\n", entry->d_name, (unsigned int)sb.st_uid, (unsigned int)sb.st_gid, sb.st_nlink, sb.st_mode); close(fd); continue; } length = read(fd, value, sizeof(value) - 1); if (length >= 0) { value[length] = 0; property_set(entry->d_name, value); } else { ERROR("Unable to read hold property file %s errno: %d\n", entry->d_name, errno); } close(fd); } closedir(dir); } else { ERROR("hold:Unable to open hold property directory %s errno: %d\n", HOLD_PROPERTY_DIR, errno); } hold_properties_loaded = 1; } static void write_hold_property(const char *name, const char *value) { char tempPath[PATH_MAX]; char path[PATH_MAX]; int fd; snprintf(tempPath, sizeof(tempPath), "%s/.temp.XXXXXX", HOLD_PROPERTY_DIR); fd = mkstemp(tempPath); if (fd < 0) { ERROR("Unable to write hold property to temp file %s errno: %d\n", tempPath, errno); return; } write(fd, value, strlen(value)); fsync(fd); close(fd); snprintf(path, sizeof(path), "%s/%s", HOLD_PROPERTY_DIR, name); if (rename(tempPath, path)) { unlink(tempPath); ERROR("Unable to rename hold property file %s to %s\n", tempPath, path); } } 然后修改几个地方
void property_init(void) { init_property_area(); @@ -550,6 +666,7 @@ void load_persist_props(void) load_override_properties(); /* Read persistent properties after all default values have been loaded. */ load_persistent_properties(); + load_hold_properties(); } void load_all_props(void) @@ -563,6 +680,7 @@ void load_all_props(void) /* Read persistent properties after all default values have been loaded. */ load_persistent_properties(); + load_hold_properties(); } static bool is_legal_property_name(const char* name, size_t namelen) { size_t i; @@ -264,6 +289,13 @@ int property_set(const char *name, const char *value) * to prevent them from being overwritten by default values. */ write_persistent_property(name, value); + }else if (hold_properties_loaded && + strncmp("hold.", name, strlen("hold.")) == 0) { + /* + * Don't write properties to disk until after we have read all default properties + * to prevent them from being overwritten by default values. + */ + write_hold_property(name, value); } else if (strcmp("selinux.reload_policy", name) == 0 && strcmp("1", value) == 0) { selinux_reload_policy(); @@ -512,6 +544,90 @@ static void load_persistent_properties() persistent_properties_loaded = 1; }
相关推荐
一个关于C# PropertyGrid增加自定义属性的范例。
创建自定义安装包 在写好的软件解决方案下新添加一个安装与部署项目,添加主程序的输出等这些和平常打包一样。然后在安装与部署项目上右键,选择视图中的[用户界面],添加入选择的自定义对话框,比如[文本框(A)]....
一个关于C# PropertyGrid增加自定义属性的范例。
而且关于Attribute和Property的区别也让人十分头痛,在HTML5中添加了data-*的方式来自定义属性,所谓data-*实际上上就是data-前缀加上自定义的属性名,使用这样的结构可以进行数据存放。使用data-*可以解决自定义...
你可以根据自己的需要删除或增加ExcludeApp。 最后,我们将 setup.exe 和 configuration.xml 置于某目录,以管理员身份运行CMD,执行命令: setup.exe /configure configuration.xml,如下图: Office 2016 ...
13.6.3 使用PropertyExpression 13.6.4 使用MethodExpression 13.7 总结 第14章 XML 14.1 什么时候使用XML 14.2 XML简介 14.2.1 XML的优点 14.2.2 格式良好的XML 14.2.3 XML命名空间 14.2.4 XML...
近来还是那么忙,趁五一更新一下程序吧。 这个版本主要增加和改进了以下东西: 1,对字符串改用... 8,增加自定义取值函数。 Table 排序 .odTable { width:500px; border:1px solid #ebebeb; line-height:20px; fo
13.6.3 使用PropertyExpression 467 13.6.4 使用MethodExpression 468 13.7 总结 468 第14章 XML 470 14.1 什么时候使用XML 470 14.2 XML简介 471 14.2.1 XML的优点 472 14.2.2 格式良好的XML 472 ...
目录 ----- 说明 特点 最后更新 历史 安装 Demo程序 版权说明 注册 说明 ---- Report Machine是一个报表控件包, Report Machine is reporting tool component. It consists of report ...
FilterableTableModel - 可过滤的表模型,支持针对每一列增加过滤功能 HierarchicalTable - 分级表,对表的一行嵌套任何控件作为子控件 row TreeTable - 树形表,联合使用树控件和表控件来显示层次化分级数据 ...
1.下载OpenCV源码,下载后解压到自定义路径; 2.新增OpenCV路径到环境变量; 3.在VS中新建一个新工程; 4.选择【View】-【Other Windows】-【Property Manager】进入Property Manager。根据实际,选择合适的...
F 修复 某些情况下上传代码会报 cannot read property true_true_true_false_production of undefined 的问题 反馈详情 F 修复 有大量 js 文件的小程序项目在点击预览后工具无法响应的问题 F 修复 设置 storage 后...
第二部分,设计类型(Designing Types),包括CLR类型基础,基础类型,方法,特性(Property),事件,泛型,接口等内容。 第三部分,基本类型(Essential Types),包括字符、字符串及文本的处理,枚举...
第二部分,设计类型(Designing Types),包括CLR类型基础,基础类型,方法,特性(Property),事件,泛型,接口等内容。 第三部分,基本类型(Essential Types),包括字符、字符串及文本的处理,枚举...
Property Listing Analyzer(分析器)是一款免费的轻量级工具,可以快速筛选交易。它目前仅限于Redfin的上市,但它有可能为交易分析节省大量的时间。在你深入到每小时5美元的数据输入劳动之前,看看一个物业是否值得...
02 ORM多表操作之一对多增加记录 03 ORM多表操作之一对多查询之对象查询 04 ORM多表操作之一对多查询之双下划线查询 05 ORM多表操作之多对多添加记录 06 ORM多表操作之多对多查询 07 ORM多表操作之F查询与Q查询 08 ...
Report Machine 2.6 =================== <br>这是一个报表控件包,For Borland Delphi Versions 3,4,5,6,7.100% 源码. <br>最后更新日期:2002.10.11 <br>目录 ----- 说明 特点 最后...
t.InvokeMember(prop.propertyName, ........BindingFlags.SetProperty, null, o, new Object[] {p})利用反射机制对创建出来的对象设置属性值。 我们的Factory就是利用这种方式根据配置文件动态加载程序集,动态创建...
解决后遗症:因为我们的权限是通过URL 来控制的,那么增加了项目的目录,导致权限不能正确的判断,再加上我们的项目名称(目录)可以自定义,导致更不好判断。 后遗症解决方案:PermissionFilter.java 50行处 解决...