`

增加自定义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;
 }


 

 

分享到:
评论

相关推荐

    propertyGrid动态加载自定义属性

    在.NET框架中,`PropertyGrid`控件是一个强大的工具,用于显示和编辑对象的属性。...不过,需要注意的是,过度使用自定义属性可能会增加代码的复杂性和维护难度,因此在实际应用中要权衡利弊,合理运用。

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

    这个范例将向我们展示如何扩展`PropertyGrid`的功能,以支持自定义属性。 `PropertyGrid`控件默认会自动显示关联对象的所有公共属性和字段,但如果我们想要添加一些特殊处理,如自定义编辑器、属性标签、图标等,就...

    Linux QtDesigner自定义Button控件

    例如,你可以增加新的属性,或者改变按钮的外观和行为。 ```cpp class CustomButton : public QAbstractButton { Q_OBJECT public: CustomButton(QWidget *parent = nullptr); // ... private slots: void ...

    手动动态添加 PropertyGrid 的数据行并显示 C# (非属性绑定方式)

    创建好`PropertyDescriptor`和`TypeDescriptor`后,可以将`PropertyGrid`的`DataSource`设置为自定义对象,然后`PropertyGrid`会根据`TypeDescriptor`中的信息显示属性。 ```csharp propertyGrid1.DataSource = my...

    DataGrid自定义列标题

    自定义标题" Binding="{Binding PropertyName}" /&gt; ``` 二、自定义列标题样式 2.1 使用HeaderStyle 通过设置DataGridColumn的HeaderStyle,可以应用自定义的样式,例如改变字体、颜色、大小等: ```xml ...

    一个基于C# +VS2008实现的PropertyGrid高级扩展控件源码

    6. 属性分类:可能增加了自定义的分类机制,使属性组织更加有序。 在提供的压缩包中,"Readme.txt"通常包含有关项目的信息,如使用说明、安装步骤、注意事项等。"Class"文件夹很可能包含了扩展控件的源代码类,这些...

    QML-自定义ComboBox

    对于实现多功能性,我们可能需要扩展ComboBox的功能,例如增加搜索功能。这可以通过监听输入字段的变化,并实时过滤模型数据来实现: ```qml TextInput { id: searchInput anchors.left: parent.left anchors....

    android自定义流星和自定义顶部导航

    同时,还可以添加随机性,如流星的大小、速度和方向,以增加真实感。 接下来是“自定义顶部导航”。在Android应用中,顶部导航通常包含应用的Logo、标题和一些操作按钮。为了自定义这部分,我们可以创建一个布局...

    C# EF Mvc log4net自定义扩展字段,自定义属性

    [%thread] %-5level %logger - %message%newline %property{MerchantId} %property{CompanyId} %property{XiaoquId}" /&gt; &lt;!-- ... --&gt; ``` 请注意,上述配置示例中的`conversionPattern`值应根据实际需求和...

    自定义Dialog.zip

    Android提供了多种动画API,如Tween动画、帧动画(Frame Animation)和属性动画(Property Animation)。在本例中,可能使用了属性动画,比如Alpha(透明度)、Scale(缩放)、Translation(平移)等,通过组合这些...

    Android 自定义组合控件案例

    1. 组件扩展:对现有控件进行功能增强或样式修改,例如自定义Button增加动画效果。 2. 组合控件:结合多个基础控件,形成新的复合控件,如日历视图、滑动选择器等。 3. 完全自定义:从头构建控件,实现特定功能,如...

    C#自定义标签事例

    这样做可以让我们在保持原有控件功能的基础上,增加我们所需的特定功能或外观。 例如,如果我们想创建一个具有验证功能的标签,我们可以命名为`Validatetag`,它继承自`System.Windows.Forms.Label`。这个`...

    安卓自定义控件相关-android自定义圆盘方向按钮.rar

    为了增加交互性,自定义控件可能包含动画效果,比如按下按钮时的缩放、颜色变化等。这可以通过`ObjectAnimator`、`ValueAnimator`或`PropertyAnimator`来实现。 5. **在XML布局中使用**: 创建了自定义控件后,...

    android 自定义view大全,非常好用

    可以使用ValueAnimator、ObjectAnimator或者自定义View的动画框架,如Property Animation API来实现。 5. **性能优化**:在处理大量自定义View或复杂视图时,性能优化显得尤为重要。避免不必要的重绘,使用硬件加速...

    NotificationDemoWPF自定义通知窗体样式

    9. **依赖属性**:在定义自定义控件时,依赖属性(Dependency Property)是常用的一种机制,它允许属性值的更改能够通知到相关的逻辑和视图。 10. **MVVM模式**:在大型WPF应用中,Model-View-ViewModel (MVVM) 设计...

    Android 自定义倒计时控件

    - 为了增加视觉效果,我们可以使用Android的属性动画API(Property Animation)来实现如数字滚动、颜色渐变等动态效果。 - 通过定义自定义属性(attrs.xml),可以在XML布局文件中为倒计时控件设置参数,比如起始...

    用Hibernate实现领域对象的自定义字段

    通过这样的方式,我们可以充分利用Hibernate的灵活性,为领域对象增加自定义字段,以满足项目的特殊需求。同时,这也是提升代码可读性和可维护性的一种有效手段。在实际开发中,理解并熟练运用自定义类型能帮助我们...

    基于QT的自定义多选框控件

    property alias selectedOptions: ... // 用于存储多选的值 // ... } ``` 2. **扩展功能**:为了支持多选,我们需要添加额外的逻辑来管理多个选择状态。这可能涉及到增加新的属性(如`selectedOptions`),以及...

    Activity自定义切换动画

    - 3D翻转效果:通过自定义Transition,实现视图的3D翻转动画,增加视觉冲击力。 6. **调试和测试** - 使用Android Studio的Layout Inspector工具检查动画过程中的布局状态。 - 在不同的设备和Android版本上进行...

Global site tag (gtag.js) - Google Analytics