1 /*
2  * Copyright (c) 2021-2022 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 "constants.h"
17 
18 #include <cstdio>
19 #include <cstdlib>
20 #include <cstring>
21 #include <fcntl.h>
22 #include <memory>
23 #include <sstream>
24 #include <sys/stat.h>
25 #include <unistd.h>
26 
27 #include "securec.h"
28 #include "../../common/log.h"
29 #include "../../common/napi/n_class.h"
30 #include "../../common/napi/n_func_arg.h"
31 #include "../../common/uni_error.h"
32 
33 namespace OHOS {
34 namespace DistributedFS {
35 namespace ModuleFileIO {
36 using namespace std;
37 
Constructor(napi_env env,napi_callback_info info)38 napi_value Constants::Constructor(napi_env env, napi_callback_info info)
39 {
40     NFuncArg funcArg(env, info);
41 
42     if (!funcArg.InitArgs(NARG_CNT::ZERO)) {
43         UniError(EINVAL).ThrowErr(env, "Number of arguments unmatched");
44         return nullptr;
45     }
46     return funcArg.GetThisVar();
47 }
48 
Export()49 bool Constants::Export()
50 {
51     // access
52     napi_value F_OK_ = nullptr;
53     napi_create_int32(exports_.env_, F_OK, &F_OK_);                       // 0 F_OK
54     napi_value R_OK_ = nullptr;
55     napi_create_int32(exports_.env_, R_OK, &R_OK_);                       // 4 R_OK
56     napi_value W_OK_ = nullptr;
57     napi_create_int32(exports_.env_, W_OK, &W_OK_);                       // 2 W_OK
58     napi_value X_OK_ = nullptr;
59     napi_create_int32(exports_.env_, X_OK, &X_OK_);                       // 1  X_OK
60     // open
61     napi_value O_RDONLY_ = nullptr;
62     napi_create_int32(exports_.env_, O_RDONLY, &O_RDONLY_);               // 0 O_RDONLY
63     napi_value O_WRONLY_ = nullptr;
64     napi_create_int32(exports_.env_, O_WRONLY, &O_WRONLY_);               // 1 O_WRONLY
65     napi_value O_RDWR_ = nullptr;
66     napi_create_int32(exports_.env_, O_RDWR, &O_RDWR_);                   // 2 O_RDWR
67     napi_value O_CREAT_ = nullptr;
68     napi_create_int32(exports_.env_, O_CREAT, &O_CREAT_);                 // 0o100 O_CREAT
69     napi_value O_EXCL_ = nullptr;
70     napi_create_int32(exports_.env_, O_EXCL, &O_EXCL_);                   // 0o200 O_EXCL
71     napi_value O_TRUNC_  = nullptr;
72     napi_create_int32(exports_.env_, O_TRUNC, &O_TRUNC_);                 // 0o1000 O_TRUNC
73     napi_value O_APPEND_ = nullptr;
74     napi_create_int32(exports_.env_, O_APPEND, &O_APPEND_);               // 0o2000 O_APPEND
75     napi_value O_NONBLOCK_ = nullptr;
76     napi_create_int32(exports_.env_, O_NONBLOCK, &O_NONBLOCK_);           // 0o4000 O_NONBLOCK
77     napi_value O_DIRECTORY_ = nullptr;
78     napi_create_int32(exports_.env_, O_DIRECTORY, &O_DIRECTORY_);         // 0o200000 O_DIRECTORY
79     napi_value O_NOFOLLOW_ = nullptr;
80     napi_create_int32(exports_.env_, O_NOFOLLOW, &O_NOFOLLOW_);           // 0o400000 O_NOFOLLOW
81     napi_value O_SYNC_ = nullptr;
82     napi_create_int32(exports_.env_, O_SYNC, &O_SYNC_);                   // 0o4010000 O_SYNC
83 
84     // stat
85     napi_value S_IFMT_ = nullptr;
86     napi_create_int32(exports_.env_, S_IFMT, &S_IFMT_);                   // 0o170000 S_IFMT
87     napi_value S_IFSOCK_ = nullptr;
88     napi_create_int32(exports_.env_, S_IFSOCK, &S_IFSOCK_);               // 0o140000 S_IFSOCK
89     napi_value S_IFLNK_ = nullptr;
90     napi_create_int32(exports_.env_, S_IFLNK, &S_IFLNK_);                 // 0o120000 S_IFLNK
91     napi_value S_IFREG_ = nullptr;
92     napi_create_int32(exports_.env_, S_IFREG, &S_IFREG_);                 // 0o100000 S_IFREG
93     napi_value S_IFBLK_ = nullptr;
94     napi_create_int32(exports_.env_, S_IFBLK, &S_IFBLK_);                 // 0o060000 S_IFBLK
95     napi_value S_IFDIR_ = nullptr;
96     napi_create_int32(exports_.env_, S_IFDIR, &S_IFDIR_);                 // 0o040000 S_IFDIR
97     napi_value S_IFCHR_  = nullptr;
98     napi_create_int32(exports_.env_, S_IFCHR, &S_IFCHR_);                 // 0o020000 S_IFCHR
99     napi_value S_IFIFO_  = nullptr;
100     napi_create_int32(exports_.env_, S_IFIFO, &S_IFIFO_);                 // 0o010000 S_IFIFO
101     napi_value S_IRWXU_  = nullptr;
102     napi_create_int32(exports_.env_, S_IRWXU, &S_IRWXU_);                 // 0o0700 S_IRWXU
103     napi_value S_IRUSR_  = nullptr;
104     napi_create_int32(exports_.env_, S_IRUSR, &S_IRUSR_);                 // 0o0400 S_IRUSR
105     napi_value S_IWUSR_  = nullptr;
106     napi_create_int32(exports_.env_, S_IWUSR, &S_IWUSR_);                 // 0o0200 S_IWUSR
107     napi_value S_IXUSR_  = nullptr;
108     napi_create_int32(exports_.env_, S_IXUSR, &S_IXUSR_);                 // 0o0100 S_IXUSR
109     napi_value S_IRWXG_  = nullptr;
110     napi_create_int32(exports_.env_, S_IRWXG, &S_IRWXG_);                 // 0o0070 S_IRWXG
111     napi_value S_IRGRP_  = nullptr;
112     napi_create_int32(exports_.env_, S_IRGRP, &S_IRGRP_);                 // 0o0040 S_IRGRP
113     napi_value S_IWGRP_  = nullptr;
114     napi_create_int32(exports_.env_, S_IWGRP, &S_IWGRP_);                 // 0o0020 S_IWGRP
115     napi_value S_IXGRP_  = nullptr;
116     napi_create_int32(exports_.env_, S_IXGRP, &S_IXGRP_);                 // 0o0010 S_IXGRP
117     napi_value S_IRWXO_  = nullptr;
118     napi_create_int32(exports_.env_, S_IRWXO, &S_IRWXO_);                 // 0o0007 S_IRWXO
119     napi_value S_IROTH_  = nullptr;
120     napi_create_int32(exports_.env_, S_IROTH, &S_IROTH_);                 // 0o0004 S_IROTH
121     napi_value S_IWOTH_  = nullptr;
122     napi_create_int32(exports_.env_, S_IWOTH, &S_IWOTH_);                 // 0o0002 S_IWOTH
123     napi_value S_IXOTH_  = nullptr;
124     napi_create_int32(exports_.env_, S_IXOTH, &S_IXOTH_);                 // 0o0001 S_IXOTH
125 
126     vector<napi_property_descriptor> props = {
127         NVal::DeclareNapiStaticProperty("F_OK", F_OK_),
128         NVal::DeclareNapiStaticProperty("R_OK", R_OK_),
129         NVal::DeclareNapiStaticProperty("W_OK", W_OK_),
130         NVal::DeclareNapiStaticProperty("X_OK", X_OK_),
131         NVal::DeclareNapiStaticProperty("O_RDONLY", O_RDONLY_),
132         NVal::DeclareNapiStaticProperty("O_WRONLY", O_WRONLY_),
133         NVal::DeclareNapiStaticProperty("O_RDWR", O_RDWR_),
134         NVal::DeclareNapiStaticProperty("O_CREAT", O_CREAT_),
135         NVal::DeclareNapiStaticProperty("O_EXCL", O_EXCL_),
136         NVal::DeclareNapiStaticProperty("O_TRUNC", O_TRUNC_),
137         NVal::DeclareNapiStaticProperty("O_APPEND", O_APPEND_),
138         NVal::DeclareNapiStaticProperty("O_NONBLOCK", O_NONBLOCK_),
139         NVal::DeclareNapiStaticProperty("O_DIRECTORY", O_DIRECTORY_),
140         NVal::DeclareNapiStaticProperty("O_NOFOLLOW", O_NOFOLLOW_),
141         NVal::DeclareNapiStaticProperty("O_SYNC", O_SYNC_),
142         NVal::DeclareNapiStaticProperty("S_IFMT", S_IFMT_),
143         NVal::DeclareNapiStaticProperty("S_IFSOCK", S_IFSOCK_),
144         NVal::DeclareNapiStaticProperty("S_IFLNK", S_IFLNK_),
145         NVal::DeclareNapiStaticProperty("S_IFREG", S_IFREG_),
146         NVal::DeclareNapiStaticProperty("S_IFBLK", S_IFBLK_),
147         NVal::DeclareNapiStaticProperty("S_IFDIR", S_IFDIR_),
148         NVal::DeclareNapiStaticProperty("S_IFCHR", S_IFCHR_),
149         NVal::DeclareNapiStaticProperty("S_IFIFO", S_IFIFO_),
150         NVal::DeclareNapiStaticProperty("S_IRWXU", S_IRWXU_),
151         NVal::DeclareNapiStaticProperty("S_IRUSR", S_IRUSR_),
152         NVal::DeclareNapiStaticProperty("S_IWUSR", S_IWUSR_),
153         NVal::DeclareNapiStaticProperty("S_IXUSR", S_IXUSR_),
154         NVal::DeclareNapiStaticProperty("S_IRWXG", S_IRWXG_),
155         NVal::DeclareNapiStaticProperty("S_IRGRP", S_IRGRP_),
156         NVal::DeclareNapiStaticProperty("S_IWGRP", S_IWGRP_),
157         NVal::DeclareNapiStaticProperty("S_IXGRP", S_IXGRP_),
158         NVal::DeclareNapiStaticProperty("S_IRWXO", S_IRWXO_),
159         NVal::DeclareNapiStaticProperty("S_IROTH", S_IROTH_),
160         NVal::DeclareNapiStaticProperty("S_IWOTH", S_IWOTH_),
161         NVal::DeclareNapiStaticProperty("S_IXOTH", S_IXOTH_),
162     };
163 
164     string className = GetClassName();
165     bool succ = false;
166     napi_value classValue = nullptr;
167     tie(succ, classValue) = NClass::DefineClass(exports_.env_, className, Constants::Constructor, std::move(props));
168     if (!succ) {
169         UniError(EIO).ThrowErr(exports_.env_, "INNER BUG. Failed to define class");
170         return false;
171     }
172     succ = NClass::SaveClass(exports_.env_, className, classValue);
173     if (!succ) {
174         UniError(EIO).ThrowErr(exports_.env_, "INNER BUG. Failed to save class");
175         return false;
176     }
177 
178     return exports_.AddProp(className, classValue);
179 }
180 
GetClassName()181 string Constants::GetClassName()
182 {
183     return Constants::className_;
184 }
185 
Constants(napi_env env,napi_value exports)186 Constants::Constants(napi_env env, napi_value exports) : NExporter(env, exports) {}
~Constants()187 Constants::~Constants() {}
188 } // namespace ModuleFileIO
189 } // namespace DistributedFS
190 } // namespace OHOS
191