1 /*
2  * Copyright (c) 2023-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *    http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <dirent.h>
17 #include <errno.h>
18 #include <unistd.h>
19 #include <sys/types.h>
20 #include <stdio.h>
21 #include <sys/stat.h>
22 #include <stdbool.h>
23 
24 #include <securec.h>
25 
26 /**
27  * This bin file is used in l2 device triggered when device initializing
28 */
29 
30 #include "hilog/log.h"
31 #define LOG_ENGINE LOG_CORE
32 #define LOG_PUBLIC "{public}"
33 #undef LOG_DOMAIN
34 #define LOG_DOMAIN 0xD002F00 /* Security subsystem's domain id */
35 
36 #define HKS_LOG_E(fmt, arg...) HILOG_ERROR(LOG_ENGINE, "%" LOG_PUBLIC "s[%" LOG_PUBLIC "u]: " fmt "\n", \
37                                                                                             __func__, __LINE__, ##arg)
38 
39 #define HUKS_SERVICE_UID 3510
40 #define DIR_TYPE 4
41 #define DEFAULT_PATH_LEN 1024
42 #define DEFAULT_HUKS_PATH_PERMISSION 0700
43 
44 #include <stdio.h>
45 
46 #include <errno.h>
47 
ChangeDirAndFilesPerm(const char * path)48 static void ChangeDirAndFilesPerm(const char *path)
49 {
50     HKS_LOG_E("enter ChangeDirAndFilesPerm %" LOG_PUBLIC "s", path);
51     DIR *dir;
52     struct dirent *ptr;
53     dir = opendir(path);
54     if (dir == NULL) {
55         return;
56     }
57     int ret = EOK;
58     while ((ptr = readdir(dir)) != NULL) {
59         if (strcmp(ptr->d_name, ".") == 0 || strcmp(ptr->d_name, "..") == 0) {
60             continue;
61         }
62         char curPath[DEFAULT_PATH_LEN] = { 0 };
63 
64         ret = strcpy_s(curPath, DEFAULT_PATH_LEN, path);
65         if (ret != EOK) {
66             break;
67         }
68         ret = strcat_s(curPath, DEFAULT_PATH_LEN, "/");
69         if (ret != EOK) {
70             break;
71         }
72         ret = strcat_s(curPath, DEFAULT_PATH_LEN, ptr->d_name);
73         if (ret != EOK) {
74             break;
75         }
76 
77         ret = chown(curPath, HUKS_SERVICE_UID, HUKS_SERVICE_UID);
78         if (ret != EOK) {
79             break;
80         }
81         if ((ptr->d_type != DIR_TYPE)) {
82             if (chmod(curPath, S_IRUSR | S_IWUSR) < 0) {
83                 break;
84             }
85         } else {
86             if (chmod(curPath, S_IRWXU) < 0) {
87                 break;
88             }
89             ChangeDirAndFilesPerm(curPath);
90         }
91     }
92     if (ret != EOK) {
93         printf("chmod dir and file failed! errno = 0x%x \n", errno);
94     }
95     (void)closedir(dir);
96 }
97 
main(void)98 int main(void)
99 {
100     const char *path = "/data/data/huks_service";
101     // change directories and files permission
102     ChangeDirAndFilesPerm(path);
103 }
104