• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "common/napi_helper.cpp"
17 #include "napi/native_api.h"
18 #include <cstdarg>
19 #include <cstdio>
20 #include <cstdlib>
21 #include <cstring>
22 #include <fcntl.h>
23 #include <sys/inotify.h>
24 #include <utmp.h>
25 #include <uv.h>
26 
27 #define SBUF_SIZE 128
28 #define ONEVAL 1
29 #define MINUSONE (-1)
30 #define SUCCESS 1
31 #define ERRON_0 0
32 #define SIZE_20 20
33 #define PARAM_1 1
34 #define PARAM_2 2
35 #define ZEROVAL 0
36 #define PATH "/data/storage/el2/base/files"
37 #define TEST_MODE 0666
38 #define SBUF_SIZE 128
39 #define ZEROVAL 0
40 #define ONEVAL 1
41 #define MINUSONE (-1)
42 #define SIXFOUR 64
43 #define ONEEIGHT 18
44 #define MAX_NAMBER 1024
45 #define HUNDRED 100
46 #define MAX_NUMBER 128
47 #define NO_ERR 0
48 #define SUCCESS 1
49 #define FAIL (-1)
50 #define ZERO 0
51 #define PARAM_0 0
52 #define PARAM_1 1
53 #define PARAM_5 5
54 #define PARAM_13 13
55 #define SIZE_64 64
56 #define PARAM_123 123
57 #define PARAM_321 321
58 #define HUNDRED 100
59 #define PATH "/data/storage/el2/base/files"
60 #define STRLENGTH 64
61 #define ONE 1
62 #define PARAM_2 2
63 #define PARAM_UNNORMAL (-1)
64 #define RETURN_0 0
65 #define SIZE_10 10
66 #define SIZE_20 20
67 #define SIZE_100 100
68 #define SIZE_1024 1024
69 #define SIZE_4096 4096
70 #define SIZE_8192 8192
71 #define ONESIX 16
72 #define DEF_VALUE (-2)
73 #define PARAM_10 10
74 #define LENGTH 256
75 #define RUTVAL 112
76 #define STR_VFSCANF_TXT "/data/storage/el2/base/files/Fzl.txt"
77 
78 extern "C" int __vsprintf_chk(char *dest, int flags, size_t dst_len_from_compiler, const char *format, va_list va);
79 
80 extern "C" size_t __fread_chk(void *, size_t, size_t, FILE *, size_t);
81 extern "C" char *__fgets_chk(char *, int, FILE *, size_t);
82 extern "C" ssize_t __pwrite_chk(int fd, const void *buf, size_t count, off_t offset, size_t buf_size);
83 extern "C" ssize_t __write_chk(int fd, const void *buf, size_t count, size_t buf_size);
84 extern "C" int __sprintf_chk(char *dest, int flags, size_t dst_len_from_compiler, const char *format, ...);
85 extern "C" int __snprintf_chk(char *dest, size_t supplied_size, int flags, size_t dst_len_from_compiler,
86                               const char *format, ...);
87 extern "C" int __vsnprintf_chk(char *dest, size_t supplied_size, int flags, size_t dst_len_from_compiler,
88                                const char *format, va_list va);
89 
Setbuf(napi_env env,napi_callback_info info)90 static napi_value Setbuf(napi_env env, napi_callback_info info)
91 {
92     errno = ERRON_0;
93     FILE *f = fopen(STR_VFSCANF_TXT, "w+");
94     setbuf(f, nullptr);
95     fclose(f);
96     napi_value result = nullptr;
97     napi_create_int32(env, errno, &result);
98     return result;
99 }
100 
Setbuffer(napi_env env,napi_callback_info info)101 static napi_value Setbuffer(napi_env env, napi_callback_info info)
102 {
103     errno = ERRON_0;
104     FILE *f = fopen(STR_VFSCANF_TXT, "w+");
105     setbuffer(f, nullptr, BUFSIZ);
106     fclose(f);
107     napi_value result = nullptr;
108     napi_create_int32(env, errno, &result);
109     return result;
110 }
111 
Setlinebuf(napi_env env,napi_callback_info info)112 static napi_value Setlinebuf(napi_env env, napi_callback_info info)
113 {
114     errno = ERRON_0;
115     FILE *f = fopen(STR_VFSCANF_TXT, "w+");
116     setlinebuf(f);
117     fclose(f);
118     napi_value result = nullptr;
119     napi_create_int32(env, errno, &result);
120     return result;
121 }
122 
VsprintfTest(char * format,...)123 int VsprintfTest(char *format, ...)
124 {
125     char buffer[SIZE_20] = {0};
126     va_list aptr;
127     va_start(aptr, format);
128     int vspval = vsprintf(buffer, format, aptr);
129     va_end(aptr);
130     return vspval;
131 }
Vsprintf(napi_env env,napi_callback_info info)132 static napi_value Vsprintf(napi_env env, napi_callback_info info)
133 {
134     int i = ONEVAL;
135     napi_value result = nullptr;
136     char format[SBUF_SIZE] = "%d";
137     int vspval = VsprintfTest(format, i);
138     if (vspval > ZEROVAL) {
139         napi_create_int32(env, ZEROVAL, &result);
140     } else {
141         napi_create_int32(env, MINUSONE, &result);
142     }
143     return result;
144 }
145 
vsprintfChkTest(char * format,...)146 int vsprintfChkTest(char *format, ...)
147 {
148     char buffer[SIZE_20] = {0};
149     va_list aptr;
150     va_start(aptr, format);
151     int vspval = __vsprintf_chk(buffer, PARAM_1, PARAM_2, format, aptr);
152     va_end(aptr);
153     return vspval;
154 }
VsprintfChk(napi_env env,napi_callback_info info)155 static napi_value VsprintfChk(napi_env env, napi_callback_info info)
156 {
157     int i = ONEVAL;
158     napi_value result = nullptr;
159     char format[SBUF_SIZE] = "%d";
160     int vspval = vsprintfChkTest(format, i);
161     if (vspval > ZEROVAL) {
162         napi_create_int32(env, ZEROVAL, &result);
163     } else {
164         napi_create_int32(env, MINUSONE, &result);
165     }
166     return result;
167 }
Feof(napi_env env,napi_callback_info info)168 static napi_value Feof(napi_env env, napi_callback_info info)
169 {
170     char path[SBUF_SIZE] = "/data/storage/el2/base/files/Fzl.txt";
171     int fileDescribe = SUCCESS;
172     FILE *stream = fopen(path, "r");
173     napi_value result = nullptr;
174     fileDescribe = feof(stream);
175     napi_create_int32(env, fileDescribe, &result);
176     return result;
177 }
178 
Tmpnam(napi_env env,napi_callback_info info)179 static napi_value Tmpnam(napi_env env, napi_callback_info info)
180 {
181     char buffer[L_tmpnam];
182     char *p = tmpnam(buffer);
183     napi_value result = nullptr;
184     napi_create_string_utf8(env, p, NAPI_AUTO_LENGTH, &result);
185     return result;
186 }
187 
Tmpfile(napi_env env,napi_callback_info info)188 static napi_value Tmpfile(napi_env env, napi_callback_info info)
189 {
190     FILE *f = tmpfile();
191     int file_value = ZERO;
192     if (f == nullptr) {
193         file_value = FAIL;
194     }
195     napi_value result = nullptr;
196     napi_create_int32(env, file_value, &result);
197     return result;
198 }
199 
Tmpfile64(napi_env env,napi_callback_info info)200 static napi_value Tmpfile64(napi_env env, napi_callback_info info)
201 {
202     FILE *f = tmpfile64();
203     int file_value = ZERO;
204     if (f == nullptr) {
205         file_value = FAIL;
206     }
207     napi_value result = nullptr;
208     napi_create_int32(env, file_value, &result);
209     return result;
210 }
211 
vsnprintfChk_test(char * str,size_t n,char * fmt,const char * funcName,...)212 int vsnprintfChk_test(char *str, size_t n, char *fmt, const char *funcName, ...)
213 {
214     char s[n];
215     va_list ap;
216     va_start(ap, funcName);
217     size_t bos = __DIAGNOSE_BOS(fmt);
218     int vsnval = __vsnprintf_chk(s, n, ZEROVAL, bos, fmt, ap);
219     va_end(ap);
220     return vsnval;
221 }
222 
VsnprintfChk(napi_env env,napi_callback_info info)223 static napi_value VsnprintfChk(napi_env env, napi_callback_info info)
224 {
225     char value[MAX_NUMBER] = "value is use";
226     char value1[MAX_NUMBER] = "value is %s";
227     int vsnval = vsnprintfChk_test(value, PARAM_13, value1, "vsnprintfChk_test", "use");
228     napi_value result = nullptr;
229     if (vsnval < ZEROVAL) {
230         napi_create_int32(env, MINUSONE, &result);
231     } else {
232         napi_create_int32(env, ZEROVAL, &result);
233     }
234     return result;
235 }
236 
SnprintfChk(napi_env env,napi_callback_info info)237 static napi_value SnprintfChk(napi_env env, napi_callback_info info)
238 {
239     size_t argc = PARAM_1;
240     napi_value args[1] = {nullptr};
241     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
242     int isSuccessCase;
243     napi_get_value_int32(env, args[0], &isSuccessCase);
244     char buffer[SIZE_20];
245     int snprintf_value = DEF_VALUE;
246     int toJs = DEF_VALUE;
247     if (isSuccessCase == PARAM_1) {
248         snprintf_value = __snprintf_chk(buffer, SIZE_20, PARAM_0, SIZE_20, "hello : %s", "world!");
249         if (snprintf_value > PARAM_0) {
250             toJs = PARAM_1;
251         }
252     }
253     napi_value result = nullptr;
254     napi_create_int32(env, toJs, &result);
255     return result;
256 }
257 
SprintfChk(napi_env env,napi_callback_info info)258 static napi_value SprintfChk(napi_env env, napi_callback_info info)
259 {
260     size_t argc = PARAM_1;
261     napi_value args[1] = {nullptr};
262     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
263     int isSuccessCase;
264     napi_get_value_int32(env, args[0], &isSuccessCase);
265     char buffer[SIZE_20];
266     int sprintfValue = DEF_VALUE;
267     int toJs = DEF_VALUE;
268     if (isSuccessCase == PARAM_1) {
269         sprintfValue = __sprintf_chk(buffer, PARAM_0, SIZE_20, "hello : %s", "world!");
270         if (sprintfValue > PARAM_0) {
271             toJs = SUCCESS;
272         }
273     }
274     napi_value result = nullptr;
275     napi_create_int32(env, toJs, &result);
276     return result;
277 }
278 
WriteChk(napi_env env,napi_callback_info info)279 static napi_value WriteChk(napi_env env, napi_callback_info info)
280 {
281     size_t argc = PARAM_2;
282     napi_value args[2] = {nullptr};
283     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
284 
285     size_t length = SIZE_64, stresult = PARAM_0;
286     char *strTemp = static_cast<char *>(malloc(sizeof(char) * length));
287     napi_get_value_string_utf8(env, args[0], strTemp, length, &stresult);
288     char *valueSecond = NapiHelper::GetString(env, args[1]);
289 
290     int fp = open(strTemp, O_WRONLY | O_CREAT);
291     ssize_t valueResult = __write_chk(fp, valueSecond, strlen(valueSecond), strlen(valueSecond) + PARAM_1);
292     int toJs = DEF_VALUE;
293     if (valueResult != FAIL) {
294         toJs = SUCCESS;
295     }
296 
297     napi_value result = nullptr;
298     napi_create_int32(env, toJs, &result);
299     return result;
300 }
301 
PwriteChk(napi_env env,napi_callback_info info)302 static napi_value PwriteChk(napi_env env, napi_callback_info info)
303 {
304     size_t argc = PARAM_2;
305     napi_value args[2] = {nullptr};
306     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
307 
308     size_t length = SIZE_64, stresult = PARAM_0;
309     char *strTemp = static_cast<char *>(malloc(sizeof(char) * length));
310     napi_get_value_string_utf8(env, args[0], strTemp, length, &stresult);
311     char *valueSecond = NapiHelper::GetString(env, args[1]);
312 
313     int fp = open(strTemp, O_WRONLY | O_CREAT);
314     ssize_t valueResult = __pwrite_chk(fp, valueSecond, strlen(valueSecond), PARAM_5, strlen(valueSecond) + PARAM_1);
315     int toJs = DEF_VALUE;
316     if (valueResult != FAIL) {
317         toJs = SUCCESS;
318     }
319 
320     napi_value result = nullptr;
321     napi_create_int32(env, toJs, &result);
322     return result;
323 }
324 
FgetsChk(napi_env env,napi_callback_info info)325 static napi_value FgetsChk(napi_env env, napi_callback_info info)
326 {
327     char helloWorld[] = "hello world!";
328     FILE *fp = fmemopen(helloWorld, sizeof(helloWorld), "r");
329     const int bufferSize = ONESIX;
330     char buf[bufferSize];
331     char *char_value;
332     char_value = __fgets_chk(buf, sizeof(buf), fp, ONESIX);
333     napi_value result = nullptr;
334     napi_create_string_utf8(env, char_value, NAPI_AUTO_LENGTH, &result);
335     return result;
336 }
337 
Fread_chk(napi_env env,napi_callback_info info)338 static napi_value Fread_chk(napi_env env, napi_callback_info info)
339 {
340     size_t bos = ZERO;
341     FILE *file;
342     char buffer[20];
343     file = fopen(PATH, "r");
344     int ret = __fread_chk(buffer, bos, bos, file, bos);
345     napi_value result = nullptr;
346     napi_create_int32(env, ret, &result);
347     return result;
348 }
349 
vasprintf_0100(char * v,...)350 int vasprintf_0100(char *v, ...)
351 {
352     va_list ap;
353     va_start(ap, v);
354     char ta[] = " ";
355     char *temp = ta;
356     int result = vasprintf(&temp, v, ap);
357     if (result < PARAM_0 || strcmp(temp, "value is 123 and 321.") != PARAM_0) {
358         result = FAIL;
359     }
360     va_end(ap);
361     return result;
362 }
363 
Vasprintf(napi_env env,napi_callback_info info)364 static napi_value Vasprintf(napi_env env, napi_callback_info info)
365 {
366     size_t argc = PARAM_1;
367     napi_value args[1] = {nullptr};
368     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
369 
370     int caseNumber;
371     int toJs = FAIL;
372     napi_get_value_int32(env, args[0], &caseNumber);
373     if (caseNumber == PARAM_1) {
374         char cb[] = "value is %d and %d.";
375         int value = vasprintf_0100(cb, PARAM_123, PARAM_321);
376         if (value != FAIL) {
377             toJs = SUCCESS;
378         }
379     }
380     napi_value result = nullptr;
381     napi_create_int32(env, toJs, &result);
382     return result;
383 }
384 
Ungetc(napi_env env,napi_callback_info info)385 static napi_value Ungetc(napi_env env, napi_callback_info info)
386 {
387     size_t argc = PARAM_1;
388     napi_value args[1] = {nullptr};
389     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
390 
391     int valueFirst = getchar();
392     napi_get_value_int32(env, args[0], &valueFirst);
393     FILE *fp = fopen("/data/storage/el2/base/files/FZL.txt", "r");
394     valueFirst = getc(fp);
395     int ungetcValue = ungetc(valueFirst, fp);
396     napi_value result = nullptr;
397     napi_create_int32(env, ungetcValue, &result);
398     return result;
399 }
400 
Putw(napi_env env,napi_callback_info info)401 static napi_value Putw(napi_env env, napi_callback_info info)
402 {
403     size_t argc = PARAM_1;
404     napi_value args[1] = {nullptr};
405     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
406     int valueFirst;
407     napi_get_value_int32(env, args[0], &valueFirst);
408     FILE *fp;
409     napi_value result = nullptr;
410     char file[LENGTH] = "/data/storage/el2/base/files/testPutw.txt";
411     fp = fopen(file, "w+");
412     if (valueFirst == ZEROVAL) {
413         int putval = putw(PARAM_10, fp);
414         napi_create_int32(env, putval, &result);
415     } else {
416         int putval = putw(PARAM_10, stdin);
417         napi_create_int32(env, putval, &result);
418     }
419     fclose(fp);
420     return result;
421 }
422 
Rename(napi_env env,napi_callback_info info)423 static napi_value Rename(napi_env env, napi_callback_info info)
424 {
425     char oldName[] = "/data/storage/el2/base/files/testRenameOld.txt";
426     char newName[] = "/data/storage/el2/base/files/testRenameNew.txt";
427     int resultValue = rename(oldName, newName);
428     napi_value result = nullptr;
429 
430     napi_create_int32(env, resultValue, &result);
431     return result;
432 }
vfsf(FILE * file,char * fmt,...)433 int vfsf(FILE *file, char *fmt, ...)
434 {
435     va_list argp;
436     int value;
437     va_start(argp, fmt);
438     value = vfscanf(file, fmt, argp);
439     va_end(argp);
440     return value;
441 }
442 #define TFVAL 24
443 #define FFVAL 40.0
Vfscanf(napi_env env,napi_callback_info info)444 static napi_value Vfscanf(napi_env env, napi_callback_info info)
445 {
446     errno = ZEROVAL;
447     FILE *file;
448     int i = TFVAL;
449     float fl = FFVAL;
450     char str[4] = "boy";
451     file = fopen("/data/storage/el2/base/files/Fzl.txt", "w+");
452     char value[MAX_NUMBER] = "%d%f%s";
453     int ret = vfsf(file, value, i, fl, str);
454     rewind(file);
455     fscanf(file, "%d%f%s", &i, &fl, str);
456     fclose(file);
457     if (errno == NO_ERR) {
458         ret = SUCCESS;
459     }
460     napi_value result;
461     napi_create_int32(env, ret, &result);
462     return result;
463 }
Remove(napi_env env,napi_callback_info info)464 static napi_value Remove(napi_env env, napi_callback_info info)
465 {
466     char path[] = "/data/storage/el2/base/files/testRemove.txt";
467     int resultValue = remove(path);
468     napi_value result = nullptr;
469 
470     napi_create_int32(env, resultValue, &result);
471     return result;
472 }
473 
vfprintftest(char * file_name,char * format,char * funcName,char * want_reuslt,...)474 int vfprintftest(char *file_name, char *format, char *funcName, char *want_reuslt, ...)
475 {
476     FILE *file = fopen(file_name, "w");
477     va_list ap;
478     va_start(ap, want_reuslt);
479     int vfpval = vfprintf(file, format, ap);
480     va_end(ap);
481     fclose(file);
482     return vfpval;
483 }
484 
Vfprintf(napi_env env,napi_callback_info info)485 static napi_value Vfprintf(napi_env env, napi_callback_info info)
486 {
487     char value1[MAX_NUMBER] = "/data/storage/el2/base/files/test.txt";
488     char value2[MAX_NUMBER] = "value is %s and %d";
489     char value3[MAX_NUMBER] = "vfprintf_0100";
490     char value4[MAX_NUMBER] = "value is qwe and 1";
491 
492     int vfpval = vfprintftest(value1, value2, value3, value4, "qwe", "1");
493     napi_value result;
494     if (vfpval < ZEROVAL) {
495         napi_create_int32(env, MINUSONE, &result);
496     } else {
497         napi_create_int32(env, ZEROVAL, &result);
498     }
499     return result;
500 }
501 
vprintf()502 int vprintf()
503 {
504     va_list ap;
505     return vfprintf(stdout, "/data/storage/el2/base/files/test.txt", ap);
506 }
507 
VprintfTestt(char * format,...)508 int VprintfTestt(char *format, ...)
509 {
510     va_list args;
511     va_start(args, format);
512     int vprval = vprintf(format, args);
513     va_end(args);
514     return vprval;
515 }
516 
Vprintf(napi_env env,napi_callback_info info)517 static napi_value Vprintf(napi_env env, napi_callback_info info)
518 {
519     char value[MAX_NUMBER] = "value is %s and %d";
520     int vprval = VprintfTestt(value);
521     napi_value result;
522     if (vprval < ZEROVAL) {
523         napi_create_int32(env, MINUSONE, &result);
524     } else {
525         napi_create_int32(env, ZEROVAL, &result);
526     }
527     return result;
528 }
529 
vsnprintf_test(char * str,size_t n,char * fmt,const char * funcName,...)530 int vsnprintf_test(char *str, size_t n, char *fmt, const char *funcName, ...)
531 {
532     char s[n];
533     va_list ap;
534     va_start(ap, funcName);
535     int vsnval = vsnprintf(s, n, fmt, ap);
536     va_end(ap);
537     return vsnval;
538 }
539 
Vsnprintf(napi_env env,napi_callback_info info)540 static napi_value Vsnprintf(napi_env env, napi_callback_info info)
541 {
542     char value1[MAX_NUMBER] = "value is use";
543     char value2[MAX_NUMBER] = "value is %s";
544 
545     int vsnval = vsnprintf_test(value1, 13, value2, "vsnprintf_test", "use");
546     napi_value result = nullptr;
547     if (vsnval < ZEROVAL) {
548         napi_create_int32(env, MINUSONE, &result);
549     } else {
550         napi_create_int32(env, ZEROVAL, &result);
551     }
552     return result;
553 }
554 
GetMatches(const char * str,const char * format,...)555 int GetMatches(const char *str, const char *format, ...)
556 {
557     va_list args;
558     va_start(args, format);
559     int vssval = vsscanf(str, format, args);
560     va_end(args);
561     return vssval;
562 }
563 
Vsscanf(napi_env env,napi_callback_info info)564 static napi_value Vsscanf(napi_env env, napi_callback_info info)
565 {
566     int val = ZEROVAL;
567     char buf[HUNDRED];
568     int vssval = GetMatches("99 bottles of beer on the wall", " %d %s ", &val, buf);
569     napi_value result;
570     if (vssval < ZEROVAL) {
571         napi_create_int32(env, MINUSONE, &result);
572     } else {
573         napi_create_int32(env, ZEROVAL, &result);
574     }
575     return result;
576 }
577 
Tempnam(napi_env env,napi_callback_info info)578 static napi_value Tempnam(napi_env env, napi_callback_info info)
579 {
580     char dir[] = PATH;
581     char pte[] = "temp";
582     char *temp = tempnam(dir, pte);
583     napi_value result = nullptr;
584     napi_create_string_utf8(env, temp, NAPI_AUTO_LENGTH, &result);
585     return result;
586 }
587 
Sscanf(napi_env env,napi_callback_info info)588 static napi_value Sscanf(napi_env env, napi_callback_info info)
589 {
590     const char *fmt = "temp";
591     char s[] = "temp";
592     int snprintf_value = sscanf(s, fmt, fmt);
593     napi_value result = nullptr;
594     napi_create_int32(env, snprintf_value, &result);
595     return result;
596 }
597 
Snprintf(napi_env env,napi_callback_info info)598 static napi_value Snprintf(napi_env env, napi_callback_info info)
599 {
600     char buffer[20];
601     const char *format = "AB";
602     int snprintf_value = snprintf(buffer, ZERO, format, format);
603     napi_value result = nullptr;
604     napi_create_int32(env, snprintf_value, &result);
605     return result;
606 }
607 
Setvbuf(napi_env env,napi_callback_info info)608 static napi_value Setvbuf(napi_env env, napi_callback_info info)
609 {
610     char buf[MAX_NAMBER] = {0};
611     char path[PATH_MAX] = {0};
612     FILE *fptr = fopen("/data/storage/el2/base/files/FZL.txt", "w+");
613     int setval = setvbuf(fptr, buf, _IOFBF, MAX_NAMBER);
614     napi_value result = nullptr;
615     napi_create_int32(env, setval, &result);
616     fclose(fptr);
617     remove(path);
618     return result;
619 }
620 
PutCUnlocked(napi_env env,napi_callback_info info)621 static napi_value PutCUnlocked(napi_env env, napi_callback_info info)
622 {
623     const int32_t PUTC_RET = RUTVAL;
624     int ret = FAIL;
625     FILE *file = fopen("/data/storage/el2/base/files/fzl.txt", "w");
626     if (putc_unlocked('p', file) != PUTC_RET) {
627         ret = FAIL;
628     } else {
629         ret = SUCCESS;
630     }
631     napi_value result = nullptr;
632     napi_create_int32(env, ret, &result);
633     return result;
634 }
635 
Putc(napi_env env,napi_callback_info info)636 static napi_value Putc(napi_env env, napi_callback_info info)
637 {
638     const int32_t PUTC_RET = RUTVAL;
639     int ret = FAIL;
640     FILE *file = fopen("/data/storage/el2/base/files/fzl.txt", "w");
641     if (putc('p', file) != PUTC_RET) {
642         ret = FAIL;
643     } else {
644         ret = SUCCESS;
645     }
646     napi_value result = nullptr;
647     napi_create_int32(env, ret, &result);
648     return result;
649 }
650 
651 EXTERN_C_START
Init(napi_env env,napi_value exports)652 static napi_value Init(napi_env env, napi_value exports)
653 {
654     napi_property_descriptor desc[] = {
655         {"setbuf", nullptr, Setbuf, nullptr, nullptr, nullptr, napi_default, nullptr},
656         {"setbuffer", nullptr, Setbuffer, nullptr, nullptr, nullptr, napi_default, nullptr},
657         {"setlinebuf", nullptr, Setlinebuf, nullptr, nullptr, nullptr, napi_default, nullptr},
658         {"vsprintf", nullptr, Vsprintf, nullptr, nullptr, nullptr, napi_default, nullptr},
659         {"vsprintfChk", nullptr, VsprintfChk, nullptr, nullptr, nullptr, napi_default, nullptr},
660         {"feof", nullptr, Feof, nullptr, nullptr, nullptr, napi_default, nullptr},
661         {"putc", nullptr, Putc, nullptr, nullptr, nullptr, napi_default, nullptr},
662         {"putCUnlocked", nullptr, PutCUnlocked, nullptr, nullptr, nullptr, napi_default, nullptr},
663         {"setvbuf", nullptr, Setvbuf, nullptr, nullptr, nullptr, napi_default, nullptr},
664         {"snprintf", nullptr, Snprintf, nullptr, nullptr, nullptr, napi_default, nullptr},
665         {"sscanf", nullptr, Sscanf, nullptr, nullptr, nullptr, napi_default, nullptr},
666         {"tempnam", nullptr, Tempnam, nullptr, nullptr, nullptr, napi_default, nullptr},
667         {"vsscanf", nullptr, Vsscanf, nullptr, nullptr, nullptr, napi_default, nullptr},
668         {"vsnprintf", nullptr, Vsnprintf, nullptr, nullptr, nullptr, napi_default, nullptr},
669         {"vprintf", nullptr, Vprintf, nullptr, nullptr, nullptr, napi_default, nullptr},
670         {"vfprintf", nullptr, Vfprintf, nullptr, nullptr, nullptr, napi_default, nullptr},
671         {"vfscanf", nullptr, Vfscanf, nullptr, nullptr, nullptr, napi_default, nullptr},
672         {"remove", nullptr, Remove, nullptr, nullptr, nullptr, napi_default, nullptr},
673         {"rename", nullptr, Rename, nullptr, nullptr, nullptr, napi_default, nullptr},
674         {"putw", nullptr, Putw, nullptr, nullptr, nullptr, napi_default, nullptr},
675         {"ungetc", nullptr, Ungetc, nullptr, nullptr, nullptr, napi_default, nullptr},
676         {"vasprintf", nullptr, Vasprintf, nullptr, nullptr, nullptr, napi_default, nullptr},
677         {"freadChk", nullptr, Fread_chk, nullptr, nullptr, nullptr, napi_default, nullptr},
678         {"fgetsChk", nullptr, FgetsChk, nullptr, nullptr, nullptr, napi_default, nullptr},
679         {"pwriteChk", nullptr, PwriteChk, nullptr, nullptr, nullptr, napi_default, nullptr},
680         {"writeChk", nullptr, WriteChk, nullptr, nullptr, nullptr, napi_default, nullptr},
681         {"sprintfChk", nullptr, SprintfChk, nullptr, nullptr, nullptr, napi_default, nullptr},
682         {"snprintfChk", nullptr, SnprintfChk, nullptr, nullptr, nullptr, napi_default, nullptr},
683         {"vsnprintfChk", nullptr, VsnprintfChk, nullptr, nullptr, nullptr, napi_default, nullptr},
684         {"tmpfile", nullptr, Tmpfile, nullptr, nullptr, nullptr, napi_default, nullptr},
685         {"tmpfile64", nullptr, Tmpfile64, nullptr, nullptr, nullptr, napi_default, nullptr},
686         {"tmpnam", nullptr, Tmpnam, nullptr, nullptr, nullptr, napi_default, nullptr},
687     };
688     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
689     return exports;
690 }
691 
692 EXTERN_C_END
693 
694 static napi_module demoModule = {
695     .nm_version = 1,
696     .nm_flags = 0,
697     .nm_filename = nullptr,
698     .nm_register_func = Init,
699     .nm_modname = "stdio",
700     .nm_priv = ((void *)0),
701     .reserved = {0},
702 };
703 
RegisterEntryModule(void)704 extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); }
705