1 /******************************************************************************
2 * ventoy_http.c ---- ventoy http
3 * Copyright (c) 2021, longpanda <admin@ventoy.net>
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 3 of the
8 * License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, see <http://www.gnu.org/licenses/>.
27 #if defined(_MSC_VER) || defined(WIN32)
31 #include <sys/types.h>
32 #include <sys/ioctl.h>
34 #include <sys/types.h>
35 #include <sys/mount.h>
37 #include <linux/limits.h>
42 #include <ventoy_define.h>
43 #include <ventoy_json.h>
44 #include <ventoy_util.h>
45 #include <ventoy_disk.h>
46 #include <ventoy_http.h>
47 #include "fat_filelib.h"
49 static const char *g_json_title_postfix
[bios_max
+ 1] =
51 "", "_legacy", "_uefi", "_ia32", "_aa64", "_mips", ""
54 static const char *g_ventoy_kbd_layout
[] =
56 "QWERTY_USA", "AZERTY", "CZECH_QWERTY", "CZECH_QWERTZ", "DANISH",
57 "DVORAK_USA", "FRENCH", "GERMAN", "ITALIANO", "JAPAN_106", "LATIN_USA",
58 "PORTU_BRAZIL", "QWERTY_UK", "QWERTZ", "QWERTZ_HUN", "QWERTZ_SLOV_CROAT",
59 "SPANISH", "SWEDISH", "TURKISH_Q", "VIETNAMESE",
63 static char g_ventoy_help_lang
[MAX_LANGUAGE
][8];
65 static char g_pub_path
[2 * MAX_PATH
];
66 static data_control g_data_control
[bios_max
+ 1];
67 static data_theme g_data_theme
[bios_max
+ 1];
68 static data_alias g_data_menu_alias
[bios_max
+ 1];
69 static data_tip g_data_menu_tip
[bios_max
+ 1];
70 static data_class g_data_menu_class
[bios_max
+ 1];
71 static data_image_list g_data_image_list
[bios_max
+ 1];
72 static data_image_list
*g_data_image_blacklist
= g_data_image_list
;
73 static data_auto_memdisk g_data_auto_memdisk
[bios_max
+ 1];
74 static data_password g_data_password
[bios_max
+ 1];
75 static data_conf_replace g_data_conf_replace
[bios_max
+ 1];
76 static data_injection g_data_injection
[bios_max
+ 1];
77 static data_auto_install g_data_auto_install
[bios_max
+ 1];
78 static data_persistence g_data_persistence
[bios_max
+ 1];
79 static data_dud g_data_dud
[bios_max
+ 1];
81 static char *g_pub_json_buffer
= NULL
;
82 static char *g_pub_save_buffer
= NULL
;
83 #define JSON_BUFFER g_pub_json_buffer
84 #define JSON_SAVE_BUFFER g_pub_save_buffer
86 static pthread_mutex_t g_api_mutex
;
87 static struct mg_context
*g_ventoy_http_ctx
= NULL
;
89 static int ventoy_is_kbd_valid(const char *key
)
93 for (i
= 0; g_ventoy_kbd_layout
[i
]; i
++)
95 if (strcmp(g_ventoy_kbd_layout
[i
], key
) == 0)
104 static const char * ventoy_real_path(const char *org
)
108 if (g_sysinfo
.pathcase
)
110 scnprintf(g_pub_path
, MAX_PATH
, "%s", org
);
111 count
= ventoy_path_case(g_pub_path
+ 1, 1);
125 static int ventoy_json_result(struct mg_connection
*conn
, const char *err
)
128 "HTTP/1.1 200 OK \r\n"
129 "Content-Type: application/json\r\n"
130 "Content-Length: %d\r\n"
132 (int)strlen(err
), err
);
137 static int ventoy_json_buffer(struct mg_connection
*conn
, const char *json_buf
, int json_len
)
140 "HTTP/1.1 200 OK \r\n"
141 "Content-Type: application/json\r\n"
142 "Content-Length: %d\r\n"
149 static void ventoy_free_path_node_list(path_node
*list
)
151 path_node
*next
= NULL
;
152 path_node
*node
= list
;
162 static path_node
* ventoy_path_node_add_array(VTOY_JSON
*array
)
164 path_node
*head
= NULL
;
165 path_node
*node
= NULL
;
166 path_node
*cur
= NULL
;
167 VTOY_JSON
*item
= NULL
;
169 for (item
= array
->pstChild
; item
; item
= item
->pstNext
)
171 node
= zalloc(sizeof(path_node
));
174 scnprintf(node
->path
, sizeof(node
->path
), "%s", item
->unData
.pcStrVal
);
175 vtoy_list_add(head
, cur
, node
);
182 static int ventoy_check_fuzzy_path(char *path
, int prefix
)
194 pos
= strchr(path
, '*');
197 for (cur
= pos
; *cur
; cur
++)
222 rc
= ventoy_is_directory_exist("%s%s", g_cur_dir
, path
);
226 rc
= ventoy_is_directory_exist("%s", path
);
247 return ventoy_is_file_exist("%s%s", g_cur_dir
, path
);
251 return ventoy_is_file_exist("%s", path
);
256 static int ventoy_path_list_cmp(path_node
*list1
, path_node
*list2
)
258 if (NULL
== list1
&& NULL
== list2
)
262 else if (list1
&& list2
)
264 while (list1
&& list2
)
266 if (strcmp(list1
->path
, list2
->path
))
275 if (list1
== NULL
&& list2
== NULL
)
288 static int ventoy_api_device_info(struct mg_connection
*conn
, VTOY_JSON
*json
)
294 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
295 VTOY_JSON_FMT_OBJ_BEGIN();
297 VTOY_JSON_FMT_STRN("dev_name", g_sysinfo
.cur_model
);
298 VTOY_JSON_FMT_STRN("dev_capacity", g_sysinfo
.cur_capacity
);
299 VTOY_JSON_FMT_STRN("dev_fs", g_sysinfo
.cur_fsname
);
300 VTOY_JSON_FMT_STRN("ventoy_ver", g_sysinfo
.cur_ventoy_ver
);
301 VTOY_JSON_FMT_SINT("part_style", g_sysinfo
.cur_part_style
);
302 VTOY_JSON_FMT_SINT("secure_boot", g_sysinfo
.cur_secureboot
);
304 VTOY_JSON_FMT_OBJ_END();
305 VTOY_JSON_FMT_END(pos
);
307 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
311 static int ventoy_api_sysinfo(struct mg_connection
*conn
, VTOY_JSON
*json
)
317 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
318 VTOY_JSON_FMT_OBJ_BEGIN();
319 VTOY_JSON_FMT_STRN("language", ventoy_get_os_language());
320 VTOY_JSON_FMT_STRN("curdir", g_cur_dir
);
323 VTOY_JSON_FMT_SINT("syntax_error", g_sysinfo
.syntax_error
);
324 g_sysinfo
.syntax_error
= 0;
326 VTOY_JSON_FMT_SINT("invalid_config", g_sysinfo
.invalid_config
);
327 g_sysinfo
.invalid_config
= 0;
330 #if defined(_MSC_VER) || defined(WIN32)
331 VTOY_JSON_FMT_STRN("os", "windows");
333 VTOY_JSON_FMT_STRN("os", "linux");
336 VTOY_JSON_FMT_OBJ_END();
337 VTOY_JSON_FMT_END(pos
);
339 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
343 static int ventoy_api_handshake(struct mg_connection
*conn
, VTOY_JSON
*json
)
349 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
350 VTOY_JSON_FMT_OBJ_BEGIN();
351 VTOY_JSON_FMT_SINT("status", 0);
352 VTOY_JSON_FMT_OBJ_END();
353 VTOY_JSON_FMT_END(pos
);
355 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
359 static int ventoy_api_check_exist(struct mg_connection
*conn
, VTOY_JSON
*json
)
364 const char *path
= NULL
;
366 path
= vtoy_json_get_string_ex(json
, "path");
367 vtoy_json_get_int(json
, "dir", &dir
);
373 exist
= ventoy_is_directory_exist("%s", path
);
377 exist
= ventoy_is_file_exist("%s", path
);
381 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
382 VTOY_JSON_FMT_OBJ_BEGIN();
383 VTOY_JSON_FMT_SINT("exist", exist
);
384 VTOY_JSON_FMT_OBJ_END();
385 VTOY_JSON_FMT_END(pos
);
387 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
391 static int ventoy_api_check_exist2(struct mg_connection
*conn
, VTOY_JSON
*json
)
400 const char *path1
= NULL
;
401 const char *path2
= NULL
;
403 path1
= vtoy_json_get_string_ex(json
, "path1");
404 path2
= vtoy_json_get_string_ex(json
, "path2");
405 vtoy_json_get_int(json
, "dir1", &dir1
);
406 vtoy_json_get_int(json
, "dir2", &dir2
);
407 vtoy_json_get_int(json
, "fuzzy1", &fuzzy1
);
408 vtoy_json_get_int(json
, "fuzzy2", &fuzzy2
);
414 exist1
= ventoy_is_directory_exist("%s", path1
);
420 exist1
= ventoy_check_fuzzy_path((char *)path1
, 0);
424 exist1
= ventoy_is_file_exist("%s", path1
);
433 exist2
= ventoy_is_directory_exist("%s", path2
);
439 exist2
= ventoy_check_fuzzy_path((char *)path2
, 0);
443 exist2
= ventoy_is_file_exist("%s", path2
);
448 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
449 VTOY_JSON_FMT_OBJ_BEGIN();
450 VTOY_JSON_FMT_SINT("exist1", exist1
);
451 VTOY_JSON_FMT_SINT("exist2", exist2
);
452 VTOY_JSON_FMT_OBJ_END();
453 VTOY_JSON_FMT_END(pos
);
455 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
459 static int ventoy_api_check_fuzzy(struct mg_connection
*conn
, VTOY_JSON
*json
)
463 const char *path
= NULL
;
465 path
= vtoy_json_get_string_ex(json
, "path");
468 exist
= ventoy_check_fuzzy_path((char *)path
, 0);
471 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
472 VTOY_JSON_FMT_OBJ_BEGIN();
473 VTOY_JSON_FMT_SINT("exist", exist
);
474 VTOY_JSON_FMT_OBJ_END();
475 VTOY_JSON_FMT_END(pos
);
477 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
484 void ventoy_data_default_control(data_control
*data
)
486 memset(data
, 0, sizeof(data_control
));
488 data
->filter_dot_underscore
= 1;
489 data
->max_search_level
= -1;
490 data
->menu_timeout
= 0;
492 strlcpy(data
->default_kbd_layout
, "QWERTY_USA");
493 strlcpy(data
->help_text_language
, "en_US");
496 int ventoy_data_cmp_control(data_control
*data1
, data_control
*data2
)
498 if (data1
->default_menu_mode
!= data2
->default_menu_mode
||
499 data1
->treeview_style
!= data2
->treeview_style
||
500 data1
->filter_dot_underscore
!= data2
->filter_dot_underscore
||
501 data1
->sort_casesensitive
!= data2
->sort_casesensitive
||
502 data1
->max_search_level
!= data2
->max_search_level
||
503 data1
->vhd_no_warning
!= data2
->vhd_no_warning
||
504 data1
->filter_iso
!= data2
->filter_iso
||
505 data1
->filter_wim
!= data2
->filter_wim
||
506 data1
->filter_efi
!= data2
->filter_efi
||
507 data1
->filter_img
!= data2
->filter_img
||
508 data1
->filter_vhd
!= data2
->filter_vhd
||
509 data1
->filter_vtoy
!= data2
->filter_vtoy
||
510 data1
->win11_bypass_check
!= data2
->win11_bypass_check
||
511 data1
->linux_remount
!= data2
->linux_remount
||
512 data1
->menu_timeout
!= data2
->menu_timeout
)
517 if (strcmp(data1
->default_search_root
, data2
->default_search_root
) ||
518 strcmp(data1
->default_image
, data2
->default_image
) ||
519 strcmp(data1
->default_kbd_layout
, data2
->default_kbd_layout
) ||
520 strcmp(data1
->help_text_language
, data2
->help_text_language
))
528 int ventoy_data_save_control(data_control
*data
, const char *title
, char *buf
, int buflen
)
531 data_control
*def
= g_data_control
+ bios_max
;
533 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
535 VTOY_JSON_FMT_KEY_L(L1
, title
);
536 VTOY_JSON_FMT_ARY_BEGIN_N();
538 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_DEFAULT_MENU_MODE", default_menu_mode
);
539 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_TREE_VIEW_MENU_STYLE", treeview_style
);
540 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILT_DOT_UNDERSCORE_FILE", filter_dot_underscore
);
541 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_SORT_CASE_SENSITIVE", sort_casesensitive
);
543 if (data
->max_search_level
>= 0)
545 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_MAX_SEARCH_LEVEL", max_search_level
);
548 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_VHD_NO_WARNING", vhd_no_warning
);
549 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_ISO", filter_iso
);
550 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_WIM", filter_wim
);
551 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_EFI", filter_efi
);
552 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_IMG", filter_img
);
553 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_VHD", filter_vhd
);
554 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_VTOY", filter_vtoy
);
555 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_WIN11_BYPASS_CHECK", win11_bypass_check
);
556 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_LINUX_REMOUNT", linux_remount
);
557 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_MENU_TIMEOUT", menu_timeout
);
559 VTOY_JSON_FMT_CTRL_STRN(L2
, "VTOY_DEFAULT_KBD_LAYOUT", default_kbd_layout
);
560 VTOY_JSON_FMT_CTRL_STRN(L2
, "VTOY_HELP_TXT_LANGUAGE", help_text_language
);
562 if (strcmp(def
->default_search_root
, data
->default_search_root
))
564 VTOY_JSON_FMT_CTRL_STRN_STR(L2
, "VTOY_DEFAULT_SEARCH_ROOT", ventoy_real_path(data
->default_search_root
));
567 if (strcmp(def
->default_image
, data
->default_image
))
569 VTOY_JSON_FMT_CTRL_STRN_STR(L2
, "VTOY_DEFAULT_IMAGE", ventoy_real_path(data
->default_image
));
572 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
573 VTOY_JSON_FMT_END(pos
);
578 int ventoy_data_json_control(data_control
*ctrl
, char *buf
, int buflen
)
584 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
585 VTOY_JSON_FMT_OBJ_BEGIN();
587 VTOY_JSON_FMT_SINT("default_menu_mode", ctrl
->default_menu_mode
);
588 VTOY_JSON_FMT_SINT("treeview_style", ctrl
->treeview_style
);
589 VTOY_JSON_FMT_SINT("filter_dot_underscore", ctrl
->filter_dot_underscore
);
590 VTOY_JSON_FMT_SINT("sort_casesensitive", ctrl
->sort_casesensitive
);
591 VTOY_JSON_FMT_SINT("max_search_level", ctrl
->max_search_level
);
592 VTOY_JSON_FMT_SINT("vhd_no_warning", ctrl
->vhd_no_warning
);
594 VTOY_JSON_FMT_SINT("filter_iso", ctrl
->filter_iso
);
595 VTOY_JSON_FMT_SINT("filter_wim", ctrl
->filter_wim
);
596 VTOY_JSON_FMT_SINT("filter_efi", ctrl
->filter_efi
);
597 VTOY_JSON_FMT_SINT("filter_img", ctrl
->filter_img
);
598 VTOY_JSON_FMT_SINT("filter_vhd", ctrl
->filter_vhd
);
599 VTOY_JSON_FMT_SINT("filter_vtoy", ctrl
->filter_vtoy
);
600 VTOY_JSON_FMT_SINT("win11_bypass_check", ctrl
->win11_bypass_check
);
601 VTOY_JSON_FMT_SINT("linux_remount", ctrl
->linux_remount
);
602 VTOY_JSON_FMT_SINT("menu_timeout", ctrl
->menu_timeout
);
603 VTOY_JSON_FMT_STRN("default_kbd_layout", ctrl
->default_kbd_layout
);
604 VTOY_JSON_FMT_STRN("help_text_language", ctrl
->help_text_language
);
607 if (ctrl
->default_search_root
[0] && ventoy_is_directory_exist("%s%s", g_cur_dir
, ctrl
->default_search_root
))
611 VTOY_JSON_FMT_STRN("default_search_root", ctrl
->default_search_root
);
612 VTOY_JSON_FMT_SINT("default_search_root_valid", valid
);
616 if (ctrl
->default_image
[0] && ventoy_is_file_exist("%s%s", g_cur_dir
, ctrl
->default_image
))
620 VTOY_JSON_FMT_STRN("default_image", ctrl
->default_image
);
621 VTOY_JSON_FMT_SINT("default_image_valid", valid
);
623 VTOY_JSON_FMT_KEY("help_list");
624 VTOY_JSON_FMT_ARY_BEGIN();
626 for (i
= 0; g_ventoy_help_lang
[i
][0]; i
++)
628 VTOY_JSON_FMT_ITEM(g_ventoy_help_lang
[i
]);
630 VTOY_JSON_FMT_ARY_ENDEX();
633 VTOY_JSON_FMT_OBJ_END();
634 VTOY_JSON_FMT_END(pos
);
639 static int ventoy_api_get_control(struct mg_connection
*conn
, VTOY_JSON
*json
)
641 api_get_func(conn
, json
, control
);
645 static int ventoy_api_save_control(struct mg_connection
*conn
, VTOY_JSON
*json
)
649 data_control
*ctrl
= NULL
;
651 vtoy_json_get_int(json
, "index", &index
);
652 ctrl
= g_data_control
+ index
;
654 VTOY_JSON_INT("default_menu_mode", ctrl
->default_menu_mode
);
655 VTOY_JSON_INT("treeview_style", ctrl
->treeview_style
);
656 VTOY_JSON_INT("filter_dot_underscore", ctrl
->filter_dot_underscore
);
657 VTOY_JSON_INT("sort_casesensitive", ctrl
->sort_casesensitive
);
658 VTOY_JSON_INT("max_search_level", ctrl
->max_search_level
);
659 VTOY_JSON_INT("vhd_no_warning", ctrl
->vhd_no_warning
);
660 VTOY_JSON_INT("filter_iso", ctrl
->filter_iso
);
661 VTOY_JSON_INT("filter_wim", ctrl
->filter_wim
);
662 VTOY_JSON_INT("filter_efi", ctrl
->filter_efi
);
663 VTOY_JSON_INT("filter_img", ctrl
->filter_img
);
664 VTOY_JSON_INT("filter_vhd", ctrl
->filter_vhd
);
665 VTOY_JSON_INT("filter_vtoy", ctrl
->filter_vtoy
);
666 VTOY_JSON_INT("win11_bypass_check", ctrl
->win11_bypass_check
);
667 VTOY_JSON_INT("linux_remount", ctrl
->linux_remount
);
668 VTOY_JSON_INT("menu_timeout", ctrl
->menu_timeout
);
670 VTOY_JSON_STR("default_image", ctrl
->default_image
);
671 VTOY_JSON_STR("default_search_root", ctrl
->default_search_root
);
672 VTOY_JSON_STR("help_text_language", ctrl
->help_text_language
);
673 VTOY_JSON_STR("default_kbd_layout", ctrl
->default_kbd_layout
);
675 ret
= ventoy_data_save_all();
677 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
685 void ventoy_data_default_theme(data_theme
*data
)
687 memset(data
, 0, sizeof(data_theme
));
688 strlcpy(data
->gfxmode
, "1024x768");
689 scnprintf(data
->ventoy_left
, sizeof(data
->ventoy_left
), "5%%");
690 scnprintf(data
->ventoy_top
, sizeof(data
->ventoy_top
), "95%%");
691 scnprintf(data
->ventoy_color
, sizeof(data
->ventoy_color
), "%s", "#0000ff");
694 int ventoy_data_cmp_theme(data_theme
*data1
, data_theme
*data2
)
696 if (data1
->display_mode
!= data2
->display_mode
||
697 strcmp(data1
->ventoy_left
, data2
->ventoy_left
) ||
698 strcmp(data1
->ventoy_top
, data2
->ventoy_top
) ||
699 strcmp(data1
->gfxmode
, data2
->gfxmode
) ||
700 strcmp(data1
->ventoy_color
, data2
->ventoy_color
)
706 if (ventoy_path_list_cmp(data1
->filelist
, data2
->filelist
))
711 if (ventoy_path_list_cmp(data1
->fontslist
, data2
->fontslist
))
720 int ventoy_data_save_theme(data_theme
*data
, const char *title
, char *buf
, int buflen
)
723 path_node
*node
= NULL
;
724 data_theme
*def
= g_data_theme
+ bios_max
;
726 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
728 VTOY_JSON_FMT_KEY_L(L1
, title
);
729 VTOY_JSON_FMT_OBJ_BEGIN_N();
733 if (data
->filelist
->next
)
735 VTOY_JSON_FMT_KEY_L(L2
, "file");
736 VTOY_JSON_FMT_ARY_BEGIN_N();
738 for (node
= data
->filelist
; node
; node
= node
->next
)
740 VTOY_JSON_FMT_ITEM_PATH_LN(L3
, node
->path
);
743 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
745 if (def
->default_file
!= data
->default_file
)
747 VTOY_JSON_FMT_SINT_LN(L2
, "default_file", data
->default_file
);
752 VTOY_JSON_FMT_STRN_PATH_LN(L2
, "file", data
->filelist
->path
);
756 if (data
->display_mode
!= def
->display_mode
)
758 if (display_mode_cli
== data
->display_mode
)
760 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "CLI");
762 else if (display_mode_serial
== data
->display_mode
)
764 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "serial");
766 else if (display_mode_ser_console
== data
->display_mode
)
768 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "serial_console");
772 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "GUI");
776 VTOY_JSON_FMT_DIFF_STRN(L2
, "gfxmode", gfxmode
);
778 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_left", ventoy_left
);
779 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_top", ventoy_top
);
780 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_color", ventoy_color
);
784 VTOY_JSON_FMT_KEY_L(L2
, "fonts");
785 VTOY_JSON_FMT_ARY_BEGIN_N();
787 for (node
= data
->fontslist
; node
; node
= node
->next
)
789 VTOY_JSON_FMT_ITEM_PATH_LN(L3
, node
->path
);
792 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
795 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
796 VTOY_JSON_FMT_END(pos
);
802 int ventoy_data_json_theme(data_theme
*data
, char *buf
, int buflen
)
805 path_node
*node
= NULL
;
807 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
808 VTOY_JSON_FMT_OBJ_BEGIN();
810 VTOY_JSON_FMT_SINT("default_file", data
->default_file
);
811 VTOY_JSON_FMT_SINT("display_mode", data
->display_mode
);
812 VTOY_JSON_FMT_STRN("gfxmode", data
->gfxmode
);
814 VTOY_JSON_FMT_STRN("ventoy_color", data
->ventoy_color
);
815 VTOY_JSON_FMT_STRN("ventoy_left", data
->ventoy_left
);
816 VTOY_JSON_FMT_STRN("ventoy_top", data
->ventoy_top
);
818 VTOY_JSON_FMT_KEY("filelist");
819 VTOY_JSON_FMT_ARY_BEGIN();
820 for (node
= data
->filelist
; node
; node
= node
->next
)
822 VTOY_JSON_FMT_OBJ_BEGIN();
823 VTOY_JSON_FMT_STRN("path", node
->path
);
824 VTOY_JSON_FMT_SINT("valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->path
));
825 VTOY_JSON_FMT_OBJ_ENDEX();
827 VTOY_JSON_FMT_ARY_ENDEX();
829 VTOY_JSON_FMT_KEY("fontslist");
830 VTOY_JSON_FMT_ARY_BEGIN();
831 for (node
= data
->fontslist
; node
; node
= node
->next
)
833 VTOY_JSON_FMT_OBJ_BEGIN();
834 VTOY_JSON_FMT_STRN("path", node
->path
);
835 VTOY_JSON_FMT_SINT("valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->path
));
836 VTOY_JSON_FMT_OBJ_ENDEX();
838 VTOY_JSON_FMT_ARY_ENDEX();
840 VTOY_JSON_FMT_OBJ_END();
841 VTOY_JSON_FMT_END(pos
);
846 static int ventoy_api_get_theme(struct mg_connection
*conn
, VTOY_JSON
*json
)
848 api_get_func(conn
, json
, theme
);
852 static int ventoy_api_save_theme(struct mg_connection
*conn
, VTOY_JSON
*json
)
856 data_theme
*data
= NULL
;
858 vtoy_json_get_int(json
, "index", &index
);
859 data
= g_data_theme
+ index
;
861 VTOY_JSON_INT("default_file", data
->default_file
);
862 VTOY_JSON_INT("display_mode", data
->display_mode
);
863 VTOY_JSON_STR("gfxmode", data
->gfxmode
);
864 VTOY_JSON_STR("ventoy_left", data
->ventoy_left
);
865 VTOY_JSON_STR("ventoy_top", data
->ventoy_top
);
866 VTOY_JSON_STR("ventoy_color", data
->ventoy_color
);
868 ret
= ventoy_data_save_all();
870 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
874 static int ventoy_api_theme_add_file(struct mg_connection
*conn
, VTOY_JSON
*json
)
878 const char *path
= NULL
;
879 path_node
*node
= NULL
;
880 path_node
*cur
= NULL
;
881 data_theme
*data
= NULL
;
883 vtoy_json_get_int(json
, "index", &index
);
884 data
= g_data_theme
+ index
;
886 path
= VTOY_JSON_STR_EX("path");
889 node
= zalloc(sizeof(path_node
));
892 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
894 vtoy_list_add(data
->filelist
, cur
, node
);
898 ret
= ventoy_data_save_all();
900 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
904 static int ventoy_api_theme_del_file(struct mg_connection
*conn
, VTOY_JSON
*json
)
908 const char *path
= NULL
;
909 path_node
*node
= NULL
;
910 path_node
*last
= NULL
;
911 data_theme
*data
= NULL
;
913 vtoy_json_get_int(json
, "index", &index
);
914 data
= g_data_theme
+ index
;
916 path
= VTOY_JSON_STR_EX("path");
919 vtoy_list_del(last
, node
, data
->filelist
, path
);
922 ret
= ventoy_data_save_all();
924 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
929 static int ventoy_api_theme_add_font(struct mg_connection
*conn
, VTOY_JSON
*json
)
933 const char *path
= NULL
;
934 path_node
*node
= NULL
;
935 path_node
*cur
= NULL
;
936 data_theme
*data
= NULL
;
938 vtoy_json_get_int(json
, "index", &index
);
939 data
= g_data_theme
+ index
;
941 path
= VTOY_JSON_STR_EX("path");
944 node
= zalloc(sizeof(path_node
));
947 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
948 vtoy_list_add(data
->fontslist
, cur
, node
);
952 ret
= ventoy_data_save_all();
954 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
959 static int ventoy_api_theme_del_font(struct mg_connection
*conn
, VTOY_JSON
*json
)
963 const char *path
= NULL
;
964 path_node
*node
= NULL
;
965 path_node
*last
= NULL
;
966 data_theme
*data
= NULL
;
968 vtoy_json_get_int(json
, "index", &index
);
969 data
= g_data_theme
+ index
;
971 path
= VTOY_JSON_STR_EX("path");
974 vtoy_list_del(last
, node
, data
->fontslist
, path
);
977 ret
= ventoy_data_save_all();
979 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
986 void ventoy_data_default_menu_alias(data_alias
*data
)
988 memset(data
, 0, sizeof(data_alias
));
991 int ventoy_data_cmp_menu_alias(data_alias
*data1
, data_alias
*data2
)
993 data_alias_node
*list1
= NULL
;
994 data_alias_node
*list2
= NULL
;
996 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1000 else if (data1
->list
&& data2
->list
)
1002 list1
= data1
->list
;
1003 list2
= data2
->list
;
1005 while (list1
&& list2
)
1007 if ((list1
->type
!= list2
->type
) ||
1008 strcmp(list1
->path
, list2
->path
) ||
1009 strcmp(list1
->alias
, list2
->alias
))
1014 list1
= list1
->next
;
1015 list2
= list2
->next
;
1018 if (list1
== NULL
&& list2
== NULL
)
1033 int ventoy_data_save_menu_alias(data_alias
*data
, const char *title
, char *buf
, int buflen
)
1036 data_alias_node
*node
= NULL
;
1038 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1040 VTOY_JSON_FMT_KEY_L(L1
, title
);
1041 VTOY_JSON_FMT_ARY_BEGIN_N();
1043 for (node
= data
->list
; node
; node
= node
->next
)
1045 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
1047 if (node
->type
== path_type_file
)
1049 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
1053 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "dir", node
->path
);
1056 VTOY_JSON_FMT_STRN_EX_LN(L3
, "alias", node
->alias
);
1058 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
1061 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1062 VTOY_JSON_FMT_END(pos
);
1068 int ventoy_data_json_menu_alias(data_alias
*data
, char *buf
, int buflen
)
1072 data_alias_node
*node
= NULL
;
1074 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1075 VTOY_JSON_FMT_ARY_BEGIN();
1077 for (node
= data
->list
; node
; node
= node
->next
)
1079 VTOY_JSON_FMT_OBJ_BEGIN();
1081 VTOY_JSON_FMT_UINT("type", node
->type
);
1082 VTOY_JSON_FMT_STRN("path", node
->path
);
1083 if (node
->type
== path_type_file
)
1085 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1089 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1092 VTOY_JSON_FMT_SINT("valid", valid
);
1093 VTOY_JSON_FMT_STRN("alias", node
->alias
);
1095 VTOY_JSON_FMT_OBJ_ENDEX();
1098 VTOY_JSON_FMT_ARY_END();
1099 VTOY_JSON_FMT_END(pos
);
1104 static int ventoy_api_get_alias(struct mg_connection
*conn
, VTOY_JSON
*json
)
1106 api_get_func(conn
, json
, menu_alias
);
1110 static int ventoy_api_save_alias(struct mg_connection
*conn
, VTOY_JSON
*json
)
1113 ret
= ventoy_data_save_all();
1115 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1119 static int ventoy_api_alias_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1123 int type
= path_type_file
;
1124 const char *path
= NULL
;
1125 const char *alias
= NULL
;
1126 data_alias_node
*node
= NULL
;
1127 data_alias_node
*cur
= NULL
;
1128 data_alias
*data
= NULL
;
1130 vtoy_json_get_int(json
, "index", &index
);
1131 data
= g_data_menu_alias
+ index
;
1133 vtoy_json_get_int(json
, "type", &type
);
1135 path
= VTOY_JSON_STR_EX("path");
1136 alias
= VTOY_JSON_STR_EX("alias");
1139 node
= zalloc(sizeof(data_alias_node
));
1143 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1144 scnprintf(node
->alias
, sizeof(node
->alias
), "%s", alias
);
1146 vtoy_list_add(data
->list
, cur
, node
);
1150 ret
= ventoy_data_save_all();
1152 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1156 static int ventoy_api_alias_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1160 const char *path
= NULL
;
1161 data_alias_node
*last
= NULL
;
1162 data_alias_node
*node
= NULL
;
1163 data_alias
*data
= NULL
;
1165 vtoy_json_get_int(json
, "index", &index
);
1166 data
= g_data_menu_alias
+ index
;
1168 path
= VTOY_JSON_STR_EX("path");
1171 vtoy_list_del(last
, node
, data
->list
, path
);
1174 ret
= ventoy_data_save_all();
1176 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1183 void ventoy_data_default_menu_tip(data_tip
*data
)
1185 memset(data
, 0, sizeof(data_tip
));
1187 scnprintf(data
->left
, sizeof(data
->left
), "10%%");
1188 scnprintf(data
->top
, sizeof(data
->top
), "81%%");
1189 scnprintf(data
->color
, sizeof(data
->color
), "%s", "blue");
1192 int ventoy_data_cmp_menu_tip(data_tip
*data1
, data_tip
*data2
)
1194 data_tip_node
*list1
= NULL
;
1195 data_tip_node
*list2
= NULL
;
1197 if (strcmp(data1
->left
, data2
->left
) || strcmp(data1
->top
, data2
->top
) || strcmp(data1
->color
, data2
->color
))
1202 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1206 else if (data1
->list
&& data2
->list
)
1208 list1
= data1
->list
;
1209 list2
= data2
->list
;
1211 while (list1
&& list2
)
1213 if ((list1
->type
!= list2
->type
) ||
1214 strcmp(list1
->path
, list2
->path
) ||
1215 strcmp(list1
->tip
, list2
->tip
))
1220 list1
= list1
->next
;
1221 list2
= list2
->next
;
1224 if (list1
== NULL
&& list2
== NULL
)
1239 int ventoy_data_save_menu_tip(data_tip
*data
, const char *title
, char *buf
, int buflen
)
1242 data_tip_node
*node
= NULL
;
1243 data_tip
*def
= g_data_menu_tip
+ bios_max
;
1245 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1246 VTOY_JSON_FMT_KEY_L(L1
, title
);
1247 VTOY_JSON_FMT_OBJ_BEGIN_N();
1249 VTOY_JSON_FMT_DIFF_STRN(L2
, "left", left
);
1250 VTOY_JSON_FMT_DIFF_STRN(L2
, "top", top
);
1251 VTOY_JSON_FMT_DIFF_STRN(L2
, "color", color
);
1255 VTOY_JSON_FMT_KEY_L(L2
, "tips");
1256 VTOY_JSON_FMT_ARY_BEGIN_N();
1258 for (node
= data
->list
; node
; node
= node
->next
)
1260 VTOY_JSON_FMT_OBJ_BEGIN_LN(L3
);
1262 if (node
->type
== path_type_file
)
1264 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "image", node
->path
);
1268 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "dir", node
->path
);
1270 VTOY_JSON_FMT_STRN_EX_LN(L4
, "tip", node
->tip
);
1272 VTOY_JSON_FMT_OBJ_ENDEX_LN(L3
);
1275 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
1278 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
1280 VTOY_JSON_FMT_END(pos
);
1286 int ventoy_data_json_menu_tip(data_tip
*data
, char *buf
, int buflen
)
1290 data_tip_node
*node
= NULL
;
1292 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1294 VTOY_JSON_FMT_OBJ_BEGIN();
1296 VTOY_JSON_FMT_STRN("left", data
->left
);
1297 VTOY_JSON_FMT_STRN("top", data
->top
);
1298 VTOY_JSON_FMT_STRN("color", data
->color
);
1300 VTOY_JSON_FMT_KEY("tips");
1301 VTOY_JSON_FMT_ARY_BEGIN();
1303 for (node
= data
->list
; node
; node
= node
->next
)
1305 VTOY_JSON_FMT_OBJ_BEGIN();
1307 VTOY_JSON_FMT_UINT("type", node
->type
);
1308 VTOY_JSON_FMT_STRN("path", node
->path
);
1309 if (node
->type
== path_type_file
)
1311 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1315 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1318 VTOY_JSON_FMT_SINT("valid", valid
);
1319 VTOY_JSON_FMT_STRN("tip", node
->tip
);
1321 VTOY_JSON_FMT_OBJ_ENDEX();
1324 VTOY_JSON_FMT_ARY_ENDEX();
1326 VTOY_JSON_FMT_OBJ_END();
1327 VTOY_JSON_FMT_END(pos
);
1332 static int ventoy_api_get_tip(struct mg_connection
*conn
, VTOY_JSON
*json
)
1334 api_get_func(conn
, json
, menu_tip
);
1338 static int ventoy_api_save_tip(struct mg_connection
*conn
, VTOY_JSON
*json
)
1342 data_tip
*data
= NULL
;
1344 vtoy_json_get_int(json
, "index", &index
);
1345 data
= g_data_menu_tip
+ index
;
1347 VTOY_JSON_STR("left", data
->left
);
1348 VTOY_JSON_STR("top", data
->top
);
1349 VTOY_JSON_STR("color", data
->color
);
1351 ret
= ventoy_data_save_all();
1353 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1357 static int ventoy_api_tip_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1361 int type
= path_type_file
;
1362 const char *path
= NULL
;
1363 const char *tip
= NULL
;
1364 data_tip_node
*node
= NULL
;
1365 data_tip_node
*cur
= NULL
;
1366 data_tip
*data
= NULL
;
1368 vtoy_json_get_int(json
, "index", &index
);
1369 data
= g_data_menu_tip
+ index
;
1371 vtoy_json_get_int(json
, "type", &type
);
1373 path
= VTOY_JSON_STR_EX("path");
1374 tip
= VTOY_JSON_STR_EX("tip");
1377 node
= zalloc(sizeof(data_tip_node
));
1381 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1382 scnprintf(node
->tip
, sizeof(node
->tip
), "%s", tip
);
1384 vtoy_list_add(data
->list
, cur
, node
);
1388 ret
= ventoy_data_save_all();
1390 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1394 static int ventoy_api_tip_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1398 const char *path
= NULL
;
1399 data_tip_node
*last
= NULL
;
1400 data_tip_node
*node
= NULL
;
1401 data_tip
*data
= NULL
;
1403 vtoy_json_get_int(json
, "index", &index
);
1404 data
= g_data_menu_tip
+ index
;
1406 path
= VTOY_JSON_STR_EX("path");
1409 vtoy_list_del(last
, node
, data
->list
, path
);
1412 ret
= ventoy_data_save_all();
1414 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1421 void ventoy_data_default_menu_class(data_class
*data
)
1423 memset(data
, 0, sizeof(data_class
));
1426 int ventoy_data_cmp_menu_class(data_class
*data1
, data_class
*data2
)
1428 data_class_node
*list1
= NULL
;
1429 data_class_node
*list2
= NULL
;
1431 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1435 else if (data1
->list
&& data2
->list
)
1437 list1
= data1
->list
;
1438 list2
= data2
->list
;
1440 while (list1
&& list2
)
1442 if ((list1
->type
!= list2
->type
) ||
1443 strcmp(list1
->path
, list2
->path
) ||
1444 strcmp(list1
->class, list2
->class))
1449 list1
= list1
->next
;
1450 list2
= list2
->next
;
1453 if (list1
== NULL
&& list2
== NULL
)
1468 int ventoy_data_save_menu_class(data_class
*data
, const char *title
, char *buf
, int buflen
)
1471 data_class_node
*node
= NULL
;
1473 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1475 VTOY_JSON_FMT_KEY_L(L1
, title
);
1476 VTOY_JSON_FMT_ARY_BEGIN_N();
1478 for (node
= data
->list
; node
; node
= node
->next
)
1480 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
1482 if (node
->type
== class_type_key
)
1484 VTOY_JSON_FMT_STRN_LN(L3
, "key", node
->path
);
1486 else if (node
->type
== class_type_dir
)
1488 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "dir", node
->path
);
1492 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
1494 VTOY_JSON_FMT_STRN_LN(L3
, "class", node
->class);
1496 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
1499 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1500 VTOY_JSON_FMT_END(pos
);
1506 int ventoy_data_json_menu_class(data_class
*data
, char *buf
, int buflen
)
1510 data_class_node
*node
= NULL
;
1512 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1513 VTOY_JSON_FMT_ARY_BEGIN();
1515 for (node
= data
->list
; node
; node
= node
->next
)
1517 VTOY_JSON_FMT_OBJ_BEGIN();
1519 VTOY_JSON_FMT_UINT("type", node
->type
);
1520 VTOY_JSON_FMT_STRN("path", node
->path
);
1522 if (node
->type
== class_type_key
)
1528 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1530 VTOY_JSON_FMT_SINT("valid", valid
);
1532 VTOY_JSON_FMT_STRN("class", node
->class);
1534 VTOY_JSON_FMT_OBJ_ENDEX();
1537 VTOY_JSON_FMT_ARY_END();
1538 VTOY_JSON_FMT_END(pos
);
1544 static int ventoy_api_get_class(struct mg_connection
*conn
, VTOY_JSON
*json
)
1546 api_get_func(conn
, json
, menu_class
);
1550 static int ventoy_api_save_class(struct mg_connection
*conn
, VTOY_JSON
*json
)
1553 ret
= ventoy_data_save_all();
1555 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1559 static int ventoy_api_class_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1563 int type
= class_type_key
;
1564 const char *path
= NULL
;
1565 const char *class = NULL
;
1566 data_class_node
*node
= NULL
;
1567 data_class_node
*cur
= NULL
;
1568 data_class
*data
= NULL
;
1570 vtoy_json_get_int(json
, "index", &index
);
1571 data
= g_data_menu_class
+ index
;
1573 vtoy_json_get_int(json
, "type", &type
);
1575 path
= VTOY_JSON_STR_EX("path");
1576 class = VTOY_JSON_STR_EX("class");
1579 node
= zalloc(sizeof(data_class_node
));
1584 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1585 scnprintf(node
->class, sizeof(node
->class), "%s", class);
1587 vtoy_list_add(data
->list
, cur
, node
);
1591 ret
= ventoy_data_save_all();
1593 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1597 static int ventoy_api_class_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1601 const char *path
= NULL
;
1602 data_class_node
*last
= NULL
;
1603 data_class_node
*node
= NULL
;
1604 data_class
*data
= NULL
;
1606 vtoy_json_get_int(json
, "index", &index
);
1607 data
= g_data_menu_class
+ index
;
1609 path
= VTOY_JSON_STR_EX("path");
1612 vtoy_list_del(last
, node
, data
->list
, path
);
1615 ret
= ventoy_data_save_all();
1617 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1624 void ventoy_data_default_auto_memdisk(data_auto_memdisk
*data
)
1626 memset(data
, 0, sizeof(data_auto_memdisk
));
1629 int ventoy_data_cmp_auto_memdisk(data_auto_memdisk
*data1
, data_auto_memdisk
*data2
)
1631 return ventoy_path_list_cmp(data1
->list
, data2
->list
);
1634 int ventoy_data_save_auto_memdisk(data_auto_memdisk
*data
, const char *title
, char *buf
, int buflen
)
1637 path_node
*node
= NULL
;
1639 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1641 VTOY_JSON_FMT_KEY_L(L1
, title
);
1642 VTOY_JSON_FMT_ARY_BEGIN_N();
1644 for (node
= data
->list
; node
; node
= node
->next
)
1646 VTOY_JSON_FMT_ITEM_PATH_LN(L2
, node
->path
);
1649 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1650 VTOY_JSON_FMT_END(pos
);
1655 int ventoy_data_json_auto_memdisk(data_auto_memdisk
*data
, char *buf
, int buflen
)
1659 path_node
*node
= NULL
;
1661 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1662 VTOY_JSON_FMT_ARY_BEGIN();
1664 for (node
= data
->list
; node
; node
= node
->next
)
1666 VTOY_JSON_FMT_OBJ_BEGIN();
1668 VTOY_JSON_FMT_STRN("path", node
->path
);
1669 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1670 VTOY_JSON_FMT_SINT("valid", valid
);
1672 VTOY_JSON_FMT_OBJ_ENDEX();
1675 VTOY_JSON_FMT_ARY_END();
1676 VTOY_JSON_FMT_END(pos
);
1681 static int ventoy_api_get_auto_memdisk(struct mg_connection
*conn
, VTOY_JSON
*json
)
1683 api_get_func(conn
, json
, auto_memdisk
);
1687 static int ventoy_api_save_auto_memdisk(struct mg_connection
*conn
, VTOY_JSON
*json
)
1691 ret
= ventoy_data_save_all();
1693 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1697 static int ventoy_api_auto_memdisk_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1701 const char *path
= NULL
;
1702 path_node
*node
= NULL
;
1703 path_node
*cur
= NULL
;
1704 data_auto_memdisk
*data
= NULL
;
1706 vtoy_json_get_int(json
, "index", &index
);
1707 data
= g_data_auto_memdisk
+ index
;
1709 path
= VTOY_JSON_STR_EX("path");
1712 node
= zalloc(sizeof(path_node
));
1715 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1716 vtoy_list_add(data
->list
, cur
, node
);
1720 ret
= ventoy_data_save_all();
1722 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1726 static int ventoy_api_auto_memdisk_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1730 const char *path
= NULL
;
1731 path_node
*last
= NULL
;
1732 path_node
*node
= NULL
;
1733 data_auto_memdisk
*data
= NULL
;
1735 vtoy_json_get_int(json
, "index", &index
);
1736 data
= g_data_auto_memdisk
+ index
;
1738 path
= VTOY_JSON_STR_EX("path");
1741 vtoy_list_del(last
, node
, data
->list
, path
);
1744 ret
= ventoy_data_save_all();
1746 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1753 void ventoy_data_default_image_list(data_image_list
*data
)
1755 memset(data
, 0, sizeof(data_image_list
));
1758 int ventoy_data_cmp_image_list(data_image_list
*data1
, data_image_list
*data2
)
1760 if (data1
->type
!= data2
->type
)
1762 if (data1
->list
|| data2
->list
)
1772 return ventoy_path_list_cmp(data1
->list
, data2
->list
);
1775 int ventoy_data_save_image_list(data_image_list
*data
, const char *title
, char *buf
, int buflen
)
1779 path_node
*node
= NULL
;
1789 prelen
= (int)strlen("image_list");
1791 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1793 if (data
->type
== 0)
1795 scnprintf(newtitle
, sizeof(newtitle
), "image_list%s", title
+ prelen
);
1799 scnprintf(newtitle
, sizeof(newtitle
), "image_blacklist%s", title
+ prelen
);
1801 VTOY_JSON_FMT_KEY_L(L1
, newtitle
);
1803 VTOY_JSON_FMT_ARY_BEGIN_N();
1805 for (node
= data
->list
; node
; node
= node
->next
)
1807 VTOY_JSON_FMT_ITEM_PATH_LN(L2
, node
->path
);
1810 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1811 VTOY_JSON_FMT_END(pos
);
1816 int ventoy_data_json_image_list(data_image_list
*data
, char *buf
, int buflen
)
1820 path_node
*node
= NULL
;
1822 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1824 VTOY_JSON_FMT_OBJ_BEGIN();
1825 VTOY_JSON_FMT_SINT("type", data
->type
);
1827 VTOY_JSON_FMT_KEY("list");
1828 VTOY_JSON_FMT_ARY_BEGIN();
1830 for (node
= data
->list
; node
; node
= node
->next
)
1832 VTOY_JSON_FMT_OBJ_BEGIN();
1834 VTOY_JSON_FMT_STRN("path", node
->path
);
1835 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1836 VTOY_JSON_FMT_SINT("valid", valid
);
1838 VTOY_JSON_FMT_OBJ_ENDEX();
1841 VTOY_JSON_FMT_ARY_ENDEX();
1842 VTOY_JSON_FMT_OBJ_END();
1844 VTOY_JSON_FMT_END(pos
);
1849 static int ventoy_api_get_image_list(struct mg_connection
*conn
, VTOY_JSON
*json
)
1851 api_get_func(conn
, json
, image_list
);
1855 static int ventoy_api_save_image_list(struct mg_connection
*conn
, VTOY_JSON
*json
)
1859 data_image_list
*data
= NULL
;
1861 vtoy_json_get_int(json
, "index", &index
);
1862 data
= g_data_image_list
+ index
;
1864 VTOY_JSON_INT("type", data
->type
);
1866 ret
= ventoy_data_save_all();
1868 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1872 static int ventoy_api_image_list_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1876 const char *path
= NULL
;
1877 path_node
*node
= NULL
;
1878 path_node
*cur
= NULL
;
1879 data_image_list
*data
= NULL
;
1881 vtoy_json_get_int(json
, "index", &index
);
1882 data
= g_data_image_list
+ index
;
1884 path
= VTOY_JSON_STR_EX("path");
1887 node
= zalloc(sizeof(path_node
));
1890 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1891 vtoy_list_add(data
->list
, cur
, node
);
1895 ret
= ventoy_data_save_all();
1897 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1901 static int ventoy_api_image_list_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1905 const char *path
= NULL
;
1906 path_node
*last
= NULL
;
1907 path_node
*node
= NULL
;
1908 data_image_list
*data
= NULL
;
1910 vtoy_json_get_int(json
, "index", &index
);
1911 data
= g_data_image_list
+ index
;
1913 path
= VTOY_JSON_STR_EX("path");
1916 vtoy_list_del(last
, node
, data
->list
, path
);
1919 ret
= ventoy_data_save_all();
1921 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1928 void ventoy_data_default_password(data_password
*data
)
1930 memset(data
, 0, sizeof(data_password
));
1933 int ventoy_data_cmp_password(data_password
*data1
, data_password
*data2
)
1935 menu_password
*list1
= NULL
;
1936 menu_password
*list2
= NULL
;
1938 if (strcmp(data1
->bootpwd
, data2
->bootpwd
) ||
1939 strcmp(data1
->isopwd
, data2
->isopwd
) ||
1940 strcmp(data1
->wimpwd
, data2
->wimpwd
) ||
1941 strcmp(data1
->vhdpwd
, data2
->vhdpwd
) ||
1942 strcmp(data1
->imgpwd
, data2
->imgpwd
) ||
1943 strcmp(data1
->efipwd
, data2
->efipwd
) ||
1944 strcmp(data1
->vtoypwd
, data2
->vtoypwd
)
1950 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1954 else if (data1
->list
&& data2
->list
)
1956 list1
= data1
->list
;
1957 list2
= data2
->list
;
1959 while (list1
&& list2
)
1961 if ((list1
->type
!= list2
->type
) || strcmp(list1
->path
, list2
->path
))
1966 list1
= list1
->next
;
1967 list2
= list2
->next
;
1970 if (list1
== NULL
&& list2
== NULL
)
1985 int ventoy_data_save_password(data_password
*data
, const char *title
, char *buf
, int buflen
)
1988 menu_password
*node
= NULL
;
1989 data_password
*def
= g_data_password
+ bios_max
;
1991 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1992 VTOY_JSON_FMT_KEY_L(L1
, title
);
1993 VTOY_JSON_FMT_OBJ_BEGIN_N();
1995 VTOY_JSON_FMT_DIFF_STRN(L2
, "bootpwd", bootpwd
);
1996 VTOY_JSON_FMT_DIFF_STRN(L2
, "isopwd", isopwd
);
1997 VTOY_JSON_FMT_DIFF_STRN(L2
, "wimpwd", wimpwd
);
1998 VTOY_JSON_FMT_DIFF_STRN(L2
, "vhdpwd", vhdpwd
);
1999 VTOY_JSON_FMT_DIFF_STRN(L2
, "imgpwd", imgpwd
);
2000 VTOY_JSON_FMT_DIFF_STRN(L2
, "efipwd", efipwd
);
2001 VTOY_JSON_FMT_DIFF_STRN(L2
, "vtoypwd", vtoypwd
);
2005 VTOY_JSON_FMT_KEY_L(L2
, "menupwd");
2006 VTOY_JSON_FMT_ARY_BEGIN_N();
2008 for (node
= data
->list
; node
; node
= node
->next
)
2010 VTOY_JSON_FMT_OBJ_BEGIN_LN(L3
);
2012 if (node
->type
== 0)
2014 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "file", node
->path
);
2018 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "parent", node
->path
);
2020 VTOY_JSON_FMT_STRN_LN(L4
, "pwd", node
->pwd
);
2022 VTOY_JSON_FMT_OBJ_ENDEX_LN(L3
);
2025 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
2028 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
2030 VTOY_JSON_FMT_END(pos
);
2036 int ventoy_data_json_password(data_password
*data
, char *buf
, int buflen
)
2040 menu_password
*node
= NULL
;
2042 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2044 VTOY_JSON_FMT_OBJ_BEGIN();
2046 VTOY_JSON_FMT_STRN("bootpwd", data
->bootpwd
);
2047 VTOY_JSON_FMT_STRN("isopwd", data
->isopwd
);
2048 VTOY_JSON_FMT_STRN("wimpwd", data
->wimpwd
);
2049 VTOY_JSON_FMT_STRN("vhdpwd", data
->vhdpwd
);
2050 VTOY_JSON_FMT_STRN("imgpwd", data
->imgpwd
);
2051 VTOY_JSON_FMT_STRN("efipwd", data
->efipwd
);
2052 VTOY_JSON_FMT_STRN("vtoypwd", data
->vtoypwd
);
2054 VTOY_JSON_FMT_KEY("list");
2055 VTOY_JSON_FMT_ARY_BEGIN();
2057 for (node
= data
->list
; node
; node
= node
->next
)
2059 VTOY_JSON_FMT_OBJ_BEGIN();
2061 VTOY_JSON_FMT_SINT("type", node
->type
);
2062 VTOY_JSON_FMT_STRN("path", node
->path
);
2063 if (node
->type
== path_type_file
)
2065 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2069 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
2072 VTOY_JSON_FMT_SINT("valid", valid
);
2073 VTOY_JSON_FMT_STRN("pwd", node
->pwd
);
2075 VTOY_JSON_FMT_OBJ_ENDEX();
2078 VTOY_JSON_FMT_ARY_ENDEX();
2080 VTOY_JSON_FMT_OBJ_END();
2081 VTOY_JSON_FMT_END(pos
);
2086 static int ventoy_api_get_password(struct mg_connection
*conn
, VTOY_JSON
*json
)
2088 api_get_func(conn
, json
, password
);
2092 static int ventoy_api_save_password(struct mg_connection
*conn
, VTOY_JSON
*json
)
2096 data_password
*data
= NULL
;
2098 vtoy_json_get_int(json
, "index", &index
);
2099 data
= g_data_password
+ index
;
2101 VTOY_JSON_STR("bootpwd", data
->bootpwd
);
2102 VTOY_JSON_STR("isopwd", data
->isopwd
);
2103 VTOY_JSON_STR("wimpwd", data
->wimpwd
);
2104 VTOY_JSON_STR("vhdpwd", data
->vhdpwd
);
2105 VTOY_JSON_STR("imgpwd", data
->imgpwd
);
2106 VTOY_JSON_STR("efipwd", data
->efipwd
);
2107 VTOY_JSON_STR("vtoypwd", data
->vtoypwd
);
2109 ret
= ventoy_data_save_all();
2111 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2115 static int ventoy_api_password_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2120 const char *path
= NULL
;
2121 const char *pwd
= NULL
;
2122 menu_password
*node
= NULL
;
2123 menu_password
*cur
= NULL
;
2124 data_password
*data
= NULL
;
2126 vtoy_json_get_int(json
, "index", &index
);
2127 data
= g_data_password
+ index
;
2129 vtoy_json_get_int(json
, "type", &type
);
2131 path
= VTOY_JSON_STR_EX("path");
2132 pwd
= VTOY_JSON_STR_EX("pwd");
2135 node
= zalloc(sizeof(menu_password
));
2139 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2140 scnprintf(node
->pwd
, sizeof(node
->pwd
), "%s", pwd
);
2142 vtoy_list_add(data
->list
, cur
, node
);
2146 ret
= ventoy_data_save_all();
2148 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2152 static int ventoy_api_password_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2156 const char *path
= NULL
;
2157 menu_password
*last
= NULL
;
2158 menu_password
*node
= NULL
;
2159 data_password
*data
= NULL
;
2161 vtoy_json_get_int(json
, "index", &index
);
2162 data
= g_data_password
+ index
;
2164 path
= VTOY_JSON_STR_EX("path");
2167 vtoy_list_del(last
, node
, data
->list
, path
);
2170 ret
= ventoy_data_save_all();
2172 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2179 void ventoy_data_default_conf_replace(data_conf_replace
*data
)
2181 memset(data
, 0, sizeof(data_conf_replace
));
2184 int ventoy_data_cmp_conf_replace(data_conf_replace
*data1
, data_conf_replace
*data2
)
2186 conf_replace_node
*list1
= NULL
;
2187 conf_replace_node
*list2
= NULL
;
2189 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2193 else if (data1
->list
&& data2
->list
)
2195 list1
= data1
->list
;
2196 list2
= data2
->list
;
2198 while (list1
&& list2
)
2200 if (list1
->image
!= list2
->image
||
2201 strcmp(list1
->path
, list2
->path
) ||
2202 strcmp(list1
->org
, list2
->org
) ||
2203 strcmp(list1
->new, list2
->new)
2209 list1
= list1
->next
;
2210 list2
= list2
->next
;
2213 if (list1
== NULL
&& list2
== NULL
)
2228 int ventoy_data_save_conf_replace(data_conf_replace
*data
, const char *title
, char *buf
, int buflen
)
2231 conf_replace_node
*node
= NULL
;
2233 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2235 VTOY_JSON_FMT_KEY_L(L1
, title
);
2236 VTOY_JSON_FMT_ARY_BEGIN_N();
2238 for (node
= data
->list
; node
; node
= node
->next
)
2240 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2242 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "iso", node
->path
);
2243 VTOY_JSON_FMT_STRN_LN(L3
, "org", node
->org
);
2244 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "new", node
->new);
2247 VTOY_JSON_FMT_SINT_LN(L3
, "img", node
->image
);
2250 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2253 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2254 VTOY_JSON_FMT_END(pos
);
2260 int ventoy_data_json_conf_replace(data_conf_replace
*data
, char *buf
, int buflen
)
2263 conf_replace_node
*node
= NULL
;
2265 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2266 VTOY_JSON_FMT_ARY_BEGIN();
2268 for (node
= data
->list
; node
; node
= node
->next
)
2270 VTOY_JSON_FMT_OBJ_BEGIN();
2272 VTOY_JSON_FMT_STRN("path", node
->path
);
2273 VTOY_JSON_FMT_SINT("valid", ventoy_check_fuzzy_path(node
->path
, 1));
2274 VTOY_JSON_FMT_STRN("org", node
->org
);
2275 VTOY_JSON_FMT_STRN("new", node
->new);
2276 VTOY_JSON_FMT_SINT("new_valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->new));
2277 VTOY_JSON_FMT_SINT("img", node
->image
);
2279 VTOY_JSON_FMT_OBJ_ENDEX();
2282 VTOY_JSON_FMT_ARY_END();
2283 VTOY_JSON_FMT_END(pos
);
2288 static int ventoy_api_get_conf_replace(struct mg_connection
*conn
, VTOY_JSON
*json
)
2290 api_get_func(conn
, json
, conf_replace
);
2294 static int ventoy_api_save_conf_replace(struct mg_connection
*conn
, VTOY_JSON
*json
)
2297 ret
= ventoy_data_save_all();
2299 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2303 static int ventoy_api_conf_replace_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2308 const char *path
= NULL
;
2309 const char *org
= NULL
;
2310 const char *new = NULL
;
2311 conf_replace_node
*node
= NULL
;
2312 conf_replace_node
*cur
= NULL
;
2313 data_conf_replace
*data
= NULL
;
2315 vtoy_json_get_int(json
, "img", &image
);
2317 vtoy_json_get_int(json
, "index", &index
);
2318 data
= g_data_conf_replace
+ index
;
2320 path
= VTOY_JSON_STR_EX("path");
2321 org
= VTOY_JSON_STR_EX("org");
2322 new = VTOY_JSON_STR_EX("new");
2323 if (path
&& org
&& new)
2325 node
= zalloc(sizeof(conf_replace_node
));
2328 node
->image
= image
;
2329 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2330 scnprintf(node
->org
, sizeof(node
->org
), "%s", org
);
2331 scnprintf(node
->new, sizeof(node
->new), "%s", new);
2333 vtoy_list_add(data
->list
, cur
, node
);
2337 ret
= ventoy_data_save_all();
2339 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2343 static int ventoy_api_conf_replace_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2347 const char *path
= NULL
;
2348 conf_replace_node
*last
= NULL
;
2349 conf_replace_node
*node
= NULL
;
2350 data_conf_replace
*data
= NULL
;
2352 vtoy_json_get_int(json
, "index", &index
);
2353 data
= g_data_conf_replace
+ index
;
2355 path
= VTOY_JSON_STR_EX("path");
2358 vtoy_list_del(last
, node
, data
->list
, path
);
2361 ret
= ventoy_data_save_all();
2363 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2371 void ventoy_data_default_dud(data_dud
*data
)
2373 memset(data
, 0, sizeof(data_dud
));
2376 int ventoy_data_cmp_dud(data_dud
*data1
, data_dud
*data2
)
2378 dud_node
*list1
= NULL
;
2379 dud_node
*list2
= NULL
;
2381 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2385 else if (data1
->list
&& data2
->list
)
2387 list1
= data1
->list
;
2388 list2
= data2
->list
;
2390 while (list1
&& list2
)
2392 if (strcmp(list1
->path
, list2
->path
))
2397 /* no need to compare dud list with default */
2398 list1
= list1
->next
;
2399 list2
= list2
->next
;
2402 if (list1
== NULL
&& list2
== NULL
)
2417 int ventoy_data_save_dud(data_dud
*data
, const char *title
, char *buf
, int buflen
)
2420 dud_node
*node
= NULL
;
2421 path_node
*pathnode
= NULL
;
2423 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2425 VTOY_JSON_FMT_KEY_L(L1
, title
);
2426 VTOY_JSON_FMT_ARY_BEGIN_N();
2428 for (node
= data
->list
; node
; node
= node
->next
)
2430 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2431 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
2433 VTOY_JSON_FMT_KEY_L(L3
, "dud");
2434 VTOY_JSON_FMT_ARY_BEGIN_N();
2435 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2437 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
2439 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
2441 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2444 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2445 VTOY_JSON_FMT_END(pos
);
2451 int ventoy_data_json_dud(data_dud
*data
, char *buf
, int buflen
)
2455 dud_node
*node
= NULL
;
2456 path_node
*pathnode
= NULL
;
2458 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2459 VTOY_JSON_FMT_ARY_BEGIN();
2461 for (node
= data
->list
; node
; node
= node
->next
)
2463 VTOY_JSON_FMT_OBJ_BEGIN();
2465 VTOY_JSON_FMT_STRN("path", node
->path
);
2466 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2467 VTOY_JSON_FMT_SINT("valid", valid
);
2470 VTOY_JSON_FMT_KEY("list");
2471 VTOY_JSON_FMT_ARY_BEGIN();
2472 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2474 VTOY_JSON_FMT_OBJ_BEGIN();
2475 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
2477 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
2478 VTOY_JSON_FMT_SINT("valid", valid
);
2479 VTOY_JSON_FMT_OBJ_ENDEX();
2481 VTOY_JSON_FMT_ARY_ENDEX();
2484 VTOY_JSON_FMT_OBJ_ENDEX();
2487 VTOY_JSON_FMT_ARY_END();
2488 VTOY_JSON_FMT_END(pos
);
2493 static int ventoy_api_get_dud(struct mg_connection
*conn
, VTOY_JSON
*json
)
2495 api_get_func(conn
, json
, dud
);
2499 static int ventoy_api_save_dud(struct mg_connection
*conn
, VTOY_JSON
*json
)
2502 ret
= ventoy_data_save_all();
2504 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2509 static int ventoy_api_dud_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2513 const char *path
= NULL
;
2514 dud_node
*node
= NULL
;
2515 dud_node
*cur
= NULL
;
2516 data_dud
*data
= NULL
;
2517 VTOY_JSON
*array
= NULL
;
2519 vtoy_json_get_int(json
, "index", &index
);
2520 data
= g_data_dud
+ index
;
2522 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "dud");
2523 path
= VTOY_JSON_STR_EX("path");
2526 node
= zalloc(sizeof(dud_node
));
2529 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2530 node
->list
= ventoy_path_node_add_array(array
);
2532 vtoy_list_add(data
->list
, cur
, node
);
2536 ret
= ventoy_data_save_all();
2538 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2542 static int ventoy_api_dud_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2546 const char *path
= NULL
;
2547 dud_node
*last
= NULL
;
2548 dud_node
*node
= NULL
;
2549 data_dud
*data
= NULL
;
2551 vtoy_json_get_int(json
, "index", &index
);
2552 data
= g_data_dud
+ index
;
2554 path
= VTOY_JSON_STR_EX("path");
2557 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
2560 ret
= ventoy_data_save_all();
2562 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2567 static int ventoy_api_dud_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2571 const char *path
= NULL
;
2572 const char *outpath
= NULL
;
2573 path_node
*pcur
= NULL
;
2574 path_node
*pnode
= NULL
;
2575 dud_node
*node
= NULL
;
2576 data_dud
*data
= NULL
;
2578 vtoy_json_get_int(json
, "index", &index
);
2579 data
= g_data_dud
+ index
;
2581 path
= VTOY_JSON_STR_EX("path");
2582 outpath
= VTOY_JSON_STR_EX("outpath");
2583 if (path
&& outpath
)
2585 for (node
= data
->list
; node
; node
= node
->next
)
2587 if (strcmp(outpath
, node
->path
) == 0)
2589 pnode
= zalloc(sizeof(path_node
));
2592 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
2593 vtoy_list_add(node
->list
, pcur
, pnode
);
2601 ret
= ventoy_data_save_all();
2603 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2607 static int ventoy_api_dud_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2611 const char *path
= NULL
;
2612 const char *outpath
= NULL
;
2613 path_node
*plast
= NULL
;
2614 path_node
*pnode
= NULL
;
2615 dud_node
*node
= NULL
;
2616 data_dud
*data
= NULL
;
2618 vtoy_json_get_int(json
, "index", &index
);
2619 data
= g_data_dud
+ index
;
2621 path
= VTOY_JSON_STR_EX("path");
2622 outpath
= VTOY_JSON_STR_EX("outpath");
2623 if (path
&& outpath
)
2625 for (node
= data
->list
; node
; node
= node
->next
)
2627 if (strcmp(outpath
, node
->path
) == 0)
2629 vtoy_list_del(plast
, pnode
, node
->list
, path
);
2635 ret
= ventoy_data_save_all();
2637 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2645 void ventoy_data_default_auto_install(data_auto_install
*data
)
2647 memset(data
, 0, sizeof(data_auto_install
));
2650 int ventoy_data_cmp_auto_install(data_auto_install
*data1
, data_auto_install
*data2
)
2652 auto_install_node
*list1
= NULL
;
2653 auto_install_node
*list2
= NULL
;
2655 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2659 else if (data1
->list
&& data2
->list
)
2661 list1
= data1
->list
;
2662 list2
= data2
->list
;
2664 while (list1
&& list2
)
2666 if (list1
->timeout
!= list2
->timeout
||
2667 list1
->autosel
!= list2
->autosel
||
2668 strcmp(list1
->path
, list2
->path
))
2673 /* no need to compare auto install list with default */
2674 list1
= list1
->next
;
2675 list2
= list2
->next
;
2678 if (list1
== NULL
&& list2
== NULL
)
2693 int ventoy_data_save_auto_install(data_auto_install
*data
, const char *title
, char *buf
, int buflen
)
2696 auto_install_node
*node
= NULL
;
2697 path_node
*pathnode
= NULL
;
2699 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2701 VTOY_JSON_FMT_KEY_L(L1
, title
);
2702 VTOY_JSON_FMT_ARY_BEGIN_N();
2704 for (node
= data
->list
; node
; node
= node
->next
)
2706 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2707 if (node
->type
== 0)
2709 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
2713 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
2717 VTOY_JSON_FMT_KEY_L(L3
, "template");
2718 VTOY_JSON_FMT_ARY_BEGIN_N();
2719 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2721 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
2723 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
2725 if (node
->timeouten
)
2727 VTOY_JSON_FMT_SINT_LN(L3
, "timeout", node
->timeout
);
2730 if (node
->autoselen
)
2732 VTOY_JSON_FMT_SINT_LN(L3
, "autosel", node
->autosel
);
2735 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2738 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2739 VTOY_JSON_FMT_END(pos
);
2745 int ventoy_data_json_auto_install(data_auto_install
*data
, char *buf
, int buflen
)
2749 auto_install_node
*node
= NULL
;
2750 path_node
*pathnode
= NULL
;
2752 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2753 VTOY_JSON_FMT_ARY_BEGIN();
2755 for (node
= data
->list
; node
; node
= node
->next
)
2757 VTOY_JSON_FMT_OBJ_BEGIN();
2759 VTOY_JSON_FMT_STRN("path", node
->path
);
2761 if (node
->type
== 0)
2763 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2767 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
2769 VTOY_JSON_FMT_SINT("valid", valid
);
2770 VTOY_JSON_FMT_SINT("type", node
->type
);
2772 VTOY_JSON_FMT_BOOL("timeouten", node
->timeouten
);
2773 VTOY_JSON_FMT_BOOL("autoselen", node
->autoselen
);
2775 VTOY_JSON_FMT_SINT("autosel", node
->autosel
);
2776 VTOY_JSON_FMT_SINT("timeout", node
->timeout
);
2778 VTOY_JSON_FMT_KEY("list");
2779 VTOY_JSON_FMT_ARY_BEGIN();
2780 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2782 VTOY_JSON_FMT_OBJ_BEGIN();
2783 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
2785 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
2786 VTOY_JSON_FMT_SINT("valid", valid
);
2787 VTOY_JSON_FMT_OBJ_ENDEX();
2789 VTOY_JSON_FMT_ARY_ENDEX();
2792 VTOY_JSON_FMT_OBJ_ENDEX();
2795 VTOY_JSON_FMT_ARY_END();
2796 VTOY_JSON_FMT_END(pos
);
2801 static int ventoy_api_get_auto_install(struct mg_connection
*conn
, VTOY_JSON
*json
)
2803 api_get_func(conn
, json
, auto_install
);
2807 static int ventoy_api_save_auto_install(struct mg_connection
*conn
, VTOY_JSON
*json
)
2813 uint8_t timeouten
= 0;
2814 uint8_t autoselen
= 0;
2815 auto_install_node
*node
= NULL
;
2816 data_auto_install
*data
= NULL
;
2818 vtoy_json_get_int(json
, "index", &index
);
2819 vtoy_json_get_int(json
, "id", &id
);
2821 vtoy_json_get_bool(json
, "timeouten", &timeouten
);
2822 vtoy_json_get_bool(json
, "autoselen", &autoselen
);
2824 data
= g_data_auto_install
+ index
;
2828 for (node
= data
->list
; node
; node
= node
->next
)
2832 node
->timeouten
= (int)timeouten
;
2833 node
->autoselen
= (int)autoselen
;
2834 VTOY_JSON_INT("timeout", node
->timeout
);
2835 VTOY_JSON_INT("autosel", node
->autosel
);
2841 ret
= ventoy_data_save_all();
2843 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2848 static int ventoy_api_auto_install_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2853 const char *path
= NULL
;
2854 auto_install_node
*node
= NULL
;
2855 auto_install_node
*cur
= NULL
;
2856 data_auto_install
*data
= NULL
;
2857 VTOY_JSON
*array
= NULL
;
2859 vtoy_json_get_int(json
, "type", &type
);
2860 vtoy_json_get_int(json
, "index", &index
);
2861 data
= g_data_auto_install
+ index
;
2863 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "template");
2864 path
= VTOY_JSON_STR_EX("path");
2867 node
= zalloc(sizeof(auto_install_node
));
2871 node
->timeouten
= 0;
2872 node
->autoselen
= 0;
2875 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2876 node
->list
= ventoy_path_node_add_array(array
);
2878 vtoy_list_add(data
->list
, cur
, node
);
2882 ret
= ventoy_data_save_all();
2884 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2888 static int ventoy_api_auto_install_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2892 const char *path
= NULL
;
2893 auto_install_node
*last
= NULL
;
2894 auto_install_node
*node
= NULL
;
2895 data_auto_install
*data
= NULL
;
2897 vtoy_json_get_int(json
, "index", &index
);
2898 data
= g_data_auto_install
+ index
;
2900 path
= VTOY_JSON_STR_EX("path");
2903 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
2906 ret
= ventoy_data_save_all();
2908 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2912 static int ventoy_api_auto_install_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2916 const char *path
= NULL
;
2917 const char *outpath
= NULL
;
2918 path_node
*pcur
= NULL
;
2919 path_node
*pnode
= NULL
;
2920 auto_install_node
*node
= NULL
;
2921 data_auto_install
*data
= NULL
;
2923 vtoy_json_get_int(json
, "index", &index
);
2924 data
= g_data_auto_install
+ index
;
2926 path
= VTOY_JSON_STR_EX("path");
2927 outpath
= VTOY_JSON_STR_EX("outpath");
2928 if (path
&& outpath
)
2930 for (node
= data
->list
; node
; node
= node
->next
)
2932 if (strcmp(outpath
, node
->path
) == 0)
2934 pnode
= zalloc(sizeof(path_node
));
2937 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
2938 vtoy_list_add(node
->list
, pcur
, pnode
);
2946 ret
= ventoy_data_save_all();
2948 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2952 static int ventoy_api_auto_install_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2956 const char *path
= NULL
;
2957 const char *outpath
= NULL
;
2958 path_node
*plast
= NULL
;
2959 path_node
*pnode
= NULL
;
2960 auto_install_node
*node
= NULL
;
2961 data_auto_install
*data
= NULL
;
2963 vtoy_json_get_int(json
, "index", &index
);
2964 data
= g_data_auto_install
+ index
;
2966 path
= VTOY_JSON_STR_EX("path");
2967 outpath
= VTOY_JSON_STR_EX("outpath");
2968 if (path
&& outpath
)
2970 for (node
= data
->list
; node
; node
= node
->next
)
2972 if (strcmp(outpath
, node
->path
) == 0)
2974 vtoy_list_del(plast
, pnode
, node
->list
, path
);
2980 ret
= ventoy_data_save_all();
2982 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2991 void ventoy_data_default_persistence(data_persistence
*data
)
2993 memset(data
, 0, sizeof(data_persistence
));
2996 int ventoy_data_cmp_persistence(data_persistence
*data1
, data_persistence
*data2
)
2998 persistence_node
*list1
= NULL
;
2999 persistence_node
*list2
= NULL
;
3001 if (NULL
== data1
->list
&& NULL
== data2
->list
)
3005 else if (data1
->list
&& data2
->list
)
3007 list1
= data1
->list
;
3008 list2
= data2
->list
;
3010 while (list1
&& list2
)
3012 if (list1
->timeout
!= list2
->timeout
||
3013 list1
->autosel
!= list2
->autosel
||
3014 strcmp(list1
->path
, list2
->path
))
3019 /* no need to compare auto install list with default */
3020 list1
= list1
->next
;
3021 list2
= list2
->next
;
3024 if (list1
== NULL
&& list2
== NULL
)
3039 int ventoy_data_save_persistence(data_persistence
*data
, const char *title
, char *buf
, int buflen
)
3042 persistence_node
*node
= NULL
;
3043 path_node
*pathnode
= NULL
;
3045 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3047 VTOY_JSON_FMT_KEY_L(L1
, title
);
3048 VTOY_JSON_FMT_ARY_BEGIN_N();
3050 for (node
= data
->list
; node
; node
= node
->next
)
3052 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
3053 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
3054 VTOY_JSON_FMT_KEY_L(L3
, "backend");
3055 VTOY_JSON_FMT_ARY_BEGIN_N();
3056 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
3058 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
3060 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
3062 if (node
->timeouten
)
3064 VTOY_JSON_FMT_SINT_LN(L3
, "timeout", node
->timeout
);
3067 if (node
->autoselen
)
3069 VTOY_JSON_FMT_SINT_LN(L3
, "autosel", node
->autosel
);
3072 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
3075 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
3076 VTOY_JSON_FMT_END(pos
);
3082 int ventoy_data_json_persistence(data_persistence
*data
, char *buf
, int buflen
)
3086 persistence_node
*node
= NULL
;
3087 path_node
*pathnode
= NULL
;
3089 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3090 VTOY_JSON_FMT_ARY_BEGIN();
3092 for (node
= data
->list
; node
; node
= node
->next
)
3094 VTOY_JSON_FMT_OBJ_BEGIN();
3096 VTOY_JSON_FMT_STRN("path", node
->path
);
3098 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
3099 VTOY_JSON_FMT_SINT("valid", valid
);
3100 VTOY_JSON_FMT_SINT("type", node
->type
);
3102 VTOY_JSON_FMT_BOOL("timeouten", node
->timeouten
);
3103 VTOY_JSON_FMT_BOOL("autoselen", node
->autoselen
);
3105 VTOY_JSON_FMT_SINT("autosel", node
->autosel
);
3106 VTOY_JSON_FMT_SINT("timeout", node
->timeout
);
3108 VTOY_JSON_FMT_KEY("list");
3109 VTOY_JSON_FMT_ARY_BEGIN();
3110 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
3112 VTOY_JSON_FMT_OBJ_BEGIN();
3113 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
3115 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
3116 VTOY_JSON_FMT_SINT("valid", valid
);
3117 VTOY_JSON_FMT_OBJ_ENDEX();
3119 VTOY_JSON_FMT_ARY_ENDEX();
3122 VTOY_JSON_FMT_OBJ_ENDEX();
3125 VTOY_JSON_FMT_ARY_END();
3126 VTOY_JSON_FMT_END(pos
);
3131 static int ventoy_api_get_persistence(struct mg_connection
*conn
, VTOY_JSON
*json
)
3133 api_get_func(conn
, json
, persistence
);
3137 static int ventoy_api_save_persistence(struct mg_connection
*conn
, VTOY_JSON
*json
)
3143 uint8_t timeouten
= 0;
3144 uint8_t autoselen
= 0;
3145 persistence_node
*node
= NULL
;
3146 data_persistence
*data
= NULL
;
3148 vtoy_json_get_int(json
, "index", &index
);
3149 vtoy_json_get_int(json
, "id", &id
);
3151 vtoy_json_get_bool(json
, "timeouten", &timeouten
);
3152 vtoy_json_get_bool(json
, "autoselen", &autoselen
);
3154 data
= g_data_persistence
+ index
;
3158 for (node
= data
->list
; node
; node
= node
->next
)
3162 node
->timeouten
= (int)timeouten
;
3163 node
->autoselen
= (int)autoselen
;
3164 VTOY_JSON_INT("timeout", node
->timeout
);
3165 VTOY_JSON_INT("autosel", node
->autosel
);
3171 ret
= ventoy_data_save_all();
3173 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3178 static int ventoy_api_persistence_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
3182 const char *path
= NULL
;
3183 persistence_node
*node
= NULL
;
3184 persistence_node
*cur
= NULL
;
3185 data_persistence
*data
= NULL
;
3186 VTOY_JSON
*array
= NULL
;
3188 vtoy_json_get_int(json
, "index", &index
);
3189 data
= g_data_persistence
+ index
;
3191 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "backend");
3192 path
= VTOY_JSON_STR_EX("path");
3195 node
= zalloc(sizeof(persistence_node
));
3198 node
->timeouten
= 0;
3199 node
->autoselen
= 0;
3202 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
3203 node
->list
= ventoy_path_node_add_array(array
);
3205 vtoy_list_add(data
->list
, cur
, node
);
3209 ret
= ventoy_data_save_all();
3211 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3215 static int ventoy_api_persistence_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
3219 const char *path
= NULL
;
3220 persistence_node
*last
= NULL
;
3221 persistence_node
*node
= NULL
;
3222 data_persistence
*data
= NULL
;
3224 vtoy_json_get_int(json
, "index", &index
);
3225 data
= g_data_persistence
+ index
;
3227 path
= VTOY_JSON_STR_EX("path");
3230 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
3233 ret
= ventoy_data_save_all();
3235 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3239 static int ventoy_api_persistence_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
3243 const char *path
= NULL
;
3244 const char *outpath
= NULL
;
3245 path_node
*pcur
= NULL
;
3246 path_node
*pnode
= NULL
;
3247 persistence_node
*node
= NULL
;
3248 data_persistence
*data
= NULL
;
3250 vtoy_json_get_int(json
, "index", &index
);
3251 data
= g_data_persistence
+ index
;
3253 path
= VTOY_JSON_STR_EX("path");
3254 outpath
= VTOY_JSON_STR_EX("outpath");
3255 if (path
&& outpath
)
3257 for (node
= data
->list
; node
; node
= node
->next
)
3259 if (strcmp(outpath
, node
->path
) == 0)
3261 pnode
= zalloc(sizeof(path_node
));
3264 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
3265 vtoy_list_add(node
->list
, pcur
, pnode
);
3273 ret
= ventoy_data_save_all();
3275 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3279 static int ventoy_api_persistence_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
3283 const char *path
= NULL
;
3284 const char *outpath
= NULL
;
3285 path_node
*plast
= NULL
;
3286 path_node
*pnode
= NULL
;
3287 persistence_node
*node
= NULL
;
3288 data_persistence
*data
= NULL
;
3290 vtoy_json_get_int(json
, "index", &index
);
3291 data
= g_data_persistence
+ index
;
3293 path
= VTOY_JSON_STR_EX("path");
3294 outpath
= VTOY_JSON_STR_EX("outpath");
3295 if (path
&& outpath
)
3297 for (node
= data
->list
; node
; node
= node
->next
)
3299 if (strcmp(outpath
, node
->path
) == 0)
3301 vtoy_list_del(plast
, pnode
, node
->list
, path
);
3307 ret
= ventoy_data_save_all();
3309 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3317 void ventoy_data_default_injection(data_injection
*data
)
3319 memset(data
, 0, sizeof(data_injection
));
3322 int ventoy_data_cmp_injection(data_injection
*data1
, data_injection
*data2
)
3324 injection_node
*list1
= NULL
;
3325 injection_node
*list2
= NULL
;
3327 if (NULL
== data1
->list
&& NULL
== data2
->list
)
3331 else if (data1
->list
&& data2
->list
)
3333 list1
= data1
->list
;
3334 list2
= data2
->list
;
3336 while (list1
&& list2
)
3338 if ((list1
->type
!= list2
->type
) ||
3339 strcmp(list1
->path
, list2
->path
) ||
3340 strcmp(list1
->archive
, list2
->archive
))
3345 list1
= list1
->next
;
3346 list2
= list2
->next
;
3349 if (list1
== NULL
&& list2
== NULL
)
3364 int ventoy_data_save_injection(data_injection
*data
, const char *title
, char *buf
, int buflen
)
3367 injection_node
*node
= NULL
;
3369 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3371 VTOY_JSON_FMT_KEY_L(L1
, title
);
3372 VTOY_JSON_FMT_ARY_BEGIN_N();
3374 for (node
= data
->list
; node
; node
= node
->next
)
3376 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
3378 if (node
->type
== 0)
3380 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
3384 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
3386 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "archive", node
->archive
);
3388 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
3391 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
3392 VTOY_JSON_FMT_END(pos
);
3398 int ventoy_data_json_injection(data_injection
*data
, char *buf
, int buflen
)
3402 injection_node
*node
= NULL
;
3404 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3405 VTOY_JSON_FMT_ARY_BEGIN();
3407 for (node
= data
->list
; node
; node
= node
->next
)
3409 VTOY_JSON_FMT_OBJ_BEGIN();
3411 VTOY_JSON_FMT_UINT("type", node
->type
);
3412 VTOY_JSON_FMT_STRN("path", node
->path
);
3414 if (node
->type
== 0)
3416 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
3420 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
3422 VTOY_JSON_FMT_SINT("valid", valid
);
3424 VTOY_JSON_FMT_STRN("archive", node
->archive
);
3426 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, node
->archive
);
3427 VTOY_JSON_FMT_SINT("archive_valid", valid
);
3429 VTOY_JSON_FMT_OBJ_ENDEX();
3432 VTOY_JSON_FMT_ARY_END();
3433 VTOY_JSON_FMT_END(pos
);
3439 static int ventoy_api_get_injection(struct mg_connection
*conn
, VTOY_JSON
*json
)
3441 api_get_func(conn
, json
, injection
);
3445 static int ventoy_api_save_injection(struct mg_connection
*conn
, VTOY_JSON
*json
)
3448 ret
= ventoy_data_save_all();
3450 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3454 static int ventoy_api_injection_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
3459 const char *path
= NULL
;
3460 const char *archive
= NULL
;
3461 injection_node
*node
= NULL
;
3462 injection_node
*cur
= NULL
;
3463 data_injection
*data
= NULL
;
3465 vtoy_json_get_int(json
, "index", &index
);
3466 data
= g_data_injection
+ index
;
3468 vtoy_json_get_int(json
, "type", &type
);
3470 path
= VTOY_JSON_STR_EX("path");
3471 archive
= VTOY_JSON_STR_EX("archive");
3472 if (path
&& archive
)
3474 node
= zalloc(sizeof(injection_node
));
3479 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
3480 scnprintf(node
->archive
, sizeof(node
->archive
), "%s", archive
);
3482 vtoy_list_add(data
->list
, cur
, node
);
3486 ret
= ventoy_data_save_all();
3488 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3492 static int ventoy_api_injection_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
3496 const char *path
= NULL
;
3497 injection_node
*last
= NULL
;
3498 injection_node
*node
= NULL
;
3499 data_injection
*data
= NULL
;
3501 vtoy_json_get_int(json
, "index", &index
);
3502 data
= g_data_injection
+ index
;
3504 path
= VTOY_JSON_STR_EX("path");
3507 vtoy_list_del(last
, node
, data
->list
, path
);
3510 ret
= ventoy_data_save_all();
3512 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3520 int ventoy_data_save_all(void)
3522 ventoy_set_writeback_event();
3526 int ventoy_data_real_save_all(void)
3532 pthread_mutex_lock(&g_api_mutex
);
3534 ssprintf(pos
, JSON_SAVE_BUFFER
, JSON_BUF_MAX
, "{\n");
3536 ventoy_save_plug(control
);
3537 ventoy_save_plug(theme
);
3538 ventoy_save_plug(menu_alias
);
3539 ventoy_save_plug(menu_tip
);
3540 ventoy_save_plug(menu_class
);
3541 ventoy_save_plug(auto_install
);
3542 ventoy_save_plug(persistence
);
3543 ventoy_save_plug(injection
);
3544 ventoy_save_plug(conf_replace
);
3545 ventoy_save_plug(password
);
3546 ventoy_save_plug(image_list
);
3547 ventoy_save_plug(auto_memdisk
);
3548 ventoy_save_plug(dud
);
3550 if (JSON_SAVE_BUFFER
[pos
- 1] == '\n' && JSON_SAVE_BUFFER
[pos
- 2] == ',')
3552 JSON_SAVE_BUFFER
[pos
- 2] = '\n';
3555 ssprintf(pos
, JSON_SAVE_BUFFER
, JSON_BUF_MAX
, "}\n");
3557 pthread_mutex_unlock(&g_api_mutex
);
3562 int ventoy_http_writeback(void)
3568 ventoy_get_json_path(filename
, NULL
);
3570 pos
= ventoy_data_real_save_all();
3573 printf("%s", JSON_SAVE_BUFFER
);
3576 ret
= ventoy_write_buf_to_file(filename
, JSON_SAVE_BUFFER
, pos
);
3579 vlog("Failed to write ventoy.json file.\n");
3586 static JSON_CB g_ventoy_json_cb
[] =
3588 { "sysinfo", ventoy_api_sysinfo
},
3589 { "handshake", ventoy_api_handshake
},
3590 { "check_path", ventoy_api_check_exist
},
3591 { "check_path2", ventoy_api_check_exist2
},
3592 { "check_fuzzy", ventoy_api_check_fuzzy
},
3594 { "device_info", ventoy_api_device_info
},
3596 { "get_control", ventoy_api_get_control
},
3597 { "save_control", ventoy_api_save_control
},
3599 { "get_theme", ventoy_api_get_theme
},
3600 { "save_theme", ventoy_api_save_theme
},
3601 { "theme_add_file", ventoy_api_theme_add_file
},
3602 { "theme_del_file", ventoy_api_theme_del_file
},
3603 { "theme_add_font", ventoy_api_theme_add_font
},
3604 { "theme_del_font", ventoy_api_theme_del_font
},
3606 { "get_alias", ventoy_api_get_alias
},
3607 { "save_alias", ventoy_api_save_alias
},
3608 { "alias_add", ventoy_api_alias_add
},
3609 { "alias_del", ventoy_api_alias_del
},
3611 { "get_tip", ventoy_api_get_tip
},
3612 { "save_tip", ventoy_api_save_tip
},
3613 { "tip_add", ventoy_api_tip_add
},
3614 { "tip_del", ventoy_api_tip_del
},
3616 { "get_class", ventoy_api_get_class
},
3617 { "save_class", ventoy_api_save_class
},
3618 { "class_add", ventoy_api_class_add
},
3619 { "class_del", ventoy_api_class_del
},
3621 { "get_auto_memdisk", ventoy_api_get_auto_memdisk
},
3622 { "save_auto_memdisk", ventoy_api_save_auto_memdisk
},
3623 { "auto_memdisk_add", ventoy_api_auto_memdisk_add
},
3624 { "auto_memdisk_del", ventoy_api_auto_memdisk_del
},
3626 { "get_image_list", ventoy_api_get_image_list
},
3627 { "save_image_list", ventoy_api_save_image_list
},
3628 { "image_list_add", ventoy_api_image_list_add
},
3629 { "image_list_del", ventoy_api_image_list_del
},
3631 { "get_conf_replace", ventoy_api_get_conf_replace
},
3632 { "save_conf_replace", ventoy_api_save_conf_replace
},
3633 { "conf_replace_add", ventoy_api_conf_replace_add
},
3634 { "conf_replace_del", ventoy_api_conf_replace_del
},
3636 { "get_dud", ventoy_api_get_dud
},
3637 { "save_dud", ventoy_api_save_dud
},
3638 { "dud_add", ventoy_api_dud_add
},
3639 { "dud_del", ventoy_api_dud_del
},
3640 { "dud_add_inner", ventoy_api_dud_add_inner
},
3641 { "dud_del_inner", ventoy_api_dud_del_inner
},
3643 { "get_auto_install", ventoy_api_get_auto_install
},
3644 { "save_auto_install", ventoy_api_save_auto_install
},
3645 { "auto_install_add", ventoy_api_auto_install_add
},
3646 { "auto_install_del", ventoy_api_auto_install_del
},
3647 { "auto_install_add_inner", ventoy_api_auto_install_add_inner
},
3648 { "auto_install_del_inner", ventoy_api_auto_install_del_inner
},
3650 { "get_persistence", ventoy_api_get_persistence
},
3651 { "save_persistence", ventoy_api_save_persistence
},
3652 { "persistence_add", ventoy_api_persistence_add
},
3653 { "persistence_del", ventoy_api_persistence_del
},
3654 { "persistence_add_inner", ventoy_api_persistence_add_inner
},
3655 { "persistence_del_inner", ventoy_api_persistence_del_inner
},
3657 { "get_password", ventoy_api_get_password
},
3658 { "save_password", ventoy_api_save_password
},
3659 { "password_add", ventoy_api_password_add
},
3660 { "password_del", ventoy_api_password_del
},
3662 { "get_injection", ventoy_api_get_injection
},
3663 { "save_injection", ventoy_api_save_injection
},
3664 { "injection_add", ventoy_api_injection_add
},
3665 { "injection_del", ventoy_api_injection_del
},
3670 static int ventoy_json_handler(struct mg_connection
*conn
, VTOY_JSON
*json
)
3673 const char *method
= NULL
;
3675 method
= vtoy_json_get_string_ex(json
, "method");
3678 ventoy_json_result(conn
, VTOY_JSON_SUCCESS_RET
);
3682 if (strcmp(method
, "handshake") == 0)
3684 ventoy_api_handshake(conn
, json
);
3688 for (i
= 0; i
< (int)(sizeof(g_ventoy_json_cb
) / sizeof(g_ventoy_json_cb
[0])); i
++)
3690 if (strcmp(method
, g_ventoy_json_cb
[i
].method
) == 0)
3692 g_ventoy_json_cb
[i
].callback(conn
, json
);
3700 static int ventoy_request_handler(struct mg_connection
*conn
)
3704 VTOY_JSON
*json
= NULL
;
3705 char *post_data_buf
= NULL
;
3706 const struct mg_request_info
*ri
= NULL
;
3707 char stack_buf
[512];
3709 ri
= mg_get_request_info(conn
);
3711 if (strcmp(ri
->uri
, "/vtoy/json") == 0)
3713 if (ri
->content_length
> 500)
3715 post_data_buf
= malloc((int)(ri
->content_length
+ 4));
3716 post_buf_len
= (int)(ri
->content_length
+ 1);
3720 post_data_buf
= stack_buf
;
3721 post_buf_len
= sizeof(stack_buf
);
3724 post_data_len
= mg_read(conn
, post_data_buf
, post_buf_len
);
3725 post_data_buf
[post_data_len
] = 0;
3727 json
= vtoy_json_create();
3728 if (JSON_SUCCESS
== vtoy_json_parse(json
, post_data_buf
))
3730 pthread_mutex_lock(&g_api_mutex
);
3731 ventoy_json_handler(conn
, json
->pstChild
);
3732 pthread_mutex_unlock(&g_api_mutex
);
3736 ventoy_json_result(conn
, VTOY_JSON_INVALID_RET
);
3739 vtoy_json_destroy(json
);
3741 if (post_data_buf
!= stack_buf
)
3743 free(post_data_buf
);
3753 const char *ventoy_web_openfile(const struct mg_connection
*conn
, const char *path
, size_t *data_len
)
3755 ventoy_file
*node
= NULL
;
3764 node
= ventoy_tar_find_file(path
);
3767 *data_len
= node
->size
;
3779 static int ventoy_parse_control(VTOY_JSON
*json
, void *p
)
3782 VTOY_JSON
*node
= NULL
;
3783 VTOY_JSON
*child
= NULL
;
3784 data_control
*data
= (data_control
*)p
;
3786 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
3791 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
3793 if (node
->enDataType
== JSON_TYPE_OBJECT
)
3795 child
= node
->pstChild
;
3797 if (strcmp(child
->pcName
, "VTOY_DEFAULT_MENU_MODE") == 0)
3799 CONTROL_PARSE_INT(child
, data
->default_menu_mode
);
3801 else if (strcmp(child
->pcName
, "VTOY_WIN11_BYPASS_CHECK") == 0)
3803 CONTROL_PARSE_INT(child
, data
->win11_bypass_check
);
3805 else if (strcmp(child
->pcName
, "VTOY_LINUX_REMOUNT") == 0)
3807 CONTROL_PARSE_INT(child
, data
->linux_remount
);
3809 else if (strcmp(child
->pcName
, "VTOY_TREE_VIEW_MENU_STYLE") == 0)
3811 CONTROL_PARSE_INT(child
, data
->treeview_style
);
3813 else if (strcmp(child
->pcName
, "VTOY_FILT_DOT_UNDERSCORE_FILE") == 0)
3815 CONTROL_PARSE_INT(child
, data
->filter_dot_underscore
);
3817 else if (strcmp(child
->pcName
, "VTOY_SORT_CASE_SENSITIVE") == 0)
3819 CONTROL_PARSE_INT(child
, data
->sort_casesensitive
);
3821 else if (strcmp(child
->pcName
, "VTOY_MAX_SEARCH_LEVEL") == 0)
3823 if (strcmp(child
->unData
.pcStrVal
, "max") == 0)
3825 data
->max_search_level
= -1;
3829 data
->max_search_level
= (int)strtol(child
->unData
.pcStrVal
, NULL
, 10);
3832 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_SEARCH_ROOT") == 0)
3834 strlcpy(data
->default_search_root
, child
->unData
.pcStrVal
);
3836 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_IMAGE") == 0)
3838 strlcpy(data
->default_image
, child
->unData
.pcStrVal
);
3840 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_KBD_LAYOUT") == 0)
3842 for (i
= 0; g_ventoy_kbd_layout
[i
]; i
++)
3844 if (strcmp(child
->unData
.pcStrVal
, g_ventoy_kbd_layout
[i
]) == 0)
3846 strlcpy(data
->default_kbd_layout
, child
->unData
.pcStrVal
);
3851 else if (strcmp(child
->pcName
, "VTOY_HELP_TXT_LANGUAGE") == 0)
3853 for (i
= 0; g_ventoy_help_lang
[i
][0]; i
++)
3855 if (strcmp(child
->unData
.pcStrVal
, g_ventoy_help_lang
[i
]) == 0)
3857 strlcpy(data
->help_text_language
, child
->unData
.pcStrVal
);
3862 else if (strcmp(child
->pcName
, "VTOY_MENU_TIMEOUT") == 0)
3864 data
->menu_timeout
= (int)strtol(child
->unData
.pcStrVal
, NULL
, 10);
3866 else if (strcmp(child
->pcName
, "VTOY_VHD_NO_WARNING") == 0)
3868 CONTROL_PARSE_INT(child
, data
->vhd_no_warning
);
3870 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_ISO") == 0)
3872 CONTROL_PARSE_INT(child
, data
->filter_iso
);
3874 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_IMG") == 0)
3876 CONTROL_PARSE_INT(child
, data
->filter_img
);
3878 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_EFI") == 0)
3880 CONTROL_PARSE_INT(child
, data
->filter_efi
);
3882 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_WIM") == 0)
3884 CONTROL_PARSE_INT(child
, data
->filter_wim
);
3886 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_VHD") == 0)
3888 CONTROL_PARSE_INT(child
, data
->filter_vhd
);
3890 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_VTOY") == 0)
3892 CONTROL_PARSE_INT(child
, data
->filter_vtoy
);
3900 static int ventoy_parse_theme(VTOY_JSON
*json
, void *p
)
3902 const char *dismode
= NULL
;
3903 VTOY_JSON
*child
= NULL
;
3904 VTOY_JSON
*node
= NULL
;
3905 path_node
*tail
= NULL
;
3906 path_node
*pnode
= NULL
;
3907 data_theme
*data
= (data_theme
*)p
;
3909 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
3914 child
= json
->pstChild
;
3916 dismode
= vtoy_json_get_string_ex(child
, "display_mode");
3917 vtoy_json_get_string(child
, "ventoy_left", sizeof(data
->ventoy_left
), data
->ventoy_left
);
3918 vtoy_json_get_string(child
, "ventoy_top", sizeof(data
->ventoy_top
), data
->ventoy_top
);
3919 vtoy_json_get_string(child
, "ventoy_color", sizeof(data
->ventoy_color
), data
->ventoy_color
);
3921 vtoy_json_get_int(child
, "default_file", &(data
->default_file
));
3922 vtoy_json_get_string(child
, "gfxmode", sizeof(data
->gfxmode
), data
->gfxmode
);
3923 vtoy_json_get_string(child
, "serial_param", sizeof(data
->serial_param
), data
->serial_param
);
3927 if (strcmp(dismode
, "CLI") == 0)
3929 data
->display_mode
= display_mode_cli
;
3931 else if (strcmp(dismode
, "serial") == 0)
3933 data
->display_mode
= display_mode_serial
;
3935 else if (strcmp(dismode
, "serial_console") == 0)
3937 data
->display_mode
= display_mode_ser_console
;
3941 data
->display_mode
= display_mode_gui
;
3945 node
= vtoy_json_find_item(child
, JSON_TYPE_STRING
, "file");
3948 data
->default_file
= 0;
3950 pnode
= zalloc(sizeof(path_node
));
3953 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3954 data
->filelist
= pnode
;
3959 node
= vtoy_json_find_item(child
, JSON_TYPE_ARRAY
, "file");
3962 for (node
= node
->pstChild
; node
; node
= node
->pstNext
)
3964 if (node
->enDataType
== JSON_TYPE_STRING
)
3966 pnode
= zalloc(sizeof(path_node
));
3969 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3977 data
->filelist
= tail
= pnode
;
3986 node
= vtoy_json_find_item(child
, JSON_TYPE_ARRAY
, "fonts");
3989 for (node
= node
->pstChild
; node
; node
= node
->pstNext
)
3991 if (node
->enDataType
== JSON_TYPE_STRING
)
3993 pnode
= zalloc(sizeof(path_node
));
3996 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3997 if (data
->fontslist
)
4004 data
->fontslist
= tail
= pnode
;
4013 static int ventoy_parse_menu_alias(VTOY_JSON
*json
, void *p
)
4016 const char *path
= NULL
;
4017 const char *alias
= NULL
;
4018 data_alias
*data
= (data_alias
*)p
;
4019 data_alias_node
*tail
= NULL
;
4020 data_alias_node
*pnode
= NULL
;
4021 VTOY_JSON
*node
= NULL
;
4023 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4028 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4030 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4035 type
= path_type_file
;
4036 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4039 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4040 type
= path_type_dir
;
4042 alias
= vtoy_json_get_string_ex(node
->pstChild
, "alias");
4046 pnode
= zalloc(sizeof(data_alias_node
));
4050 strlcpy(pnode
->path
, path
);
4051 strlcpy(pnode
->alias
, alias
);
4060 data
->list
= tail
= pnode
;
4069 static int ventoy_parse_menu_tip(VTOY_JSON
*json
, void *p
)
4072 const char *path
= NULL
;
4073 const char *tip
= NULL
;
4074 data_tip
*data
= (data_tip
*)p
;
4075 data_tip_node
*tail
= NULL
;
4076 data_tip_node
*pnode
= NULL
;
4077 VTOY_JSON
*node
= NULL
;
4078 VTOY_JSON
*tips
= NULL
;
4080 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
4085 vtoy_json_get_string(json
->pstChild
, "left", sizeof(data
->left
), data
->left
);
4086 vtoy_json_get_string(json
->pstChild
, "top", sizeof(data
->top
), data
->top
);
4087 vtoy_json_get_string(json
->pstChild
, "color", sizeof(data
->color
), data
->color
);
4089 tips
= vtoy_json_find_item(json
->pstChild
, JSON_TYPE_ARRAY
, "tips");
4095 for (node
= tips
->pstChild
; node
; node
= node
->pstNext
)
4097 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4102 type
= path_type_file
;
4103 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4106 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4107 type
= path_type_dir
;
4109 tip
= vtoy_json_get_string_ex(node
->pstChild
, "tip");
4113 pnode
= zalloc(sizeof(data_tip_node
));
4117 strlcpy(pnode
->path
, path
);
4118 strlcpy(pnode
->tip
, tip
);
4127 data
->list
= tail
= pnode
;
4135 static int ventoy_parse_menu_class(VTOY_JSON
*json
, void *p
)
4138 const char *path
= NULL
;
4139 const char *class = NULL
;
4140 data_class
*data
= (data_class
*)p
;
4141 data_class_node
*tail
= NULL
;
4142 data_class_node
*pnode
= NULL
;
4143 VTOY_JSON
*node
= NULL
;
4145 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4150 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4152 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4157 type
= class_type_key
;
4158 path
= vtoy_json_get_string_ex(node
->pstChild
, "key");
4161 type
= class_type_dir
;
4162 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4165 type
= class_type_parent
;
4166 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4169 class = vtoy_json_get_string_ex(node
->pstChild
, "class");
4173 pnode
= zalloc(sizeof(data_class_node
));
4177 strlcpy(pnode
->path
, path
);
4178 strlcpy(pnode
->class, class);
4187 data
->list
= tail
= pnode
;
4195 static int ventoy_parse_auto_install(VTOY_JSON
*json
, void *p
)
4203 const char *path
= NULL
;
4204 const char *file
= NULL
;
4205 data_auto_install
*data
= (data_auto_install
*)p
;
4206 auto_install_node
*tail
= NULL
;
4207 auto_install_node
*pnode
= NULL
;
4208 path_node
*pathnode
= NULL
;
4209 path_node
*pathtail
= NULL
;
4210 VTOY_JSON
*node
= NULL
;
4211 VTOY_JSON
*filelist
= NULL
;
4212 VTOY_JSON
*filenode
= NULL
;
4214 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4219 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4221 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4227 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4230 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4238 file
= vtoy_json_get_string_ex(node
->pstChild
, "template");
4241 pnode
= zalloc(sizeof(auto_install_node
));
4246 strlcpy(pnode
->path
, path
);
4248 pathnode
= zalloc(sizeof(path_node
));
4251 strlcpy(pathnode
->path
, file
);
4252 pnode
->list
= pathnode
;
4266 data
->list
= tail
= pnode
;
4274 timeouten
= autoselen
= 0;
4275 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "timeout", &timeout
))
4279 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "autosel", &autosel
))
4284 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "template");
4290 pnode
= zalloc(sizeof(auto_install_node
));
4297 pnode
->autoselen
= autoselen
;
4298 pnode
->timeouten
= timeouten
;
4299 pnode
->timeout
= timeout
;
4300 pnode
->autosel
= autosel
;
4301 strlcpy(pnode
->path
, path
);
4304 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4306 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4311 pathnode
= zalloc(sizeof(path_node
));
4315 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4319 pathtail
->next
= pathnode
;
4320 pathtail
= pathnode
;
4324 pnode
->list
= pathtail
= pathnode
;
4335 if (pnode
->autoselen
&& pnode
->autosel
> count
)
4347 data
->list
= tail
= pnode
;
4354 static int ventoy_parse_persistence(VTOY_JSON
*json
, void *p
)
4361 const char *path
= NULL
;
4362 const char *file
= NULL
;
4363 data_persistence
*data
= (data_persistence
*)p
;
4364 persistence_node
*tail
= NULL
;
4365 persistence_node
*pnode
= NULL
;
4366 path_node
*pathnode
= NULL
;
4367 path_node
*pathtail
= NULL
;
4368 VTOY_JSON
*node
= NULL
;
4369 VTOY_JSON
*filelist
= NULL
;
4370 VTOY_JSON
*filenode
= NULL
;
4372 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4377 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4379 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4384 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4390 file
= vtoy_json_get_string_ex(node
->pstChild
, "backend");
4393 pnode
= zalloc(sizeof(persistence_node
));
4398 strlcpy(pnode
->path
, path
);
4400 pathnode
= zalloc(sizeof(path_node
));
4403 strlcpy(pathnode
->path
, file
);
4404 pnode
->list
= pathnode
;
4418 data
->list
= tail
= pnode
;
4426 timeouten
= autoselen
= 0;
4427 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "timeout", &timeout
))
4431 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "autosel", &autosel
))
4436 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "backend");
4442 pnode
= zalloc(sizeof(persistence_node
));
4449 pnode
->autoselen
= autoselen
;
4450 pnode
->timeouten
= timeouten
;
4451 pnode
->timeout
= timeout
;
4452 pnode
->autosel
= autosel
;
4453 strlcpy(pnode
->path
, path
);
4456 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4458 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4463 pathnode
= zalloc(sizeof(path_node
));
4467 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4471 pathtail
->next
= pathnode
;
4472 pathtail
= pathnode
;
4476 pnode
->list
= pathtail
= pathnode
;
4487 if (pnode
->autoselen
&& pnode
->autosel
> count
)
4499 data
->list
= tail
= pnode
;
4506 static int ventoy_parse_injection(VTOY_JSON
*json
, void *p
)
4509 const char *path
= NULL
;
4510 const char *archive
= NULL
;
4511 data_injection
*data
= (data_injection
*)p
;
4512 injection_node
*tail
= NULL
;
4513 injection_node
*pnode
= NULL
;
4514 VTOY_JSON
*node
= NULL
;
4516 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4521 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4523 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4529 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4532 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4535 archive
= vtoy_json_get_string_ex(node
->pstChild
, "archive");
4537 if (path
&& archive
)
4539 pnode
= zalloc(sizeof(injection_node
));
4543 strlcpy(pnode
->path
, path
);
4544 strlcpy(pnode
->archive
, archive
);
4553 data
->list
= tail
= pnode
;
4561 static int ventoy_parse_conf_replace(VTOY_JSON
*json
, void *p
)
4564 const char *path
= NULL
;
4565 const char *org
= NULL
;
4566 const char *new = NULL
;
4567 data_conf_replace
*data
= (data_conf_replace
*)p
;
4568 conf_replace_node
*tail
= NULL
;
4569 conf_replace_node
*pnode
= NULL
;
4570 VTOY_JSON
*node
= NULL
;
4572 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4577 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4579 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4584 path
= vtoy_json_get_string_ex(node
->pstChild
, "iso");
4585 org
= vtoy_json_get_string_ex(node
->pstChild
, "org");
4586 new = vtoy_json_get_string_ex(node
->pstChild
, "new");
4589 vtoy_json_get_int(node
->pstChild
, "img", &img
);
4591 if (path
&& org
&& new)
4593 pnode
= zalloc(sizeof(conf_replace_node
));
4596 strlcpy(pnode
->path
, path
);
4597 strlcpy(pnode
->org
, org
);
4598 strlcpy(pnode
->new, new);
4611 data
->list
= tail
= pnode
;
4619 static int ventoy_parse_password(VTOY_JSON
*json
, void *p
)
4622 const char *bootpwd
= NULL
;
4623 const char *isopwd
= NULL
;
4624 const char *wimpwd
= NULL
;
4625 const char *imgpwd
= NULL
;
4626 const char *efipwd
= NULL
;
4627 const char *vhdpwd
= NULL
;
4628 const char *vtoypwd
= NULL
;
4629 const char *path
= NULL
;
4630 const char *pwd
= NULL
;
4631 data_password
*data
= (data_password
*)p
;
4632 menu_password
*tail
= NULL
;
4633 menu_password
*pnode
= NULL
;
4634 VTOY_JSON
*node
= NULL
;
4635 VTOY_JSON
*menupwd
= NULL
;
4637 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
4642 bootpwd
= vtoy_json_get_string_ex(json
->pstChild
, "bootpwd");
4643 isopwd
= vtoy_json_get_string_ex(json
->pstChild
, "isopwd");
4644 wimpwd
= vtoy_json_get_string_ex(json
->pstChild
, "wimpwd");
4645 imgpwd
= vtoy_json_get_string_ex(json
->pstChild
, "imgpwd");
4646 efipwd
= vtoy_json_get_string_ex(json
->pstChild
, "efipwd");
4647 vhdpwd
= vtoy_json_get_string_ex(json
->pstChild
, "vhdpwd");
4648 vtoypwd
= vtoy_json_get_string_ex(json
->pstChild
, "vtoypwd");
4651 if (bootpwd
) strlcpy(data
->bootpwd
, bootpwd
);
4652 if (isopwd
) strlcpy(data
->isopwd
, isopwd
);
4653 if (wimpwd
) strlcpy(data
->wimpwd
, wimpwd
);
4654 if (imgpwd
) strlcpy(data
->imgpwd
, imgpwd
);
4655 if (efipwd
) strlcpy(data
->efipwd
, efipwd
);
4656 if (vhdpwd
) strlcpy(data
->vhdpwd
, vhdpwd
);
4657 if (vtoypwd
) strlcpy(data
->vtoypwd
, vtoypwd
);
4660 menupwd
= vtoy_json_find_item(json
->pstChild
, JSON_TYPE_ARRAY
, "menupwd");
4666 for (node
= menupwd
->pstChild
; node
; node
= node
->pstNext
)
4668 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4674 path
= vtoy_json_get_string_ex(node
->pstChild
, "file");
4677 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4680 pwd
= vtoy_json_get_string_ex(node
->pstChild
, "pwd");
4684 pnode
= zalloc(sizeof(menu_password
));
4688 strlcpy(pnode
->path
, path
);
4689 strlcpy(pnode
->pwd
, pwd
);
4698 data
->list
= tail
= pnode
;
4707 static int ventoy_parse_image_list_real(VTOY_JSON
*json
, int type
, void *p
)
4709 VTOY_JSON
*node
= NULL
;
4710 data_image_list
*data
= (data_image_list
*)p
;
4711 path_node
*tail
= NULL
;
4712 path_node
*pnode
= NULL
;
4714 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4721 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4723 if (node
->enDataType
== JSON_TYPE_STRING
)
4725 pnode
= zalloc(sizeof(path_node
));
4728 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
4736 data
->list
= tail
= pnode
;
4744 static int ventoy_parse_image_blacklist(VTOY_JSON
*json
, void *p
)
4746 return ventoy_parse_image_list_real(json
, 1, p
);
4748 static int ventoy_parse_image_list(VTOY_JSON
*json
, void *p
)
4750 return ventoy_parse_image_list_real(json
, 0, p
);
4753 static int ventoy_parse_auto_memdisk(VTOY_JSON
*json
, void *p
)
4755 VTOY_JSON
*node
= NULL
;
4756 data_auto_memdisk
*data
= (data_auto_memdisk
*)p
;
4757 path_node
*tail
= NULL
;
4758 path_node
*pnode
= NULL
;
4760 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4765 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4767 if (node
->enDataType
== JSON_TYPE_STRING
)
4769 pnode
= zalloc(sizeof(path_node
));
4772 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
4780 data
->list
= tail
= pnode
;
4788 static int ventoy_parse_dud(VTOY_JSON
*json
, void *p
)
4791 const char *path
= NULL
;
4792 const char *file
= NULL
;
4793 data_dud
*data
= (data_dud
*)p
;
4794 dud_node
*tail
= NULL
;
4795 dud_node
*pnode
= NULL
;
4796 path_node
*pathnode
= NULL
;
4797 path_node
*pathtail
= NULL
;
4798 VTOY_JSON
*node
= NULL
;
4799 VTOY_JSON
*filelist
= NULL
;
4800 VTOY_JSON
*filenode
= NULL
;
4802 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4807 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4809 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4814 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4820 file
= vtoy_json_get_string_ex(node
->pstChild
, "dud");
4823 pnode
= zalloc(sizeof(dud_node
));
4826 strlcpy(pnode
->path
, path
);
4828 pathnode
= zalloc(sizeof(path_node
));
4831 strlcpy(pathnode
->path
, file
);
4832 pnode
->list
= pathnode
;
4846 data
->list
= tail
= pnode
;
4853 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "dud");
4859 pnode
= zalloc(sizeof(dud_node
));
4865 strlcpy(pnode
->path
, path
);
4867 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4869 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4874 pathnode
= zalloc(sizeof(path_node
));
4877 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4882 pathtail
->next
= pathnode
;
4883 pathtail
= pathnode
;
4887 pnode
->list
= pathtail
= pathnode
;
4905 data
->list
= tail
= pnode
;
4919 static int ventoy_load_old_json(const char *filename
)
4924 char *buffer
= NULL
;
4925 unsigned char *start
= NULL
;
4926 VTOY_JSON
*json
= NULL
;
4927 VTOY_JSON
*node
= NULL
;
4928 VTOY_JSON
*next
= NULL
;
4930 ret
= ventoy_read_file_to_buf(filename
, 4, (void **)&buffer
, &buflen
);
4933 vlog("Failed to read old ventoy.json file.\n");
4938 start
= (unsigned char *)buffer
;
4940 if (start
[0] == 0xef && start
[1] == 0xbb && start
[2] == 0xbf)
4944 else if ((start
[0] == 0xff && start
[1] == 0xfe) || (start
[0] == 0xfe && start
[1] == 0xff))
4946 vlog("ventoy.json is in UCS-2 encoding, ignore it.\n");
4951 json
= vtoy_json_create();
4958 if (vtoy_json_parse_ex(json
, buffer
+ offset
, buflen
- offset
) == JSON_SUCCESS
)
4960 vlog("parse ventoy.json success\n");
4962 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4963 for (next
= node
->pstNext
; next
; next
= next
->pstNext
)
4965 if (node
->pcName
&& next
->pcName
&& strcmp(node
->pcName
, next
->pcName
) == 0)
4967 vlog("ventoy.json contains duplicate key <%s>.\n", node
->pcName
);
4968 g_sysinfo
.invalid_config
= 1;
4974 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4976 ventoy_parse_json(control
);
4977 ventoy_parse_json(theme
);
4978 ventoy_parse_json(menu_alias
);
4979 ventoy_parse_json(menu_tip
);
4980 ventoy_parse_json(menu_class
);
4981 ventoy_parse_json(auto_install
);
4982 ventoy_parse_json(persistence
);
4983 ventoy_parse_json(injection
);
4984 ventoy_parse_json(conf_replace
);
4985 ventoy_parse_json(password
);
4986 ventoy_parse_json(image_list
);
4987 ventoy_parse_json(image_blacklist
);
4988 ventoy_parse_json(auto_memdisk
);
4989 ventoy_parse_json(dud
);
4994 vlog("ventoy.json has syntax error.\n");
4995 g_sysinfo
.syntax_error
= 1;
5000 vtoy_json_destroy(json
);
5007 int ventoy_http_start(const char *ip
, const char *port
)
5012 char backupname
[128];
5013 struct mg_callbacks callbacks
;
5014 const char *options
[] =
5016 "listening_ports", "24681",
5017 "document_root", "www",
5018 "index_files", "index.html",
5019 "num_threads", "16",
5020 "error_log_file", LOG_FILE
,
5021 "request_timeout_ms", "10000",
5025 for (i
= 0; i
<= bios_max
; i
++)
5027 ventoy_data_default_control(g_data_control
+ i
);
5028 ventoy_data_default_theme(g_data_theme
+ i
);
5029 ventoy_data_default_menu_alias(g_data_menu_alias
+ i
);
5030 ventoy_data_default_menu_class(g_data_menu_class
+ i
);
5031 ventoy_data_default_menu_tip(g_data_menu_tip
+ i
);
5032 ventoy_data_default_auto_install(g_data_auto_install
+ i
);
5033 ventoy_data_default_persistence(g_data_persistence
+ i
);
5034 ventoy_data_default_injection(g_data_injection
+ i
);
5035 ventoy_data_default_conf_replace(g_data_conf_replace
+ i
);
5036 ventoy_data_default_password(g_data_password
+ i
);
5037 ventoy_data_default_image_list(g_data_image_list
+ i
);
5038 ventoy_data_default_auto_memdisk(g_data_auto_memdisk
+ i
);
5039 ventoy_data_default_dud(g_data_dud
+ i
);
5042 ventoy_get_json_path(filename
, backupname
);
5043 if (ventoy_is_file_exist("%s", filename
))
5045 ventoy_copy_file(filename
, backupname
);
5046 ventoy_load_old_json(filename
);
5051 scnprintf(addr
, sizeof(addr
), "%s:%s", ip
, port
);
5054 memset(&callbacks
, 0, sizeof(callbacks
));
5055 callbacks
.begin_request
= ventoy_request_handler
;
5057 callbacks
.open_file
= ventoy_web_openfile
;
5059 g_ventoy_http_ctx
= mg_start(&callbacks
, NULL
, options
);
5061 ventoy_start_writeback_thread(ventoy_http_writeback
);
5063 return g_ventoy_http_ctx
? 0 : 1;
5066 int ventoy_http_stop(void)
5068 if (g_ventoy_http_ctx
)
5070 mg_stop(g_ventoy_http_ctx
);
5073 ventoy_stop_writeback_thread();
5077 int ventoy_http_init(void)
5082 char *Buffer
= NULL
;
5085 ventoy_read_file_to_buf("www/helplist", 4, (void **)&Buffer
, &BufLen
);
5088 for (i
= 0; i
< BufLen
/ 5; i
++)
5090 memcpy(g_ventoy_help_lang
[i
], Buffer
+ i
* 5, 5);
5091 g_ventoy_help_lang
[i
][5] = 0;
5097 file
= ventoy_tar_find_file("www/helplist");
5100 for (i
= 0; i
< file
->size
/ 5; i
++)
5102 memcpy(g_ventoy_help_lang
[i
], (char *)(file
->addr
) + i
* 5, 5);
5103 g_ventoy_help_lang
[i
][5] = 0;
5108 if (!g_pub_json_buffer
)
5110 g_pub_json_buffer
= malloc(JSON_BUF_MAX
* 2);
5111 g_pub_save_buffer
= g_pub_json_buffer
+ JSON_BUF_MAX
;
5115 pthread_mutex_init(&g_api_mutex
, NULL
);
5119 void ventoy_http_exit(void)
5121 check_free(g_pub_json_buffer
);
5122 g_pub_json_buffer
= NULL
;
5123 g_pub_save_buffer
= NULL
;
5125 pthread_mutex_destroy(&g_api_mutex
);