`

增加自定义property目录

 
阅读更多

打开文件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增加自定义属性的范例。

    一个关于C# PropertyGrid增加自定义属性的范例。

    C#制作自定义安装包 .doc

    创建自定义安装包 在写好的软件解决方案下新添加一个安装与部署项目,添加主程序的输出等这些和平常打包一样。然后在安装与部署项目上右键,选择视图中的[用户界面],添加入选择的自定义对话框,比如[文本框(A)]....

    PropertyGridEx

    一个关于C# PropertyGrid增加自定义属性的范例。

    详解HTML5 data-* 自定义属性

    而且关于Attribute和Property的区别也让人十分头痛,在HTML5中添加了data-*的方式来自定义属性,所谓data-*实际上上就是data-前缀加上自定义的属性名,使用这样的结构可以进行数据存放。使用data-*可以解决自定义...

    Office 2016 自定义组件安装方法 – 只安装Word、Execl和PPT

    你可以根据自己的需要删除或增加ExcludeApp。  最后,我们将 setup.exe 和 configuration.xml 置于某目录,以管理员身份运行CMD,执行命令: setup.exe /configure configuration.xml,如下图: Office 2016  ...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    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...

    JavaScript Table排序 2.0 (更新)

    近来还是那么忙,趁五一更新一下程序吧。 这个版本主要增加和改进了以下东西: 1,对字符串改用... 8,增加自定义取值函数。 Table 排序 .odTable { width:500px; border:1px solid #ebebeb; line-height:20px; fo

    ASP.NET4高级程序设计(第4版) 3/3

    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 ...

    Report machine 2.4

    目录 ----- 说明 特点 最后更新 历史 安装 Demo程序 版权说明 注册 说明 ---- Report Machine是一个报表控件包, Report Machine is reporting tool component. It consists of report ...

    JIDE Grids (表格)开发员技术手册

    FilterableTableModel - 可过滤的表模型,支持针对每一列增加过滤功能 HierarchicalTable - 分级表,对表的一行嵌套任何控件作为子控件 row TreeTable - 树形表,联合使用树控件和表控件来显示层次化分级数据 ...

    Visual Studio环境下使用OpenCV的简要配置

    1.下载OpenCV源码,下载后解压到自定义路径; 2.新增OpenCV路径到环境变量; 3.在VS中新建一个新工程; 4.选择【View】-【Other Windows】-【Property Manager】进入Property Manager。根据实际,选择合适的...

    【最新版】wechat_devtools_1.02.2004020.dmg【亲测可用】最好的微信开发者工具

    F 修复 某些情况下上传代码会报 cannot read property true_true_true_false_production of undefined 的问题 反馈详情 F 修复 有大量 js 文件的小程序项目在点击预览后工具无法响应的问题 F 修复 设置 storage 后...

    CLR via C# 中文版 第三版(part1)

     第二部分,设计类型(Designing Types),包括CLR类型基础,基础类型,方法,特性(Property),事件,泛型,接口等内容。    第三部分,基本类型(Essential Types),包括字符、字符串及文本的处理,枚举...

    CLR via C# 中文版 第三版(part2)

     第二部分,设计类型(Designing Types),包括CLR类型基础,基础类型,方法,特性(Property),事件,泛型,接口等内容。    第三部分,基本类型(Essential Types),包括字符、字符串及文本的处理,枚举...

    房地产清单分析「Property Listing Analyzer」-crx插件

    Property Listing Analyzer(分析器)是一款免费的轻量级工具,可以快速筛选交易。它目前仅限于Redfin的上市,但它有可能为交易分析节省大量的时间。在你深入到每小时5美元的数据输入劳动之前,看看一个物业是否值得...

    python入门到高级全栈工程师培训 第3期 附课件代码

    02 ORM多表操作之一对多增加记录 03 ORM多表操作之一对多查询之对象查询 04 ORM多表操作之一对多查询之双下划线查询 05 ORM多表操作之多对多添加记录 06 ORM多表操作之多对多查询 07 ORM多表操作之F查询与Q查询 08 ...

    rm2.6正式版本

    Report Machine 2.6 =================== &lt;br&gt;这是一个报表控件包,For Borland Delphi Versions 3,4,5,6,7.100% 源码. &lt;br&gt;最后更新日期:2002.10.11 &lt;br&gt;目录 ----- 说明 特点 最后...

    Spring.net框架

    t.InvokeMember(prop.propertyName, ........BindingFlags.SetProperty, null, o, new Object[] {p})利用反射机制对创建出来的对象设置属性值。 我们的Factory就是利用这种方式根据配置文件动态加载程序集,动态创建...

    SpringMVC-Mybatis-Shiro-redis-master 权限集成缓存中实例

    解决后遗症:因为我们的权限是通过URL 来控制的,那么增加了项目的目录,导致权限不能正确的判断,再加上我们的项目名称(目录)可以自定义,导致更不好判断。 后遗症解决方案:PermissionFilter.java 50行处 解决...

Global site tag (gtag.js) - Google Analytics