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