1 /*
2  * Copyright (c) 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 "napi/native_api.h"
17 #include <cerrno>
18 #include <cstring>
19 #include <fcntl.h>
20 #include <js_native_api.h>
21 #include <node_api.h>
22 #include <pthread.h>
23 #include <unistd.h>
24 #include <utmp.h>
25 
26 #define ONEVAL 1
27 #define MINUSONE (-1)
28 #define PARAM_3 3
29 #define PARAM_8 8
30 #define PARAM_0 0
31 #define PARAM_1 1
32 #define PARAM_2 2
33 #define PARAM_UNNORMAL (-1)
34 #define ERRON_0 0
35 #define PARAM_0777 0777
36 
Setutent(napi_env env, napi_callback_info info)37 static napi_value Setutent(napi_env env, napi_callback_info info)
38 {
39     errno = ERRON_0;
40     napi_value result;
41     setutent();
42     getutent();
43     endutent();
44     if (errno == PARAM_0) {
45         napi_create_int32(env, PARAM_0, &result);
46     } else {
47         napi_create_int32(env, MINUSONE, &result);
48     }
49     return result;
50 }
51 
Pututline(napi_env env, napi_callback_info info)52 static napi_value Pututline(napi_env env, napi_callback_info info)
53 {
54     errno = ERRON_0;
55     struct utmp utmp;
56     time_t t;
57     setutent();
58     memset(&utmp, PARAM_0, sizeof(utmp));
59     utmp.ut_type = RUN_LVL;
60     utmp.ut_pid = ('#' << PARAM_8) + PARAM_3 + '0';
61     time(&t);
62     utmp.ut_time = static_cast<int>(t);
63     struct utmp *ret = pututline(&utmp);
64     napi_value result;
65     if (ret == nullptr) {
66         napi_create_int32(env, PARAM_UNNORMAL, &result);
67     } else {
68         napi_create_int32(env, PARAM_0, &result);
69     }
70     return result;
71 }
72 
Getutent(napi_env env, napi_callback_info info)73 static napi_value Getutent(napi_env env, napi_callback_info info)
74 {
75     struct utmp *p = getutent();
76     napi_value result;
77     if (p == nullptr) {
78         napi_create_int32(env, PARAM_UNNORMAL, &result);
79     } else {
80         napi_create_int32(env, PARAM_0, &result);
81     }
82     return result;
83 }
84 
Utmpname(napi_env env, napi_callback_info info)85 static napi_value Utmpname(napi_env env, napi_callback_info info)
86 {
87     int fp = open("/data/storage/el2/base/files/Fzl.txt", O_RDONLY);
88     write(fp, "/data/storage/el2/base/files/Fzl.txt", sizeof("/data/storage/el2/base/files/Fzl.txt"));
89     close(fp);
90     int ret = utmpname("/data/storage/el2/base/files/Fzl.txt");
91     napi_value result;
92     napi_create_int32(env, ret, &result);
93     return result;
94 }
95 
LoginTty(napi_env env, napi_callback_info info)96 static napi_value LoginTty(napi_env env, napi_callback_info info)
97 {
98     int fileDescribe = open("/data/storage/el2/base/files/fzl.txt", O_CREAT, PARAM_0777);
99     int returnValue = login_tty(fileDescribe);
100     close(fileDescribe);
101     napi_value result = nullptr;
102     napi_create_int32(env, returnValue, &result);
103     return result;
104 }
105 
106 EXTERN_C_START
Init(napi_env env, napi_value exports)107 static napi_value Init(napi_env env, napi_value exports)
108 {
109     napi_property_descriptor desc[] = {
110         {"setutent", nullptr, Setutent, nullptr, nullptr, nullptr, napi_default, nullptr},
111         {"pututline", nullptr, Pututline, nullptr, nullptr, nullptr, napi_default, nullptr},
112         {"getutent", nullptr, Getutent, nullptr, nullptr, nullptr, napi_default, nullptr},
113         {"login_tty", nullptr, LoginTty, nullptr, nullptr, nullptr, napi_default, nullptr},
114         {"utmpname", nullptr, Utmpname, nullptr, nullptr, nullptr, napi_default, nullptr},
115     };
116     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
117     return exports;
118 }
119 
120 EXTERN_C_END
121 
122 static napi_module demoModule = {
123     .nm_version = 1,
124     .nm_flags = 0,
125     .nm_filename = nullptr,
126     .nm_register_func = Init,
127     .nm_modname = "utmp",
128     .nm_priv = ((void *)0),
129     .reserved = {0},
130 };
131 
RegisterEntryModule(void)132 extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); }
133