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 const char *g_ventoy_help_lang
[] =
65 "de_DE", "en_US", "fr_FR", "hr_HR", "id_ID", "pt_PT", "sr_CY", "sr_SR", "tr_TR", "zh_CN",
70 static char g_pub_path
[2 * MAX_PATH
];
71 static data_control g_data_control
[bios_max
+ 1];
72 static data_theme g_data_theme
[bios_max
+ 1];
73 static data_alias g_data_menu_alias
[bios_max
+ 1];
74 static data_tip g_data_menu_tip
[bios_max
+ 1];
75 static data_class g_data_menu_class
[bios_max
+ 1];
76 static data_image_list g_data_image_list
[bios_max
+ 1];
77 static data_image_list
*g_data_image_blacklist
= g_data_image_list
;
78 static data_auto_memdisk g_data_auto_memdisk
[bios_max
+ 1];
79 static data_password g_data_password
[bios_max
+ 1];
80 static data_conf_replace g_data_conf_replace
[bios_max
+ 1];
81 static data_injection g_data_injection
[bios_max
+ 1];
82 static data_auto_install g_data_auto_install
[bios_max
+ 1];
83 static data_persistence g_data_persistence
[bios_max
+ 1];
84 static data_dud g_data_dud
[bios_max
+ 1];
86 static char *g_pub_json_buffer
= NULL
;
87 static char *g_pub_save_buffer
= NULL
;
88 #define JSON_BUFFER g_pub_json_buffer
89 #define JSON_SAVE_BUFFER g_pub_save_buffer
91 static pthread_mutex_t g_api_mutex
;
92 static struct mg_context
*g_ventoy_http_ctx
= NULL
;
94 static int ventoy_is_kbd_valid(const char *key
)
98 for (i
= 0; g_ventoy_kbd_layout
[i
]; i
++)
100 if (strcmp(g_ventoy_kbd_layout
[i
], key
) == 0)
109 static const char * ventoy_real_path(const char *org
)
113 if (g_sysinfo
.pathcase
)
115 scnprintf(g_pub_path
, MAX_PATH
, "%s", org
);
116 count
= ventoy_path_case(g_pub_path
+ 1, 1);
130 static int ventoy_json_result(struct mg_connection
*conn
, const char *err
)
133 "HTTP/1.1 200 OK \r\n"
134 "Content-Type: application/json\r\n"
135 "Content-Length: %d\r\n"
137 (int)strlen(err
), err
);
142 static int ventoy_json_buffer(struct mg_connection
*conn
, const char *json_buf
, int json_len
)
145 "HTTP/1.1 200 OK \r\n"
146 "Content-Type: application/json\r\n"
147 "Content-Length: %d\r\n"
154 static void ventoy_free_path_node_list(path_node
*list
)
156 path_node
*next
= NULL
;
157 path_node
*node
= list
;
167 static path_node
* ventoy_path_node_add_array(VTOY_JSON
*array
)
169 path_node
*head
= NULL
;
170 path_node
*node
= NULL
;
171 path_node
*cur
= NULL
;
172 VTOY_JSON
*item
= NULL
;
174 for (item
= array
->pstChild
; item
; item
= item
->pstNext
)
176 node
= zalloc(sizeof(path_node
));
179 scnprintf(node
->path
, sizeof(node
->path
), "%s", item
->unData
.pcStrVal
);
180 vtoy_list_add(head
, cur
, node
);
187 static int ventoy_check_fuzzy_path(char *path
, int prefix
)
199 pos
= strchr(path
, '*');
202 for (cur
= pos
; *cur
; cur
++)
227 rc
= ventoy_is_directory_exist("%s%s", g_cur_dir
, path
);
231 rc
= ventoy_is_directory_exist("%s", path
);
252 return ventoy_is_file_exist("%s%s", g_cur_dir
, path
);
256 return ventoy_is_file_exist("%s", path
);
261 static int ventoy_path_list_cmp(path_node
*list1
, path_node
*list2
)
263 if (NULL
== list1
&& NULL
== list2
)
267 else if (list1
&& list2
)
269 while (list1
&& list2
)
271 if (strcmp(list1
->path
, list2
->path
))
280 if (list1
== NULL
&& list2
== NULL
)
293 static int ventoy_api_device_info(struct mg_connection
*conn
, VTOY_JSON
*json
)
299 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
300 VTOY_JSON_FMT_OBJ_BEGIN();
302 VTOY_JSON_FMT_STRN("dev_name", g_sysinfo
.cur_model
);
303 VTOY_JSON_FMT_STRN("dev_capacity", g_sysinfo
.cur_capacity
);
304 VTOY_JSON_FMT_STRN("dev_fs", g_sysinfo
.cur_fsname
);
305 VTOY_JSON_FMT_STRN("ventoy_ver", g_sysinfo
.cur_ventoy_ver
);
306 VTOY_JSON_FMT_SINT("part_style", g_sysinfo
.cur_part_style
);
307 VTOY_JSON_FMT_SINT("secure_boot", g_sysinfo
.cur_secureboot
);
309 VTOY_JSON_FMT_OBJ_END();
310 VTOY_JSON_FMT_END(pos
);
312 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
316 static int ventoy_api_sysinfo(struct mg_connection
*conn
, VTOY_JSON
*json
)
322 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
323 VTOY_JSON_FMT_OBJ_BEGIN();
324 VTOY_JSON_FMT_STRN("language", ventoy_get_os_language());
325 VTOY_JSON_FMT_STRN("curdir", g_cur_dir
);
328 VTOY_JSON_FMT_SINT("syntax_error", g_sysinfo
.syntax_error
);
329 g_sysinfo
.syntax_error
= 0;
332 #if defined(_MSC_VER) || defined(WIN32)
333 VTOY_JSON_FMT_STRN("os", "windows");
335 VTOY_JSON_FMT_STRN("os", "linux");
338 VTOY_JSON_FMT_OBJ_END();
339 VTOY_JSON_FMT_END(pos
);
341 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
345 static int ventoy_api_handshake(struct mg_connection
*conn
, VTOY_JSON
*json
)
351 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
352 VTOY_JSON_FMT_OBJ_BEGIN();
353 VTOY_JSON_FMT_SINT("status", 0);
354 VTOY_JSON_FMT_OBJ_END();
355 VTOY_JSON_FMT_END(pos
);
357 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
361 static int ventoy_api_check_exist(struct mg_connection
*conn
, VTOY_JSON
*json
)
366 const char *path
= NULL
;
368 path
= vtoy_json_get_string_ex(json
, "path");
369 vtoy_json_get_int(json
, "dir", &dir
);
375 exist
= ventoy_is_directory_exist("%s", path
);
379 exist
= ventoy_is_file_exist("%s", path
);
383 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
384 VTOY_JSON_FMT_OBJ_BEGIN();
385 VTOY_JSON_FMT_SINT("exist", exist
);
386 VTOY_JSON_FMT_OBJ_END();
387 VTOY_JSON_FMT_END(pos
);
389 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
393 static int ventoy_api_check_exist2(struct mg_connection
*conn
, VTOY_JSON
*json
)
402 const char *path1
= NULL
;
403 const char *path2
= NULL
;
405 path1
= vtoy_json_get_string_ex(json
, "path1");
406 path2
= vtoy_json_get_string_ex(json
, "path2");
407 vtoy_json_get_int(json
, "dir1", &dir1
);
408 vtoy_json_get_int(json
, "dir2", &dir2
);
409 vtoy_json_get_int(json
, "fuzzy1", &fuzzy1
);
410 vtoy_json_get_int(json
, "fuzzy2", &fuzzy2
);
416 exist1
= ventoy_is_directory_exist("%s", path1
);
422 exist1
= ventoy_check_fuzzy_path((char *)path1
, 0);
426 exist1
= ventoy_is_file_exist("%s", path1
);
435 exist2
= ventoy_is_directory_exist("%s", path2
);
441 exist2
= ventoy_check_fuzzy_path((char *)path2
, 0);
445 exist2
= ventoy_is_file_exist("%s", path2
);
450 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
451 VTOY_JSON_FMT_OBJ_BEGIN();
452 VTOY_JSON_FMT_SINT("exist1", exist1
);
453 VTOY_JSON_FMT_SINT("exist2", exist2
);
454 VTOY_JSON_FMT_OBJ_END();
455 VTOY_JSON_FMT_END(pos
);
457 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
461 static int ventoy_api_check_fuzzy(struct mg_connection
*conn
, VTOY_JSON
*json
)
465 const char *path
= NULL
;
467 path
= vtoy_json_get_string_ex(json
, "path");
470 exist
= ventoy_check_fuzzy_path((char *)path
, 0);
473 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
474 VTOY_JSON_FMT_OBJ_BEGIN();
475 VTOY_JSON_FMT_SINT("exist", exist
);
476 VTOY_JSON_FMT_OBJ_END();
477 VTOY_JSON_FMT_END(pos
);
479 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
486 void ventoy_data_default_control(data_control
*data
)
488 memset(data
, 0, sizeof(data_control
));
490 data
->filter_dot_underscore
= 1;
491 data
->max_search_level
= -1;
492 data
->menu_timeout
= 0;
494 strlcpy(data
->default_kbd_layout
, "QWERTY_USA");
495 strlcpy(data
->help_text_language
, "en_US");
498 int ventoy_data_cmp_control(data_control
*data1
, data_control
*data2
)
500 if (data1
->default_menu_mode
!= data2
->default_menu_mode
||
501 data1
->treeview_style
!= data2
->treeview_style
||
502 data1
->filter_dot_underscore
!= data2
->filter_dot_underscore
||
503 data1
->sort_casesensitive
!= data2
->sort_casesensitive
||
504 data1
->max_search_level
!= data2
->max_search_level
||
505 data1
->vhd_no_warning
!= data2
->vhd_no_warning
||
506 data1
->filter_iso
!= data2
->filter_iso
||
507 data1
->filter_wim
!= data2
->filter_wim
||
508 data1
->filter_efi
!= data2
->filter_efi
||
509 data1
->filter_img
!= data2
->filter_img
||
510 data1
->filter_vhd
!= data2
->filter_vhd
||
511 data1
->filter_vtoy
!= data2
->filter_vtoy
||
512 data1
->win11_bypass_check
!= data2
->win11_bypass_check
||
513 data1
->menu_timeout
!= data2
->menu_timeout
)
518 if (strcmp(data1
->default_search_root
, data2
->default_search_root
) ||
519 strcmp(data1
->default_image
, data2
->default_image
) ||
520 strcmp(data1
->default_kbd_layout
, data2
->default_kbd_layout
) ||
521 strcmp(data1
->help_text_language
, data2
->help_text_language
))
529 int ventoy_data_save_control(data_control
*data
, const char *title
, char *buf
, int buflen
)
532 data_control
*def
= g_data_control
+ bios_max
;
534 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
536 VTOY_JSON_FMT_KEY_L(L1
, title
);
537 VTOY_JSON_FMT_ARY_BEGIN_N();
539 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_DEFAULT_MENU_MODE", default_menu_mode
);
540 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_TREE_VIEW_MENU_STYLE", treeview_style
);
541 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILT_DOT_UNDERSCORE_FILE", filter_dot_underscore
);
542 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_SORT_CASE_SENSITIVE", sort_casesensitive
);
544 if (data
->max_search_level
>= 0)
546 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_MAX_SEARCH_LEVEL", max_search_level
);
549 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_VHD_NO_WARNING", vhd_no_warning
);
550 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_ISO", filter_iso
);
551 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_WIM", filter_wim
);
552 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_EFI", filter_efi
);
553 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_IMG", filter_img
);
554 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_VHD", filter_vhd
);
555 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_VTOY", filter_vtoy
);
556 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_WIN11_BYPASS_CHECK", win11_bypass_check
);
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("menu_timeout", ctrl
->menu_timeout
);
602 VTOY_JSON_FMT_STRN("default_kbd_layout", ctrl
->default_kbd_layout
);
603 VTOY_JSON_FMT_STRN("help_text_language", ctrl
->help_text_language
);
606 if (ctrl
->default_search_root
[0] && ventoy_is_directory_exist("%s%s", g_cur_dir
, ctrl
->default_search_root
))
610 VTOY_JSON_FMT_STRN("default_search_root", ctrl
->default_search_root
);
611 VTOY_JSON_FMT_SINT("default_search_root_valid", valid
);
615 if (ctrl
->default_image
[0] && ventoy_is_file_exist("%s%s", g_cur_dir
, ctrl
->default_image
))
619 VTOY_JSON_FMT_STRN("default_image", ctrl
->default_image
);
620 VTOY_JSON_FMT_SINT("default_image_valid", valid
);
622 VTOY_JSON_FMT_KEY("help_list");
623 VTOY_JSON_FMT_ARY_BEGIN();
625 for (i
= 0; g_ventoy_help_lang
[i
]; i
++)
627 VTOY_JSON_FMT_ITEM(g_ventoy_help_lang
[i
]);
629 VTOY_JSON_FMT_ARY_ENDEX();
632 VTOY_JSON_FMT_OBJ_END();
633 VTOY_JSON_FMT_END(pos
);
638 static int ventoy_api_get_control(struct mg_connection
*conn
, VTOY_JSON
*json
)
640 api_get_func(conn
, json
, control
);
644 static int ventoy_api_save_control(struct mg_connection
*conn
, VTOY_JSON
*json
)
648 data_control
*ctrl
= NULL
;
650 vtoy_json_get_int(json
, "index", &index
);
651 ctrl
= g_data_control
+ index
;
653 VTOY_JSON_INT("default_menu_mode", ctrl
->default_menu_mode
);
654 VTOY_JSON_INT("treeview_style", ctrl
->treeview_style
);
655 VTOY_JSON_INT("filter_dot_underscore", ctrl
->filter_dot_underscore
);
656 VTOY_JSON_INT("sort_casesensitive", ctrl
->sort_casesensitive
);
657 VTOY_JSON_INT("max_search_level", ctrl
->max_search_level
);
658 VTOY_JSON_INT("vhd_no_warning", ctrl
->vhd_no_warning
);
659 VTOY_JSON_INT("filter_iso", ctrl
->filter_iso
);
660 VTOY_JSON_INT("filter_wim", ctrl
->filter_wim
);
661 VTOY_JSON_INT("filter_efi", ctrl
->filter_efi
);
662 VTOY_JSON_INT("filter_img", ctrl
->filter_img
);
663 VTOY_JSON_INT("filter_vhd", ctrl
->filter_vhd
);
664 VTOY_JSON_INT("filter_vtoy", ctrl
->filter_vtoy
);
665 VTOY_JSON_INT("win11_bypass_check", ctrl
->win11_bypass_check
);
666 VTOY_JSON_INT("menu_timeout", ctrl
->menu_timeout
);
668 VTOY_JSON_STR("default_image", ctrl
->default_image
);
669 VTOY_JSON_STR("default_search_root", ctrl
->default_search_root
);
670 VTOY_JSON_STR("help_text_language", ctrl
->help_text_language
);
671 VTOY_JSON_STR("default_kbd_layout", ctrl
->default_kbd_layout
);
673 ret
= ventoy_data_save_all();
675 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
683 void ventoy_data_default_theme(data_theme
*data
)
685 memset(data
, 0, sizeof(data_theme
));
686 strlcpy(data
->gfxmode
, "1024x768");
687 scnprintf(data
->ventoy_left
, sizeof(data
->ventoy_left
), "5%%");
688 scnprintf(data
->ventoy_top
, sizeof(data
->ventoy_top
), "95%%");
689 scnprintf(data
->ventoy_color
, sizeof(data
->ventoy_color
), "%s", "#0000ff");
692 int ventoy_data_cmp_theme(data_theme
*data1
, data_theme
*data2
)
694 if (data1
->display_mode
!= data2
->display_mode
||
695 strcmp(data1
->ventoy_left
, data2
->ventoy_left
) ||
696 strcmp(data1
->ventoy_top
, data2
->ventoy_top
) ||
697 strcmp(data1
->gfxmode
, data2
->gfxmode
) ||
698 strcmp(data1
->ventoy_color
, data2
->ventoy_color
)
704 if (ventoy_path_list_cmp(data1
->filelist
, data2
->filelist
))
709 if (ventoy_path_list_cmp(data1
->fontslist
, data2
->fontslist
))
718 int ventoy_data_save_theme(data_theme
*data
, const char *title
, char *buf
, int buflen
)
721 path_node
*node
= NULL
;
722 data_theme
*def
= g_data_theme
+ bios_max
;
724 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
726 VTOY_JSON_FMT_KEY_L(L1
, title
);
727 VTOY_JSON_FMT_OBJ_BEGIN_N();
731 if (data
->filelist
->next
)
733 VTOY_JSON_FMT_KEY_L(L2
, "file");
734 VTOY_JSON_FMT_ARY_BEGIN_N();
736 for (node
= data
->filelist
; node
; node
= node
->next
)
738 VTOY_JSON_FMT_ITEM_PATH_LN(L3
, node
->path
);
741 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
743 if (def
->default_file
!= data
->default_file
)
745 VTOY_JSON_FMT_SINT_LN(L2
, "default_file", data
->default_file
);
750 VTOY_JSON_FMT_STRN_PATH_LN(L2
, "file", data
->filelist
->path
);
754 if (data
->display_mode
!= def
->display_mode
)
756 if (display_mode_cli
== data
->display_mode
)
758 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "CLI");
760 else if (display_mode_serial
== data
->display_mode
)
762 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "serial");
764 else if (display_mode_ser_console
== data
->display_mode
)
766 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "serial_console");
770 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "GUI");
774 VTOY_JSON_FMT_DIFF_STRN(L2
, "gfxmode", gfxmode
);
776 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_left", ventoy_left
);
777 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_top", ventoy_top
);
778 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_color", ventoy_color
);
782 VTOY_JSON_FMT_KEY_L(L2
, "fonts");
783 VTOY_JSON_FMT_ARY_BEGIN_N();
785 for (node
= data
->fontslist
; node
; node
= node
->next
)
787 VTOY_JSON_FMT_ITEM_PATH_LN(L3
, node
->path
);
790 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
793 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
794 VTOY_JSON_FMT_END(pos
);
800 int ventoy_data_json_theme(data_theme
*data
, char *buf
, int buflen
)
803 path_node
*node
= NULL
;
805 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
806 VTOY_JSON_FMT_OBJ_BEGIN();
808 VTOY_JSON_FMT_SINT("default_file", data
->default_file
);
809 VTOY_JSON_FMT_SINT("display_mode", data
->display_mode
);
810 VTOY_JSON_FMT_STRN("gfxmode", data
->gfxmode
);
812 VTOY_JSON_FMT_STRN("ventoy_color", data
->ventoy_color
);
813 VTOY_JSON_FMT_STRN("ventoy_left", data
->ventoy_left
);
814 VTOY_JSON_FMT_STRN("ventoy_top", data
->ventoy_top
);
816 VTOY_JSON_FMT_KEY("filelist");
817 VTOY_JSON_FMT_ARY_BEGIN();
818 for (node
= data
->filelist
; node
; node
= node
->next
)
820 VTOY_JSON_FMT_OBJ_BEGIN();
821 VTOY_JSON_FMT_STRN("path", node
->path
);
822 VTOY_JSON_FMT_SINT("valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->path
));
823 VTOY_JSON_FMT_OBJ_ENDEX();
825 VTOY_JSON_FMT_ARY_ENDEX();
827 VTOY_JSON_FMT_KEY("fontslist");
828 VTOY_JSON_FMT_ARY_BEGIN();
829 for (node
= data
->fontslist
; node
; node
= node
->next
)
831 VTOY_JSON_FMT_OBJ_BEGIN();
832 VTOY_JSON_FMT_STRN("path", node
->path
);
833 VTOY_JSON_FMT_SINT("valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->path
));
834 VTOY_JSON_FMT_OBJ_ENDEX();
836 VTOY_JSON_FMT_ARY_ENDEX();
838 VTOY_JSON_FMT_OBJ_END();
839 VTOY_JSON_FMT_END(pos
);
844 static int ventoy_api_get_theme(struct mg_connection
*conn
, VTOY_JSON
*json
)
846 api_get_func(conn
, json
, theme
);
850 static int ventoy_api_save_theme(struct mg_connection
*conn
, VTOY_JSON
*json
)
854 data_theme
*data
= NULL
;
856 vtoy_json_get_int(json
, "index", &index
);
857 data
= g_data_theme
+ index
;
859 VTOY_JSON_INT("default_file", data
->default_file
);
860 VTOY_JSON_INT("display_mode", data
->display_mode
);
861 VTOY_JSON_STR("gfxmode", data
->gfxmode
);
862 VTOY_JSON_STR("ventoy_left", data
->ventoy_left
);
863 VTOY_JSON_STR("ventoy_top", data
->ventoy_top
);
864 VTOY_JSON_STR("ventoy_color", data
->ventoy_color
);
866 ret
= ventoy_data_save_all();
868 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
872 static int ventoy_api_theme_add_file(struct mg_connection
*conn
, VTOY_JSON
*json
)
876 const char *path
= NULL
;
877 path_node
*node
= NULL
;
878 path_node
*cur
= NULL
;
879 data_theme
*data
= NULL
;
881 vtoy_json_get_int(json
, "index", &index
);
882 data
= g_data_theme
+ index
;
884 path
= VTOY_JSON_STR_EX("path");
887 node
= zalloc(sizeof(path_node
));
890 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
892 vtoy_list_add(data
->filelist
, cur
, node
);
896 ret
= ventoy_data_save_all();
898 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
902 static int ventoy_api_theme_del_file(struct mg_connection
*conn
, VTOY_JSON
*json
)
906 const char *path
= NULL
;
907 path_node
*node
= NULL
;
908 path_node
*last
= NULL
;
909 data_theme
*data
= NULL
;
911 vtoy_json_get_int(json
, "index", &index
);
912 data
= g_data_theme
+ index
;
914 path
= VTOY_JSON_STR_EX("path");
917 vtoy_list_del(last
, node
, data
->filelist
, path
);
920 ret
= ventoy_data_save_all();
922 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
927 static int ventoy_api_theme_add_font(struct mg_connection
*conn
, VTOY_JSON
*json
)
931 const char *path
= NULL
;
932 path_node
*node
= NULL
;
933 path_node
*cur
= NULL
;
934 data_theme
*data
= NULL
;
936 vtoy_json_get_int(json
, "index", &index
);
937 data
= g_data_theme
+ index
;
939 path
= VTOY_JSON_STR_EX("path");
942 node
= zalloc(sizeof(path_node
));
945 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
946 vtoy_list_add(data
->fontslist
, cur
, node
);
950 ret
= ventoy_data_save_all();
952 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
957 static int ventoy_api_theme_del_font(struct mg_connection
*conn
, VTOY_JSON
*json
)
961 const char *path
= NULL
;
962 path_node
*node
= NULL
;
963 path_node
*last
= NULL
;
964 data_theme
*data
= NULL
;
966 vtoy_json_get_int(json
, "index", &index
);
967 data
= g_data_theme
+ index
;
969 path
= VTOY_JSON_STR_EX("path");
972 vtoy_list_del(last
, node
, data
->fontslist
, path
);
975 ret
= ventoy_data_save_all();
977 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
984 void ventoy_data_default_menu_alias(data_alias
*data
)
986 memset(data
, 0, sizeof(data_alias
));
989 int ventoy_data_cmp_menu_alias(data_alias
*data1
, data_alias
*data2
)
991 data_alias_node
*list1
= NULL
;
992 data_alias_node
*list2
= NULL
;
994 if (NULL
== data1
->list
&& NULL
== data2
->list
)
998 else if (data1
->list
&& data2
->list
)
1000 list1
= data1
->list
;
1001 list2
= data2
->list
;
1003 while (list1
&& list2
)
1005 if ((list1
->type
!= list2
->type
) ||
1006 strcmp(list1
->path
, list2
->path
) ||
1007 strcmp(list1
->alias
, list2
->alias
))
1012 list1
= list1
->next
;
1013 list2
= list2
->next
;
1016 if (list1
== NULL
&& list2
== NULL
)
1031 int ventoy_data_save_menu_alias(data_alias
*data
, const char *title
, char *buf
, int buflen
)
1034 data_alias_node
*node
= NULL
;
1036 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1038 VTOY_JSON_FMT_KEY_L(L1
, title
);
1039 VTOY_JSON_FMT_ARY_BEGIN_N();
1041 for (node
= data
->list
; node
; node
= node
->next
)
1043 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
1045 if (node
->type
== path_type_file
)
1047 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
1051 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "dir", node
->path
);
1054 VTOY_JSON_FMT_STRN_EX_LN(L3
, "alias", node
->alias
);
1056 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
1059 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1060 VTOY_JSON_FMT_END(pos
);
1066 int ventoy_data_json_menu_alias(data_alias
*data
, char *buf
, int buflen
)
1070 data_alias_node
*node
= NULL
;
1072 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1073 VTOY_JSON_FMT_ARY_BEGIN();
1075 for (node
= data
->list
; node
; node
= node
->next
)
1077 VTOY_JSON_FMT_OBJ_BEGIN();
1079 VTOY_JSON_FMT_UINT("type", node
->type
);
1080 VTOY_JSON_FMT_STRN("path", node
->path
);
1081 if (node
->type
== path_type_file
)
1083 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1087 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1090 VTOY_JSON_FMT_SINT("valid", valid
);
1091 VTOY_JSON_FMT_STRN("alias", node
->alias
);
1093 VTOY_JSON_FMT_OBJ_ENDEX();
1096 VTOY_JSON_FMT_ARY_END();
1097 VTOY_JSON_FMT_END(pos
);
1102 static int ventoy_api_get_alias(struct mg_connection
*conn
, VTOY_JSON
*json
)
1104 api_get_func(conn
, json
, menu_alias
);
1108 static int ventoy_api_save_alias(struct mg_connection
*conn
, VTOY_JSON
*json
)
1111 ret
= ventoy_data_save_all();
1113 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1117 static int ventoy_api_alias_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1121 int type
= path_type_file
;
1122 const char *path
= NULL
;
1123 const char *alias
= NULL
;
1124 data_alias_node
*node
= NULL
;
1125 data_alias_node
*cur
= NULL
;
1126 data_alias
*data
= NULL
;
1128 vtoy_json_get_int(json
, "index", &index
);
1129 data
= g_data_menu_alias
+ index
;
1131 vtoy_json_get_int(json
, "type", &type
);
1133 path
= VTOY_JSON_STR_EX("path");
1134 alias
= VTOY_JSON_STR_EX("alias");
1137 node
= zalloc(sizeof(data_alias_node
));
1141 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1142 scnprintf(node
->alias
, sizeof(node
->alias
), "%s", alias
);
1144 vtoy_list_add(data
->list
, cur
, node
);
1148 ret
= ventoy_data_save_all();
1150 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1154 static int ventoy_api_alias_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1158 const char *path
= NULL
;
1159 data_alias_node
*last
= NULL
;
1160 data_alias_node
*node
= NULL
;
1161 data_alias
*data
= NULL
;
1163 vtoy_json_get_int(json
, "index", &index
);
1164 data
= g_data_menu_alias
+ index
;
1166 path
= VTOY_JSON_STR_EX("path");
1169 vtoy_list_del(last
, node
, data
->list
, path
);
1172 ret
= ventoy_data_save_all();
1174 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1181 void ventoy_data_default_menu_tip(data_tip
*data
)
1183 memset(data
, 0, sizeof(data_tip
));
1185 scnprintf(data
->left
, sizeof(data
->left
), "10%%");
1186 scnprintf(data
->top
, sizeof(data
->top
), "81%%");
1187 scnprintf(data
->color
, sizeof(data
->color
), "%s", "blue");
1190 int ventoy_data_cmp_menu_tip(data_tip
*data1
, data_tip
*data2
)
1192 data_tip_node
*list1
= NULL
;
1193 data_tip_node
*list2
= NULL
;
1195 if (strcmp(data1
->left
, data2
->left
) || strcmp(data1
->top
, data2
->top
) || strcmp(data1
->color
, data2
->color
))
1200 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1204 else if (data1
->list
&& data2
->list
)
1206 list1
= data1
->list
;
1207 list2
= data2
->list
;
1209 while (list1
&& list2
)
1211 if ((list1
->type
!= list2
->type
) ||
1212 strcmp(list1
->path
, list2
->path
) ||
1213 strcmp(list1
->tip
, list2
->tip
))
1218 list1
= list1
->next
;
1219 list2
= list2
->next
;
1222 if (list1
== NULL
&& list2
== NULL
)
1237 int ventoy_data_save_menu_tip(data_tip
*data
, const char *title
, char *buf
, int buflen
)
1240 data_tip_node
*node
= NULL
;
1241 data_tip
*def
= g_data_menu_tip
+ bios_max
;
1243 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1244 VTOY_JSON_FMT_KEY_L(L1
, title
);
1245 VTOY_JSON_FMT_OBJ_BEGIN_N();
1247 VTOY_JSON_FMT_DIFF_STRN(L2
, "left", left
);
1248 VTOY_JSON_FMT_DIFF_STRN(L2
, "top", top
);
1249 VTOY_JSON_FMT_DIFF_STRN(L2
, "color", color
);
1253 VTOY_JSON_FMT_KEY_L(L2
, "tips");
1254 VTOY_JSON_FMT_ARY_BEGIN_N();
1256 for (node
= data
->list
; node
; node
= node
->next
)
1258 VTOY_JSON_FMT_OBJ_BEGIN_LN(L3
);
1260 if (node
->type
== path_type_file
)
1262 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "image", node
->path
);
1266 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "dir", node
->path
);
1268 VTOY_JSON_FMT_STRN_EX_LN(L4
, "tip", node
->tip
);
1270 VTOY_JSON_FMT_OBJ_ENDEX_LN(L3
);
1273 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
1276 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
1278 VTOY_JSON_FMT_END(pos
);
1284 int ventoy_data_json_menu_tip(data_tip
*data
, char *buf
, int buflen
)
1288 data_tip_node
*node
= NULL
;
1290 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1292 VTOY_JSON_FMT_OBJ_BEGIN();
1294 VTOY_JSON_FMT_STRN("left", data
->left
);
1295 VTOY_JSON_FMT_STRN("top", data
->top
);
1296 VTOY_JSON_FMT_STRN("color", data
->color
);
1298 VTOY_JSON_FMT_KEY("tips");
1299 VTOY_JSON_FMT_ARY_BEGIN();
1301 for (node
= data
->list
; node
; node
= node
->next
)
1303 VTOY_JSON_FMT_OBJ_BEGIN();
1305 VTOY_JSON_FMT_UINT("type", node
->type
);
1306 VTOY_JSON_FMT_STRN("path", node
->path
);
1307 if (node
->type
== path_type_file
)
1309 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1313 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1316 VTOY_JSON_FMT_SINT("valid", valid
);
1317 VTOY_JSON_FMT_STRN("tip", node
->tip
);
1319 VTOY_JSON_FMT_OBJ_ENDEX();
1322 VTOY_JSON_FMT_ARY_ENDEX();
1324 VTOY_JSON_FMT_OBJ_END();
1325 VTOY_JSON_FMT_END(pos
);
1330 static int ventoy_api_get_tip(struct mg_connection
*conn
, VTOY_JSON
*json
)
1332 api_get_func(conn
, json
, menu_tip
);
1336 static int ventoy_api_save_tip(struct mg_connection
*conn
, VTOY_JSON
*json
)
1340 data_tip
*data
= NULL
;
1342 vtoy_json_get_int(json
, "index", &index
);
1343 data
= g_data_menu_tip
+ index
;
1345 VTOY_JSON_STR("left", data
->left
);
1346 VTOY_JSON_STR("top", data
->top
);
1347 VTOY_JSON_STR("color", data
->color
);
1349 ret
= ventoy_data_save_all();
1351 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1355 static int ventoy_api_tip_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1359 int type
= path_type_file
;
1360 const char *path
= NULL
;
1361 const char *tip
= NULL
;
1362 data_tip_node
*node
= NULL
;
1363 data_tip_node
*cur
= NULL
;
1364 data_tip
*data
= NULL
;
1366 vtoy_json_get_int(json
, "index", &index
);
1367 data
= g_data_menu_tip
+ index
;
1369 vtoy_json_get_int(json
, "type", &type
);
1371 path
= VTOY_JSON_STR_EX("path");
1372 tip
= VTOY_JSON_STR_EX("tip");
1375 node
= zalloc(sizeof(data_tip_node
));
1379 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1380 scnprintf(node
->tip
, sizeof(node
->tip
), "%s", tip
);
1382 vtoy_list_add(data
->list
, cur
, node
);
1386 ret
= ventoy_data_save_all();
1388 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1392 static int ventoy_api_tip_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1396 const char *path
= NULL
;
1397 data_tip_node
*last
= NULL
;
1398 data_tip_node
*node
= NULL
;
1399 data_tip
*data
= NULL
;
1401 vtoy_json_get_int(json
, "index", &index
);
1402 data
= g_data_menu_tip
+ index
;
1404 path
= VTOY_JSON_STR_EX("path");
1407 vtoy_list_del(last
, node
, data
->list
, path
);
1410 ret
= ventoy_data_save_all();
1412 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1419 void ventoy_data_default_menu_class(data_class
*data
)
1421 memset(data
, 0, sizeof(data_class
));
1424 int ventoy_data_cmp_menu_class(data_class
*data1
, data_class
*data2
)
1426 data_class_node
*list1
= NULL
;
1427 data_class_node
*list2
= NULL
;
1429 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1433 else if (data1
->list
&& data2
->list
)
1435 list1
= data1
->list
;
1436 list2
= data2
->list
;
1438 while (list1
&& list2
)
1440 if ((list1
->type
!= list2
->type
) ||
1441 strcmp(list1
->path
, list2
->path
) ||
1442 strcmp(list1
->class, list2
->class))
1447 list1
= list1
->next
;
1448 list2
= list2
->next
;
1451 if (list1
== NULL
&& list2
== NULL
)
1466 int ventoy_data_save_menu_class(data_class
*data
, const char *title
, char *buf
, int buflen
)
1469 data_class_node
*node
= NULL
;
1471 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1473 VTOY_JSON_FMT_KEY_L(L1
, title
);
1474 VTOY_JSON_FMT_ARY_BEGIN_N();
1476 for (node
= data
->list
; node
; node
= node
->next
)
1478 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
1480 if (node
->type
== class_type_key
)
1482 VTOY_JSON_FMT_STRN_LN(L3
, "key", node
->path
);
1484 else if (node
->type
== class_type_dir
)
1486 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "dir", node
->path
);
1490 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
1492 VTOY_JSON_FMT_STRN_LN(L3
, "class", node
->class);
1494 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
1497 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1498 VTOY_JSON_FMT_END(pos
);
1504 int ventoy_data_json_menu_class(data_class
*data
, char *buf
, int buflen
)
1508 data_class_node
*node
= NULL
;
1510 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1511 VTOY_JSON_FMT_ARY_BEGIN();
1513 for (node
= data
->list
; node
; node
= node
->next
)
1515 VTOY_JSON_FMT_OBJ_BEGIN();
1517 VTOY_JSON_FMT_UINT("type", node
->type
);
1518 VTOY_JSON_FMT_STRN("path", node
->path
);
1520 if (node
->type
== class_type_key
)
1526 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1528 VTOY_JSON_FMT_SINT("valid", valid
);
1530 VTOY_JSON_FMT_STRN("class", node
->class);
1532 VTOY_JSON_FMT_OBJ_ENDEX();
1535 VTOY_JSON_FMT_ARY_END();
1536 VTOY_JSON_FMT_END(pos
);
1542 static int ventoy_api_get_class(struct mg_connection
*conn
, VTOY_JSON
*json
)
1544 api_get_func(conn
, json
, menu_class
);
1548 static int ventoy_api_save_class(struct mg_connection
*conn
, VTOY_JSON
*json
)
1551 ret
= ventoy_data_save_all();
1553 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1557 static int ventoy_api_class_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1561 int type
= class_type_key
;
1562 const char *path
= NULL
;
1563 const char *class = NULL
;
1564 data_class_node
*node
= NULL
;
1565 data_class_node
*cur
= NULL
;
1566 data_class
*data
= NULL
;
1568 vtoy_json_get_int(json
, "index", &index
);
1569 data
= g_data_menu_class
+ index
;
1571 vtoy_json_get_int(json
, "type", &type
);
1573 path
= VTOY_JSON_STR_EX("path");
1574 class = VTOY_JSON_STR_EX("class");
1577 node
= zalloc(sizeof(data_class_node
));
1582 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1583 scnprintf(node
->class, sizeof(node
->class), "%s", class);
1585 vtoy_list_add(data
->list
, cur
, node
);
1589 ret
= ventoy_data_save_all();
1591 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1595 static int ventoy_api_class_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1599 const char *path
= NULL
;
1600 data_class_node
*last
= NULL
;
1601 data_class_node
*node
= NULL
;
1602 data_class
*data
= NULL
;
1604 vtoy_json_get_int(json
, "index", &index
);
1605 data
= g_data_menu_class
+ index
;
1607 path
= VTOY_JSON_STR_EX("path");
1610 vtoy_list_del(last
, node
, data
->list
, path
);
1613 ret
= ventoy_data_save_all();
1615 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1622 void ventoy_data_default_auto_memdisk(data_auto_memdisk
*data
)
1624 memset(data
, 0, sizeof(data_auto_memdisk
));
1627 int ventoy_data_cmp_auto_memdisk(data_auto_memdisk
*data1
, data_auto_memdisk
*data2
)
1629 return ventoy_path_list_cmp(data1
->list
, data2
->list
);
1632 int ventoy_data_save_auto_memdisk(data_auto_memdisk
*data
, const char *title
, char *buf
, int buflen
)
1635 path_node
*node
= NULL
;
1637 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1639 VTOY_JSON_FMT_KEY_L(L1
, title
);
1640 VTOY_JSON_FMT_ARY_BEGIN_N();
1642 for (node
= data
->list
; node
; node
= node
->next
)
1644 VTOY_JSON_FMT_ITEM_PATH_LN(L2
, node
->path
);
1647 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1648 VTOY_JSON_FMT_END(pos
);
1653 int ventoy_data_json_auto_memdisk(data_auto_memdisk
*data
, char *buf
, int buflen
)
1657 path_node
*node
= NULL
;
1659 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1660 VTOY_JSON_FMT_ARY_BEGIN();
1662 for (node
= data
->list
; node
; node
= node
->next
)
1664 VTOY_JSON_FMT_OBJ_BEGIN();
1666 VTOY_JSON_FMT_STRN("path", node
->path
);
1667 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1668 VTOY_JSON_FMT_SINT("valid", valid
);
1670 VTOY_JSON_FMT_OBJ_ENDEX();
1673 VTOY_JSON_FMT_ARY_END();
1674 VTOY_JSON_FMT_END(pos
);
1679 static int ventoy_api_get_auto_memdisk(struct mg_connection
*conn
, VTOY_JSON
*json
)
1681 api_get_func(conn
, json
, auto_memdisk
);
1685 static int ventoy_api_save_auto_memdisk(struct mg_connection
*conn
, VTOY_JSON
*json
)
1689 ret
= ventoy_data_save_all();
1691 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1695 static int ventoy_api_auto_memdisk_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1699 const char *path
= NULL
;
1700 path_node
*node
= NULL
;
1701 path_node
*cur
= NULL
;
1702 data_auto_memdisk
*data
= NULL
;
1704 vtoy_json_get_int(json
, "index", &index
);
1705 data
= g_data_auto_memdisk
+ index
;
1707 path
= VTOY_JSON_STR_EX("path");
1710 node
= zalloc(sizeof(path_node
));
1713 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1714 vtoy_list_add(data
->list
, cur
, node
);
1718 ret
= ventoy_data_save_all();
1720 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1724 static int ventoy_api_auto_memdisk_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1728 const char *path
= NULL
;
1729 path_node
*last
= NULL
;
1730 path_node
*node
= NULL
;
1731 data_auto_memdisk
*data
= NULL
;
1733 vtoy_json_get_int(json
, "index", &index
);
1734 data
= g_data_auto_memdisk
+ index
;
1736 path
= VTOY_JSON_STR_EX("path");
1739 vtoy_list_del(last
, node
, data
->list
, path
);
1742 ret
= ventoy_data_save_all();
1744 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1751 void ventoy_data_default_image_list(data_image_list
*data
)
1753 memset(data
, 0, sizeof(data_image_list
));
1756 int ventoy_data_cmp_image_list(data_image_list
*data1
, data_image_list
*data2
)
1758 if (data1
->type
!= data2
->type
)
1760 if (data1
->list
|| data2
->list
)
1770 return ventoy_path_list_cmp(data1
->list
, data2
->list
);
1773 int ventoy_data_save_image_list(data_image_list
*data
, const char *title
, char *buf
, int buflen
)
1776 path_node
*node
= NULL
;
1785 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1787 if (data
->type
== 0)
1789 VTOY_JSON_FMT_KEY_L(L1
, "image_list");
1793 VTOY_JSON_FMT_KEY_L(L1
, "image_blacklist");
1796 VTOY_JSON_FMT_ARY_BEGIN_N();
1798 for (node
= data
->list
; node
; node
= node
->next
)
1800 VTOY_JSON_FMT_ITEM_PATH_LN(L2
, node
->path
);
1803 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1804 VTOY_JSON_FMT_END(pos
);
1809 int ventoy_data_json_image_list(data_image_list
*data
, char *buf
, int buflen
)
1813 path_node
*node
= NULL
;
1815 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1817 VTOY_JSON_FMT_OBJ_BEGIN();
1818 VTOY_JSON_FMT_SINT("type", data
->type
);
1820 VTOY_JSON_FMT_KEY("list");
1821 VTOY_JSON_FMT_ARY_BEGIN();
1823 for (node
= data
->list
; node
; node
= node
->next
)
1825 VTOY_JSON_FMT_OBJ_BEGIN();
1827 VTOY_JSON_FMT_STRN("path", node
->path
);
1828 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1829 VTOY_JSON_FMT_SINT("valid", valid
);
1831 VTOY_JSON_FMT_OBJ_ENDEX();
1834 VTOY_JSON_FMT_ARY_ENDEX();
1835 VTOY_JSON_FMT_OBJ_END();
1837 VTOY_JSON_FMT_END(pos
);
1842 static int ventoy_api_get_image_list(struct mg_connection
*conn
, VTOY_JSON
*json
)
1844 api_get_func(conn
, json
, image_list
);
1848 static int ventoy_api_save_image_list(struct mg_connection
*conn
, VTOY_JSON
*json
)
1852 data_image_list
*data
= NULL
;
1854 vtoy_json_get_int(json
, "index", &index
);
1855 data
= g_data_image_list
+ index
;
1857 VTOY_JSON_INT("type", data
->type
);
1859 ret
= ventoy_data_save_all();
1861 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1865 static int ventoy_api_image_list_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1869 const char *path
= NULL
;
1870 path_node
*node
= NULL
;
1871 path_node
*cur
= NULL
;
1872 data_image_list
*data
= NULL
;
1874 vtoy_json_get_int(json
, "index", &index
);
1875 data
= g_data_image_list
+ index
;
1877 path
= VTOY_JSON_STR_EX("path");
1880 node
= zalloc(sizeof(path_node
));
1883 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1884 vtoy_list_add(data
->list
, cur
, node
);
1888 ret
= ventoy_data_save_all();
1890 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1894 static int ventoy_api_image_list_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1898 const char *path
= NULL
;
1899 path_node
*last
= NULL
;
1900 path_node
*node
= NULL
;
1901 data_image_list
*data
= NULL
;
1903 vtoy_json_get_int(json
, "index", &index
);
1904 data
= g_data_image_list
+ index
;
1906 path
= VTOY_JSON_STR_EX("path");
1909 vtoy_list_del(last
, node
, data
->list
, path
);
1912 ret
= ventoy_data_save_all();
1914 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1921 void ventoy_data_default_password(data_password
*data
)
1923 memset(data
, 0, sizeof(data_password
));
1926 int ventoy_data_cmp_password(data_password
*data1
, data_password
*data2
)
1928 menu_password
*list1
= NULL
;
1929 menu_password
*list2
= NULL
;
1931 if (strcmp(data1
->bootpwd
, data2
->bootpwd
) ||
1932 strcmp(data1
->isopwd
, data2
->isopwd
) ||
1933 strcmp(data1
->wimpwd
, data2
->wimpwd
) ||
1934 strcmp(data1
->vhdpwd
, data2
->vhdpwd
) ||
1935 strcmp(data1
->imgpwd
, data2
->imgpwd
) ||
1936 strcmp(data1
->efipwd
, data2
->efipwd
) ||
1937 strcmp(data1
->vtoypwd
, data2
->vtoypwd
)
1943 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1947 else if (data1
->list
&& data2
->list
)
1949 list1
= data1
->list
;
1950 list2
= data2
->list
;
1952 while (list1
&& list2
)
1954 if ((list1
->type
!= list2
->type
) || strcmp(list1
->path
, list2
->path
))
1959 list1
= list1
->next
;
1960 list2
= list2
->next
;
1963 if (list1
== NULL
&& list2
== NULL
)
1978 int ventoy_data_save_password(data_password
*data
, const char *title
, char *buf
, int buflen
)
1981 menu_password
*node
= NULL
;
1982 data_password
*def
= g_data_password
+ bios_max
;
1984 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1985 VTOY_JSON_FMT_KEY_L(L1
, title
);
1986 VTOY_JSON_FMT_OBJ_BEGIN_N();
1988 VTOY_JSON_FMT_DIFF_STRN(L2
, "bootpwd", bootpwd
);
1989 VTOY_JSON_FMT_DIFF_STRN(L2
, "isopwd", isopwd
);
1990 VTOY_JSON_FMT_DIFF_STRN(L2
, "wimpwd", wimpwd
);
1991 VTOY_JSON_FMT_DIFF_STRN(L2
, "vhdpwd", vhdpwd
);
1992 VTOY_JSON_FMT_DIFF_STRN(L2
, "imgpwd", imgpwd
);
1993 VTOY_JSON_FMT_DIFF_STRN(L2
, "efipwd", efipwd
);
1994 VTOY_JSON_FMT_DIFF_STRN(L2
, "vtoypwd", vtoypwd
);
1998 VTOY_JSON_FMT_KEY_L(L2
, "menupwd");
1999 VTOY_JSON_FMT_ARY_BEGIN_N();
2001 for (node
= data
->list
; node
; node
= node
->next
)
2003 VTOY_JSON_FMT_OBJ_BEGIN_LN(L3
);
2005 if (node
->type
== 0)
2007 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "file", node
->path
);
2011 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "parent", node
->path
);
2013 VTOY_JSON_FMT_STRN_LN(L4
, "pwd", node
->pwd
);
2015 VTOY_JSON_FMT_OBJ_ENDEX_LN(L3
);
2018 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
2021 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
2023 VTOY_JSON_FMT_END(pos
);
2029 int ventoy_data_json_password(data_password
*data
, char *buf
, int buflen
)
2033 menu_password
*node
= NULL
;
2035 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2037 VTOY_JSON_FMT_OBJ_BEGIN();
2039 VTOY_JSON_FMT_STRN("bootpwd", data
->bootpwd
);
2040 VTOY_JSON_FMT_STRN("isopwd", data
->isopwd
);
2041 VTOY_JSON_FMT_STRN("wimpwd", data
->wimpwd
);
2042 VTOY_JSON_FMT_STRN("vhdpwd", data
->vhdpwd
);
2043 VTOY_JSON_FMT_STRN("imgpwd", data
->imgpwd
);
2044 VTOY_JSON_FMT_STRN("efipwd", data
->efipwd
);
2045 VTOY_JSON_FMT_STRN("vtoypwd", data
->vtoypwd
);
2047 VTOY_JSON_FMT_KEY("list");
2048 VTOY_JSON_FMT_ARY_BEGIN();
2050 for (node
= data
->list
; node
; node
= node
->next
)
2052 VTOY_JSON_FMT_OBJ_BEGIN();
2054 VTOY_JSON_FMT_SINT("type", node
->type
);
2055 VTOY_JSON_FMT_STRN("path", node
->path
);
2056 if (node
->type
== path_type_file
)
2058 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2062 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
2065 VTOY_JSON_FMT_SINT("valid", valid
);
2066 VTOY_JSON_FMT_STRN("pwd", node
->pwd
);
2068 VTOY_JSON_FMT_OBJ_ENDEX();
2071 VTOY_JSON_FMT_ARY_ENDEX();
2073 VTOY_JSON_FMT_OBJ_END();
2074 VTOY_JSON_FMT_END(pos
);
2079 static int ventoy_api_get_password(struct mg_connection
*conn
, VTOY_JSON
*json
)
2081 api_get_func(conn
, json
, password
);
2085 static int ventoy_api_save_password(struct mg_connection
*conn
, VTOY_JSON
*json
)
2089 data_password
*data
= NULL
;
2091 vtoy_json_get_int(json
, "index", &index
);
2092 data
= g_data_password
+ index
;
2094 VTOY_JSON_STR("bootpwd", data
->bootpwd
);
2095 VTOY_JSON_STR("isopwd", data
->isopwd
);
2096 VTOY_JSON_STR("wimpwd", data
->wimpwd
);
2097 VTOY_JSON_STR("vhdpwd", data
->vhdpwd
);
2098 VTOY_JSON_STR("imgpwd", data
->imgpwd
);
2099 VTOY_JSON_STR("efipwd", data
->efipwd
);
2100 VTOY_JSON_STR("vtoypwd", data
->vtoypwd
);
2102 ret
= ventoy_data_save_all();
2104 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2108 static int ventoy_api_password_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2113 const char *path
= NULL
;
2114 const char *pwd
= NULL
;
2115 menu_password
*node
= NULL
;
2116 menu_password
*cur
= NULL
;
2117 data_password
*data
= NULL
;
2119 vtoy_json_get_int(json
, "index", &index
);
2120 data
= g_data_password
+ index
;
2122 vtoy_json_get_int(json
, "type", &type
);
2124 path
= VTOY_JSON_STR_EX("path");
2125 pwd
= VTOY_JSON_STR_EX("pwd");
2128 node
= zalloc(sizeof(menu_password
));
2132 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2133 scnprintf(node
->pwd
, sizeof(node
->pwd
), "%s", pwd
);
2135 vtoy_list_add(data
->list
, cur
, node
);
2139 ret
= ventoy_data_save_all();
2141 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2145 static int ventoy_api_password_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2149 const char *path
= NULL
;
2150 menu_password
*last
= NULL
;
2151 menu_password
*node
= NULL
;
2152 data_password
*data
= NULL
;
2154 vtoy_json_get_int(json
, "index", &index
);
2155 data
= g_data_password
+ index
;
2157 path
= VTOY_JSON_STR_EX("path");
2160 vtoy_list_del(last
, node
, data
->list
, path
);
2163 ret
= ventoy_data_save_all();
2165 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2172 void ventoy_data_default_conf_replace(data_conf_replace
*data
)
2174 memset(data
, 0, sizeof(data_conf_replace
));
2177 int ventoy_data_cmp_conf_replace(data_conf_replace
*data1
, data_conf_replace
*data2
)
2179 conf_replace_node
*list1
= NULL
;
2180 conf_replace_node
*list2
= NULL
;
2182 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2186 else if (data1
->list
&& data2
->list
)
2188 list1
= data1
->list
;
2189 list2
= data2
->list
;
2191 while (list1
&& list2
)
2193 if (list1
->image
!= list2
->image
||
2194 strcmp(list1
->path
, list2
->path
) ||
2195 strcmp(list1
->org
, list2
->org
) ||
2196 strcmp(list1
->new, list2
->new)
2202 list1
= list1
->next
;
2203 list2
= list2
->next
;
2206 if (list1
== NULL
&& list2
== NULL
)
2221 int ventoy_data_save_conf_replace(data_conf_replace
*data
, const char *title
, char *buf
, int buflen
)
2224 conf_replace_node
*node
= NULL
;
2226 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2228 VTOY_JSON_FMT_KEY_L(L1
, title
);
2229 VTOY_JSON_FMT_ARY_BEGIN_N();
2231 for (node
= data
->list
; node
; node
= node
->next
)
2233 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2235 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "iso", node
->path
);
2236 VTOY_JSON_FMT_STRN_LN(L3
, "org", node
->org
);
2237 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "new", node
->new);
2240 VTOY_JSON_FMT_SINT_LN(L3
, "img", node
->image
);
2243 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2246 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2247 VTOY_JSON_FMT_END(pos
);
2253 int ventoy_data_json_conf_replace(data_conf_replace
*data
, char *buf
, int buflen
)
2256 conf_replace_node
*node
= NULL
;
2258 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2259 VTOY_JSON_FMT_ARY_BEGIN();
2261 for (node
= data
->list
; node
; node
= node
->next
)
2263 VTOY_JSON_FMT_OBJ_BEGIN();
2265 VTOY_JSON_FMT_STRN("path", node
->path
);
2266 VTOY_JSON_FMT_SINT("valid", ventoy_check_fuzzy_path(node
->path
, 1));
2267 VTOY_JSON_FMT_STRN("org", node
->org
);
2268 VTOY_JSON_FMT_STRN("new", node
->new);
2269 VTOY_JSON_FMT_SINT("new_valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->new));
2270 VTOY_JSON_FMT_SINT("img", node
->image
);
2272 VTOY_JSON_FMT_OBJ_ENDEX();
2275 VTOY_JSON_FMT_ARY_END();
2276 VTOY_JSON_FMT_END(pos
);
2281 static int ventoy_api_get_conf_replace(struct mg_connection
*conn
, VTOY_JSON
*json
)
2283 api_get_func(conn
, json
, conf_replace
);
2287 static int ventoy_api_save_conf_replace(struct mg_connection
*conn
, VTOY_JSON
*json
)
2290 ret
= ventoy_data_save_all();
2292 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2296 static int ventoy_api_conf_replace_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2301 const char *path
= NULL
;
2302 const char *org
= NULL
;
2303 const char *new = NULL
;
2304 conf_replace_node
*node
= NULL
;
2305 conf_replace_node
*cur
= NULL
;
2306 data_conf_replace
*data
= NULL
;
2308 vtoy_json_get_int(json
, "img", &image
);
2310 vtoy_json_get_int(json
, "index", &index
);
2311 data
= g_data_conf_replace
+ index
;
2313 path
= VTOY_JSON_STR_EX("path");
2314 org
= VTOY_JSON_STR_EX("org");
2315 new = VTOY_JSON_STR_EX("new");
2316 if (path
&& org
&& new)
2318 node
= zalloc(sizeof(conf_replace_node
));
2321 node
->image
= image
;
2322 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2323 scnprintf(node
->org
, sizeof(node
->org
), "%s", org
);
2324 scnprintf(node
->new, sizeof(node
->new), "%s", new);
2326 vtoy_list_add(data
->list
, cur
, node
);
2330 ret
= ventoy_data_save_all();
2332 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2336 static int ventoy_api_conf_replace_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2340 const char *path
= NULL
;
2341 conf_replace_node
*last
= NULL
;
2342 conf_replace_node
*node
= NULL
;
2343 data_conf_replace
*data
= NULL
;
2345 vtoy_json_get_int(json
, "index", &index
);
2346 data
= g_data_conf_replace
+ index
;
2348 path
= VTOY_JSON_STR_EX("path");
2351 vtoy_list_del(last
, node
, data
->list
, path
);
2354 ret
= ventoy_data_save_all();
2356 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2364 void ventoy_data_default_dud(data_dud
*data
)
2366 memset(data
, 0, sizeof(data_dud
));
2369 int ventoy_data_cmp_dud(data_dud
*data1
, data_dud
*data2
)
2371 dud_node
*list1
= NULL
;
2372 dud_node
*list2
= NULL
;
2374 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2378 else if (data1
->list
&& data2
->list
)
2380 list1
= data1
->list
;
2381 list2
= data2
->list
;
2383 while (list1
&& list2
)
2385 if (strcmp(list1
->path
, list2
->path
))
2390 /* no need to compare dud list with default */
2391 list1
= list1
->next
;
2392 list2
= list2
->next
;
2395 if (list1
== NULL
&& list2
== NULL
)
2410 int ventoy_data_save_dud(data_dud
*data
, const char *title
, char *buf
, int buflen
)
2413 dud_node
*node
= NULL
;
2414 path_node
*pathnode
= NULL
;
2416 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2418 VTOY_JSON_FMT_KEY_L(L1
, title
);
2419 VTOY_JSON_FMT_ARY_BEGIN_N();
2421 for (node
= data
->list
; node
; node
= node
->next
)
2423 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2424 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
2426 VTOY_JSON_FMT_KEY_L(L3
, "dud");
2427 VTOY_JSON_FMT_ARY_BEGIN_N();
2428 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2430 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
2432 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
2434 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2437 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2438 VTOY_JSON_FMT_END(pos
);
2444 int ventoy_data_json_dud(data_dud
*data
, char *buf
, int buflen
)
2448 dud_node
*node
= NULL
;
2449 path_node
*pathnode
= NULL
;
2451 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2452 VTOY_JSON_FMT_ARY_BEGIN();
2454 for (node
= data
->list
; node
; node
= node
->next
)
2456 VTOY_JSON_FMT_OBJ_BEGIN();
2458 VTOY_JSON_FMT_STRN("path", node
->path
);
2459 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2460 VTOY_JSON_FMT_SINT("valid", valid
);
2463 VTOY_JSON_FMT_KEY("list");
2464 VTOY_JSON_FMT_ARY_BEGIN();
2465 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2467 VTOY_JSON_FMT_OBJ_BEGIN();
2468 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
2470 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
2471 VTOY_JSON_FMT_SINT("valid", valid
);
2472 VTOY_JSON_FMT_OBJ_ENDEX();
2474 VTOY_JSON_FMT_ARY_ENDEX();
2477 VTOY_JSON_FMT_OBJ_ENDEX();
2480 VTOY_JSON_FMT_ARY_END();
2481 VTOY_JSON_FMT_END(pos
);
2486 static int ventoy_api_get_dud(struct mg_connection
*conn
, VTOY_JSON
*json
)
2488 api_get_func(conn
, json
, dud
);
2492 static int ventoy_api_save_dud(struct mg_connection
*conn
, VTOY_JSON
*json
)
2495 ret
= ventoy_data_save_all();
2497 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2502 static int ventoy_api_dud_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2506 const char *path
= NULL
;
2507 dud_node
*node
= NULL
;
2508 dud_node
*cur
= NULL
;
2509 data_dud
*data
= NULL
;
2510 VTOY_JSON
*array
= NULL
;
2512 vtoy_json_get_int(json
, "index", &index
);
2513 data
= g_data_dud
+ index
;
2515 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "dud");
2516 path
= VTOY_JSON_STR_EX("path");
2519 node
= zalloc(sizeof(dud_node
));
2522 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2523 node
->list
= ventoy_path_node_add_array(array
);
2525 vtoy_list_add(data
->list
, cur
, node
);
2529 ret
= ventoy_data_save_all();
2531 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2535 static int ventoy_api_dud_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2539 const char *path
= NULL
;
2540 dud_node
*last
= NULL
;
2541 dud_node
*node
= NULL
;
2542 data_dud
*data
= NULL
;
2544 vtoy_json_get_int(json
, "index", &index
);
2545 data
= g_data_dud
+ index
;
2547 path
= VTOY_JSON_STR_EX("path");
2550 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
2553 ret
= ventoy_data_save_all();
2555 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2560 static int ventoy_api_dud_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2564 const char *path
= NULL
;
2565 const char *outpath
= NULL
;
2566 path_node
*pcur
= NULL
;
2567 path_node
*pnode
= NULL
;
2568 dud_node
*node
= NULL
;
2569 data_dud
*data
= NULL
;
2571 vtoy_json_get_int(json
, "index", &index
);
2572 data
= g_data_dud
+ index
;
2574 path
= VTOY_JSON_STR_EX("path");
2575 outpath
= VTOY_JSON_STR_EX("outpath");
2576 if (path
&& outpath
)
2578 for (node
= data
->list
; node
; node
= node
->next
)
2580 if (strcmp(outpath
, node
->path
) == 0)
2582 pnode
= zalloc(sizeof(path_node
));
2585 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
2586 vtoy_list_add(node
->list
, pcur
, pnode
);
2594 ret
= ventoy_data_save_all();
2596 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2600 static int ventoy_api_dud_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2604 const char *path
= NULL
;
2605 const char *outpath
= NULL
;
2606 path_node
*plast
= NULL
;
2607 path_node
*pnode
= NULL
;
2608 dud_node
*node
= NULL
;
2609 data_dud
*data
= NULL
;
2611 vtoy_json_get_int(json
, "index", &index
);
2612 data
= g_data_dud
+ index
;
2614 path
= VTOY_JSON_STR_EX("path");
2615 outpath
= VTOY_JSON_STR_EX("outpath");
2616 if (path
&& outpath
)
2618 for (node
= data
->list
; node
; node
= node
->next
)
2620 if (strcmp(outpath
, node
->path
) == 0)
2622 vtoy_list_del(plast
, pnode
, node
->list
, path
);
2628 ret
= ventoy_data_save_all();
2630 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2638 void ventoy_data_default_auto_install(data_auto_install
*data
)
2640 memset(data
, 0, sizeof(data_auto_install
));
2643 int ventoy_data_cmp_auto_install(data_auto_install
*data1
, data_auto_install
*data2
)
2645 auto_install_node
*list1
= NULL
;
2646 auto_install_node
*list2
= NULL
;
2648 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2652 else if (data1
->list
&& data2
->list
)
2654 list1
= data1
->list
;
2655 list2
= data2
->list
;
2657 while (list1
&& list2
)
2659 if (list1
->timeout
!= list2
->timeout
||
2660 list1
->autosel
!= list2
->autosel
||
2661 strcmp(list1
->path
, list2
->path
))
2666 /* no need to compare auto install list with default */
2667 list1
= list1
->next
;
2668 list2
= list2
->next
;
2671 if (list1
== NULL
&& list2
== NULL
)
2686 int ventoy_data_save_auto_install(data_auto_install
*data
, const char *title
, char *buf
, int buflen
)
2689 auto_install_node
*node
= NULL
;
2690 path_node
*pathnode
= NULL
;
2692 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2694 VTOY_JSON_FMT_KEY_L(L1
, title
);
2695 VTOY_JSON_FMT_ARY_BEGIN_N();
2697 for (node
= data
->list
; node
; node
= node
->next
)
2699 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2700 if (node
->type
== 0)
2702 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
2706 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
2710 VTOY_JSON_FMT_KEY_L(L3
, "template");
2711 VTOY_JSON_FMT_ARY_BEGIN_N();
2712 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2714 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
2716 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
2718 if (node
->timeouten
)
2720 VTOY_JSON_FMT_SINT_LN(L3
, "timeout", node
->timeout
);
2723 if (node
->autoselen
)
2725 VTOY_JSON_FMT_SINT_LN(L3
, "autosel", node
->autosel
);
2728 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2731 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2732 VTOY_JSON_FMT_END(pos
);
2738 int ventoy_data_json_auto_install(data_auto_install
*data
, char *buf
, int buflen
)
2742 auto_install_node
*node
= NULL
;
2743 path_node
*pathnode
= NULL
;
2745 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2746 VTOY_JSON_FMT_ARY_BEGIN();
2748 for (node
= data
->list
; node
; node
= node
->next
)
2750 VTOY_JSON_FMT_OBJ_BEGIN();
2752 VTOY_JSON_FMT_STRN("path", node
->path
);
2754 if (node
->type
== 0)
2756 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2760 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
2762 VTOY_JSON_FMT_SINT("valid", valid
);
2763 VTOY_JSON_FMT_SINT("type", node
->type
);
2765 VTOY_JSON_FMT_BOOL("timeouten", node
->timeouten
);
2766 VTOY_JSON_FMT_BOOL("autoselen", node
->autoselen
);
2768 VTOY_JSON_FMT_SINT("autosel", node
->autosel
);
2769 VTOY_JSON_FMT_SINT("timeout", node
->timeout
);
2771 VTOY_JSON_FMT_KEY("list");
2772 VTOY_JSON_FMT_ARY_BEGIN();
2773 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2775 VTOY_JSON_FMT_OBJ_BEGIN();
2776 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
2778 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
2779 VTOY_JSON_FMT_SINT("valid", valid
);
2780 VTOY_JSON_FMT_OBJ_ENDEX();
2782 VTOY_JSON_FMT_ARY_ENDEX();
2785 VTOY_JSON_FMT_OBJ_ENDEX();
2788 VTOY_JSON_FMT_ARY_END();
2789 VTOY_JSON_FMT_END(pos
);
2794 static int ventoy_api_get_auto_install(struct mg_connection
*conn
, VTOY_JSON
*json
)
2796 api_get_func(conn
, json
, auto_install
);
2800 static int ventoy_api_save_auto_install(struct mg_connection
*conn
, VTOY_JSON
*json
)
2806 uint8_t timeouten
= 0;
2807 uint8_t autoselen
= 0;
2808 auto_install_node
*node
= NULL
;
2809 data_auto_install
*data
= NULL
;
2811 vtoy_json_get_int(json
, "index", &index
);
2812 vtoy_json_get_int(json
, "id", &id
);
2814 vtoy_json_get_bool(json
, "timeouten", &timeouten
);
2815 vtoy_json_get_bool(json
, "autoselen", &autoselen
);
2817 data
= g_data_auto_install
+ index
;
2821 for (node
= data
->list
; node
; node
= node
->next
)
2825 node
->timeouten
= (int)timeouten
;
2826 node
->autoselen
= (int)autoselen
;
2827 VTOY_JSON_INT("timeout", node
->timeout
);
2828 VTOY_JSON_INT("autosel", node
->autosel
);
2834 ret
= ventoy_data_save_all();
2836 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2841 static int ventoy_api_auto_install_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2846 const char *path
= NULL
;
2847 auto_install_node
*node
= NULL
;
2848 auto_install_node
*cur
= NULL
;
2849 data_auto_install
*data
= NULL
;
2850 VTOY_JSON
*array
= NULL
;
2852 vtoy_json_get_int(json
, "type", &type
);
2853 vtoy_json_get_int(json
, "index", &index
);
2854 data
= g_data_auto_install
+ index
;
2856 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "template");
2857 path
= VTOY_JSON_STR_EX("path");
2860 node
= zalloc(sizeof(auto_install_node
));
2864 node
->timeouten
= 0;
2865 node
->autoselen
= 0;
2868 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2869 node
->list
= ventoy_path_node_add_array(array
);
2871 vtoy_list_add(data
->list
, cur
, node
);
2875 ret
= ventoy_data_save_all();
2877 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2881 static int ventoy_api_auto_install_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2885 const char *path
= NULL
;
2886 auto_install_node
*last
= NULL
;
2887 auto_install_node
*node
= NULL
;
2888 data_auto_install
*data
= NULL
;
2890 vtoy_json_get_int(json
, "index", &index
);
2891 data
= g_data_auto_install
+ index
;
2893 path
= VTOY_JSON_STR_EX("path");
2896 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
2899 ret
= ventoy_data_save_all();
2901 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2905 static int ventoy_api_auto_install_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2909 const char *path
= NULL
;
2910 const char *outpath
= NULL
;
2911 path_node
*pcur
= NULL
;
2912 path_node
*pnode
= NULL
;
2913 auto_install_node
*node
= NULL
;
2914 data_auto_install
*data
= NULL
;
2916 vtoy_json_get_int(json
, "index", &index
);
2917 data
= g_data_auto_install
+ index
;
2919 path
= VTOY_JSON_STR_EX("path");
2920 outpath
= VTOY_JSON_STR_EX("outpath");
2921 if (path
&& outpath
)
2923 for (node
= data
->list
; node
; node
= node
->next
)
2925 if (strcmp(outpath
, node
->path
) == 0)
2927 pnode
= zalloc(sizeof(path_node
));
2930 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
2931 vtoy_list_add(node
->list
, pcur
, pnode
);
2939 ret
= ventoy_data_save_all();
2941 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2945 static int ventoy_api_auto_install_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2949 const char *path
= NULL
;
2950 const char *outpath
= NULL
;
2951 path_node
*plast
= NULL
;
2952 path_node
*pnode
= NULL
;
2953 auto_install_node
*node
= NULL
;
2954 data_auto_install
*data
= NULL
;
2956 vtoy_json_get_int(json
, "index", &index
);
2957 data
= g_data_auto_install
+ index
;
2959 path
= VTOY_JSON_STR_EX("path");
2960 outpath
= VTOY_JSON_STR_EX("outpath");
2961 if (path
&& outpath
)
2963 for (node
= data
->list
; node
; node
= node
->next
)
2965 if (strcmp(outpath
, node
->path
) == 0)
2967 vtoy_list_del(plast
, pnode
, node
->list
, path
);
2973 ret
= ventoy_data_save_all();
2975 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2984 void ventoy_data_default_persistence(data_persistence
*data
)
2986 memset(data
, 0, sizeof(data_persistence
));
2989 int ventoy_data_cmp_persistence(data_persistence
*data1
, data_persistence
*data2
)
2991 persistence_node
*list1
= NULL
;
2992 persistence_node
*list2
= NULL
;
2994 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2998 else if (data1
->list
&& data2
->list
)
3000 list1
= data1
->list
;
3001 list2
= data2
->list
;
3003 while (list1
&& list2
)
3005 if (list1
->timeout
!= list2
->timeout
||
3006 list1
->autosel
!= list2
->autosel
||
3007 strcmp(list1
->path
, list2
->path
))
3012 /* no need to compare auto install list with default */
3013 list1
= list1
->next
;
3014 list2
= list2
->next
;
3017 if (list1
== NULL
&& list2
== NULL
)
3032 int ventoy_data_save_persistence(data_persistence
*data
, const char *title
, char *buf
, int buflen
)
3035 persistence_node
*node
= NULL
;
3036 path_node
*pathnode
= NULL
;
3038 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3040 VTOY_JSON_FMT_KEY_L(L1
, title
);
3041 VTOY_JSON_FMT_ARY_BEGIN_N();
3043 for (node
= data
->list
; node
; node
= node
->next
)
3045 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
3046 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
3047 VTOY_JSON_FMT_KEY_L(L3
, "backend");
3048 VTOY_JSON_FMT_ARY_BEGIN_N();
3049 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
3051 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
3053 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
3055 if (node
->timeouten
)
3057 VTOY_JSON_FMT_SINT_LN(L3
, "timeout", node
->timeout
);
3060 if (node
->autoselen
)
3062 VTOY_JSON_FMT_SINT_LN(L3
, "autosel", node
->autosel
);
3065 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
3068 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
3069 VTOY_JSON_FMT_END(pos
);
3075 int ventoy_data_json_persistence(data_persistence
*data
, char *buf
, int buflen
)
3079 persistence_node
*node
= NULL
;
3080 path_node
*pathnode
= NULL
;
3082 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3083 VTOY_JSON_FMT_ARY_BEGIN();
3085 for (node
= data
->list
; node
; node
= node
->next
)
3087 VTOY_JSON_FMT_OBJ_BEGIN();
3089 VTOY_JSON_FMT_STRN("path", node
->path
);
3091 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
3092 VTOY_JSON_FMT_SINT("valid", valid
);
3093 VTOY_JSON_FMT_SINT("type", node
->type
);
3095 VTOY_JSON_FMT_BOOL("timeouten", node
->timeouten
);
3096 VTOY_JSON_FMT_BOOL("autoselen", node
->autoselen
);
3098 VTOY_JSON_FMT_SINT("autosel", node
->autosel
);
3099 VTOY_JSON_FMT_SINT("timeout", node
->timeout
);
3101 VTOY_JSON_FMT_KEY("list");
3102 VTOY_JSON_FMT_ARY_BEGIN();
3103 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
3105 VTOY_JSON_FMT_OBJ_BEGIN();
3106 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
3108 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
3109 VTOY_JSON_FMT_SINT("valid", valid
);
3110 VTOY_JSON_FMT_OBJ_ENDEX();
3112 VTOY_JSON_FMT_ARY_ENDEX();
3115 VTOY_JSON_FMT_OBJ_ENDEX();
3118 VTOY_JSON_FMT_ARY_END();
3119 VTOY_JSON_FMT_END(pos
);
3124 static int ventoy_api_get_persistence(struct mg_connection
*conn
, VTOY_JSON
*json
)
3126 api_get_func(conn
, json
, persistence
);
3130 static int ventoy_api_save_persistence(struct mg_connection
*conn
, VTOY_JSON
*json
)
3136 uint8_t timeouten
= 0;
3137 uint8_t autoselen
= 0;
3138 persistence_node
*node
= NULL
;
3139 data_persistence
*data
= NULL
;
3141 vtoy_json_get_int(json
, "index", &index
);
3142 vtoy_json_get_int(json
, "id", &id
);
3144 vtoy_json_get_bool(json
, "timeouten", &timeouten
);
3145 vtoy_json_get_bool(json
, "autoselen", &autoselen
);
3147 data
= g_data_persistence
+ index
;
3151 for (node
= data
->list
; node
; node
= node
->next
)
3155 node
->timeouten
= (int)timeouten
;
3156 node
->autoselen
= (int)autoselen
;
3157 VTOY_JSON_INT("timeout", node
->timeout
);
3158 VTOY_JSON_INT("autosel", node
->autosel
);
3164 ret
= ventoy_data_save_all();
3166 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3171 static int ventoy_api_persistence_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
3175 const char *path
= NULL
;
3176 persistence_node
*node
= NULL
;
3177 persistence_node
*cur
= NULL
;
3178 data_persistence
*data
= NULL
;
3179 VTOY_JSON
*array
= NULL
;
3181 vtoy_json_get_int(json
, "index", &index
);
3182 data
= g_data_persistence
+ index
;
3184 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "backend");
3185 path
= VTOY_JSON_STR_EX("path");
3188 node
= zalloc(sizeof(persistence_node
));
3191 node
->timeouten
= 0;
3192 node
->autoselen
= 0;
3195 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
3196 node
->list
= ventoy_path_node_add_array(array
);
3198 vtoy_list_add(data
->list
, cur
, node
);
3202 ret
= ventoy_data_save_all();
3204 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3208 static int ventoy_api_persistence_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
3212 const char *path
= NULL
;
3213 persistence_node
*last
= NULL
;
3214 persistence_node
*node
= NULL
;
3215 data_persistence
*data
= NULL
;
3217 vtoy_json_get_int(json
, "index", &index
);
3218 data
= g_data_persistence
+ index
;
3220 path
= VTOY_JSON_STR_EX("path");
3223 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
3226 ret
= ventoy_data_save_all();
3228 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3232 static int ventoy_api_persistence_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
3236 const char *path
= NULL
;
3237 const char *outpath
= NULL
;
3238 path_node
*pcur
= NULL
;
3239 path_node
*pnode
= NULL
;
3240 persistence_node
*node
= NULL
;
3241 data_persistence
*data
= NULL
;
3243 vtoy_json_get_int(json
, "index", &index
);
3244 data
= g_data_persistence
+ index
;
3246 path
= VTOY_JSON_STR_EX("path");
3247 outpath
= VTOY_JSON_STR_EX("outpath");
3248 if (path
&& outpath
)
3250 for (node
= data
->list
; node
; node
= node
->next
)
3252 if (strcmp(outpath
, node
->path
) == 0)
3254 pnode
= zalloc(sizeof(path_node
));
3257 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
3258 vtoy_list_add(node
->list
, pcur
, pnode
);
3266 ret
= ventoy_data_save_all();
3268 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3272 static int ventoy_api_persistence_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
3276 const char *path
= NULL
;
3277 const char *outpath
= NULL
;
3278 path_node
*plast
= NULL
;
3279 path_node
*pnode
= NULL
;
3280 persistence_node
*node
= NULL
;
3281 data_persistence
*data
= NULL
;
3283 vtoy_json_get_int(json
, "index", &index
);
3284 data
= g_data_persistence
+ index
;
3286 path
= VTOY_JSON_STR_EX("path");
3287 outpath
= VTOY_JSON_STR_EX("outpath");
3288 if (path
&& outpath
)
3290 for (node
= data
->list
; node
; node
= node
->next
)
3292 if (strcmp(outpath
, node
->path
) == 0)
3294 vtoy_list_del(plast
, pnode
, node
->list
, path
);
3300 ret
= ventoy_data_save_all();
3302 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3310 void ventoy_data_default_injection(data_injection
*data
)
3312 memset(data
, 0, sizeof(data_injection
));
3315 int ventoy_data_cmp_injection(data_injection
*data1
, data_injection
*data2
)
3317 injection_node
*list1
= NULL
;
3318 injection_node
*list2
= NULL
;
3320 if (NULL
== data1
->list
&& NULL
== data2
->list
)
3324 else if (data1
->list
&& data2
->list
)
3326 list1
= data1
->list
;
3327 list2
= data2
->list
;
3329 while (list1
&& list2
)
3331 if ((list1
->type
!= list2
->type
) ||
3332 strcmp(list1
->path
, list2
->path
) ||
3333 strcmp(list1
->archive
, list2
->archive
))
3338 list1
= list1
->next
;
3339 list2
= list2
->next
;
3342 if (list1
== NULL
&& list2
== NULL
)
3357 int ventoy_data_save_injection(data_injection
*data
, const char *title
, char *buf
, int buflen
)
3360 injection_node
*node
= NULL
;
3362 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3364 VTOY_JSON_FMT_KEY_L(L1
, title
);
3365 VTOY_JSON_FMT_ARY_BEGIN_N();
3367 for (node
= data
->list
; node
; node
= node
->next
)
3369 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
3371 if (node
->type
== 0)
3373 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
3377 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
3379 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "archive", node
->archive
);
3381 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
3384 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
3385 VTOY_JSON_FMT_END(pos
);
3391 int ventoy_data_json_injection(data_injection
*data
, char *buf
, int buflen
)
3395 injection_node
*node
= NULL
;
3397 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3398 VTOY_JSON_FMT_ARY_BEGIN();
3400 for (node
= data
->list
; node
; node
= node
->next
)
3402 VTOY_JSON_FMT_OBJ_BEGIN();
3404 VTOY_JSON_FMT_UINT("type", node
->type
);
3405 VTOY_JSON_FMT_STRN("path", node
->path
);
3407 if (node
->type
== 0)
3409 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
3413 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
3415 VTOY_JSON_FMT_SINT("valid", valid
);
3417 VTOY_JSON_FMT_STRN("archive", node
->archive
);
3419 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, node
->archive
);
3420 VTOY_JSON_FMT_SINT("archive_valid", valid
);
3422 VTOY_JSON_FMT_OBJ_ENDEX();
3425 VTOY_JSON_FMT_ARY_END();
3426 VTOY_JSON_FMT_END(pos
);
3432 static int ventoy_api_get_injection(struct mg_connection
*conn
, VTOY_JSON
*json
)
3434 api_get_func(conn
, json
, injection
);
3438 static int ventoy_api_save_injection(struct mg_connection
*conn
, VTOY_JSON
*json
)
3441 ret
= ventoy_data_save_all();
3443 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3447 static int ventoy_api_injection_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
3452 const char *path
= NULL
;
3453 const char *archive
= NULL
;
3454 injection_node
*node
= NULL
;
3455 injection_node
*cur
= NULL
;
3456 data_injection
*data
= NULL
;
3458 vtoy_json_get_int(json
, "index", &index
);
3459 data
= g_data_injection
+ index
;
3461 vtoy_json_get_int(json
, "type", &type
);
3463 path
= VTOY_JSON_STR_EX("path");
3464 archive
= VTOY_JSON_STR_EX("archive");
3465 if (path
&& archive
)
3467 node
= zalloc(sizeof(injection_node
));
3472 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
3473 scnprintf(node
->archive
, sizeof(node
->archive
), "%s", archive
);
3475 vtoy_list_add(data
->list
, cur
, node
);
3479 ret
= ventoy_data_save_all();
3481 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3485 static int ventoy_api_injection_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
3489 const char *path
= NULL
;
3490 injection_node
*last
= NULL
;
3491 injection_node
*node
= NULL
;
3492 data_injection
*data
= NULL
;
3494 vtoy_json_get_int(json
, "index", &index
);
3495 data
= g_data_injection
+ index
;
3497 path
= VTOY_JSON_STR_EX("path");
3500 vtoy_list_del(last
, node
, data
->list
, path
);
3503 ret
= ventoy_data_save_all();
3505 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3513 int ventoy_data_save_all(void)
3515 ventoy_set_writeback_event();
3519 int ventoy_data_real_save_all(void)
3525 pthread_mutex_lock(&g_api_mutex
);
3527 ssprintf(pos
, JSON_SAVE_BUFFER
, JSON_BUF_MAX
, "{\n");
3529 ventoy_save_plug(control
);
3530 ventoy_save_plug(theme
);
3531 ventoy_save_plug(menu_alias
);
3532 ventoy_save_plug(menu_tip
);
3533 ventoy_save_plug(menu_class
);
3534 ventoy_save_plug(auto_install
);
3535 ventoy_save_plug(persistence
);
3536 ventoy_save_plug(injection
);
3537 ventoy_save_plug(conf_replace
);
3538 ventoy_save_plug(password
);
3539 ventoy_save_plug(image_list
);
3540 ventoy_save_plug(auto_memdisk
);
3541 ventoy_save_plug(dud
);
3543 if (JSON_SAVE_BUFFER
[pos
- 1] == '\n' && JSON_SAVE_BUFFER
[pos
- 2] == ',')
3545 JSON_SAVE_BUFFER
[pos
- 2] = '\n';
3548 ssprintf(pos
, JSON_SAVE_BUFFER
, JSON_BUF_MAX
, "}\n");
3550 pthread_mutex_unlock(&g_api_mutex
);
3555 int ventoy_http_writeback(void)
3561 ventoy_get_json_path(filename
, NULL
);
3563 pos
= ventoy_data_real_save_all();
3566 printf("%s", JSON_SAVE_BUFFER
);
3569 ret
= ventoy_write_buf_to_file(filename
, JSON_SAVE_BUFFER
, pos
);
3572 vlog("Failed to write ventoy.json file.\n");
3579 static JSON_CB g_ventoy_json_cb
[] =
3581 { "sysinfo", ventoy_api_sysinfo
},
3582 { "handshake", ventoy_api_handshake
},
3583 { "check_path", ventoy_api_check_exist
},
3584 { "check_path2", ventoy_api_check_exist2
},
3585 { "check_fuzzy", ventoy_api_check_fuzzy
},
3587 { "device_info", ventoy_api_device_info
},
3589 { "get_control", ventoy_api_get_control
},
3590 { "save_control", ventoy_api_save_control
},
3592 { "get_theme", ventoy_api_get_theme
},
3593 { "save_theme", ventoy_api_save_theme
},
3594 { "theme_add_file", ventoy_api_theme_add_file
},
3595 { "theme_del_file", ventoy_api_theme_del_file
},
3596 { "theme_add_font", ventoy_api_theme_add_font
},
3597 { "theme_del_font", ventoy_api_theme_del_font
},
3599 { "get_alias", ventoy_api_get_alias
},
3600 { "save_alias", ventoy_api_save_alias
},
3601 { "alias_add", ventoy_api_alias_add
},
3602 { "alias_del", ventoy_api_alias_del
},
3604 { "get_tip", ventoy_api_get_tip
},
3605 { "save_tip", ventoy_api_save_tip
},
3606 { "tip_add", ventoy_api_tip_add
},
3607 { "tip_del", ventoy_api_tip_del
},
3609 { "get_class", ventoy_api_get_class
},
3610 { "save_class", ventoy_api_save_class
},
3611 { "class_add", ventoy_api_class_add
},
3612 { "class_del", ventoy_api_class_del
},
3614 { "get_auto_memdisk", ventoy_api_get_auto_memdisk
},
3615 { "save_auto_memdisk", ventoy_api_save_auto_memdisk
},
3616 { "auto_memdisk_add", ventoy_api_auto_memdisk_add
},
3617 { "auto_memdisk_del", ventoy_api_auto_memdisk_del
},
3619 { "get_image_list", ventoy_api_get_image_list
},
3620 { "save_image_list", ventoy_api_save_image_list
},
3621 { "image_list_add", ventoy_api_image_list_add
},
3622 { "image_list_del", ventoy_api_image_list_del
},
3624 { "get_conf_replace", ventoy_api_get_conf_replace
},
3625 { "save_conf_replace", ventoy_api_save_conf_replace
},
3626 { "conf_replace_add", ventoy_api_conf_replace_add
},
3627 { "conf_replace_del", ventoy_api_conf_replace_del
},
3629 { "get_dud", ventoy_api_get_dud
},
3630 { "save_dud", ventoy_api_save_dud
},
3631 { "dud_add", ventoy_api_dud_add
},
3632 { "dud_del", ventoy_api_dud_del
},
3633 { "dud_add_inner", ventoy_api_dud_add_inner
},
3634 { "dud_del_inner", ventoy_api_dud_del_inner
},
3636 { "get_auto_install", ventoy_api_get_auto_install
},
3637 { "save_auto_install", ventoy_api_save_auto_install
},
3638 { "auto_install_add", ventoy_api_auto_install_add
},
3639 { "auto_install_del", ventoy_api_auto_install_del
},
3640 { "auto_install_add_inner", ventoy_api_auto_install_add_inner
},
3641 { "auto_install_del_inner", ventoy_api_auto_install_del_inner
},
3643 { "get_persistence", ventoy_api_get_persistence
},
3644 { "save_persistence", ventoy_api_save_persistence
},
3645 { "persistence_add", ventoy_api_persistence_add
},
3646 { "persistence_del", ventoy_api_persistence_del
},
3647 { "persistence_add_inner", ventoy_api_persistence_add_inner
},
3648 { "persistence_del_inner", ventoy_api_persistence_del_inner
},
3650 { "get_password", ventoy_api_get_password
},
3651 { "save_password", ventoy_api_save_password
},
3652 { "password_add", ventoy_api_password_add
},
3653 { "password_del", ventoy_api_password_del
},
3655 { "get_injection", ventoy_api_get_injection
},
3656 { "save_injection", ventoy_api_save_injection
},
3657 { "injection_add", ventoy_api_injection_add
},
3658 { "injection_del", ventoy_api_injection_del
},
3663 static int ventoy_json_handler(struct mg_connection
*conn
, VTOY_JSON
*json
)
3666 const char *method
= NULL
;
3668 method
= vtoy_json_get_string_ex(json
, "method");
3671 ventoy_json_result(conn
, VTOY_JSON_SUCCESS_RET
);
3675 if (strcmp(method
, "handshake") == 0)
3677 ventoy_api_handshake(conn
, json
);
3681 for (i
= 0; i
< (int)(sizeof(g_ventoy_json_cb
) / sizeof(g_ventoy_json_cb
[0])); i
++)
3683 if (strcmp(method
, g_ventoy_json_cb
[i
].method
) == 0)
3685 g_ventoy_json_cb
[i
].callback(conn
, json
);
3693 static int ventoy_request_handler(struct mg_connection
*conn
)
3697 VTOY_JSON
*json
= NULL
;
3698 char *post_data_buf
= NULL
;
3699 const struct mg_request_info
*ri
= NULL
;
3700 char stack_buf
[512];
3702 ri
= mg_get_request_info(conn
);
3704 if (strcmp(ri
->uri
, "/vtoy/json") == 0)
3706 if (ri
->content_length
> 500)
3708 post_data_buf
= malloc((int)(ri
->content_length
+ 4));
3709 post_buf_len
= (int)(ri
->content_length
+ 1);
3713 post_data_buf
= stack_buf
;
3714 post_buf_len
= sizeof(stack_buf
);
3717 post_data_len
= mg_read(conn
, post_data_buf
, post_buf_len
);
3718 post_data_buf
[post_data_len
] = 0;
3720 json
= vtoy_json_create();
3721 if (JSON_SUCCESS
== vtoy_json_parse(json
, post_data_buf
))
3723 pthread_mutex_lock(&g_api_mutex
);
3724 ventoy_json_handler(conn
, json
->pstChild
);
3725 pthread_mutex_unlock(&g_api_mutex
);
3729 ventoy_json_result(conn
, VTOY_JSON_INVALID_RET
);
3732 vtoy_json_destroy(json
);
3734 if (post_data_buf
!= stack_buf
)
3736 free(post_data_buf
);
3746 const char *ventoy_web_openfile(const struct mg_connection
*conn
, const char *path
, size_t *data_len
)
3748 ventoy_file
*node
= NULL
;
3757 node
= ventoy_tar_find_file(path
);
3760 *data_len
= node
->size
;
3772 static int ventoy_parse_control(VTOY_JSON
*json
, void *p
)
3775 VTOY_JSON
*node
= NULL
;
3776 VTOY_JSON
*child
= NULL
;
3777 data_control
*data
= (data_control
*)p
;
3779 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
3784 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
3786 if (node
->enDataType
== JSON_TYPE_OBJECT
)
3788 child
= node
->pstChild
;
3790 if (strcmp(child
->pcName
, "VTOY_DEFAULT_MENU_MODE") == 0)
3792 CONTROL_PARSE_INT(child
, data
->default_menu_mode
);
3794 else if (strcmp(child
->pcName
, "VTOY_WIN11_BYPASS_CHECK") == 0)
3796 CONTROL_PARSE_INT(child
, data
->win11_bypass_check
);
3798 else if (strcmp(child
->pcName
, "VTOY_TREE_VIEW_MENU_STYLE") == 0)
3800 CONTROL_PARSE_INT(child
, data
->treeview_style
);
3802 else if (strcmp(child
->pcName
, "VTOY_FILT_DOT_UNDERSCORE_FILE") == 0)
3804 CONTROL_PARSE_INT(child
, data
->filter_dot_underscore
);
3806 else if (strcmp(child
->pcName
, "VTOY_SORT_CASE_SENSITIVE") == 0)
3808 CONTROL_PARSE_INT(child
, data
->sort_casesensitive
);
3810 else if (strcmp(child
->pcName
, "VTOY_MAX_SEARCH_LEVEL") == 0)
3812 if (strcmp(child
->unData
.pcStrVal
, "max") == 0)
3814 data
->max_search_level
= -1;
3818 data
->max_search_level
= (int)strtol(child
->unData
.pcStrVal
, NULL
, 10);
3821 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_SEARCH_ROOT") == 0)
3823 strlcpy(data
->default_search_root
, child
->unData
.pcStrVal
);
3825 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_IMAGE") == 0)
3827 strlcpy(data
->default_image
, child
->unData
.pcStrVal
);
3829 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_KBD_LAYOUT") == 0)
3831 for (i
= 0; g_ventoy_kbd_layout
[i
]; i
++)
3833 if (strcmp(child
->unData
.pcStrVal
, g_ventoy_kbd_layout
[i
]) == 0)
3835 strlcpy(data
->default_kbd_layout
, child
->unData
.pcStrVal
);
3840 else if (strcmp(child
->pcName
, "VTOY_HELP_TXT_LANGUAGE") == 0)
3842 for (i
= 0; g_ventoy_help_lang
[i
]; i
++)
3844 if (strcmp(child
->unData
.pcStrVal
, g_ventoy_help_lang
[i
]) == 0)
3846 strlcpy(data
->help_text_language
, child
->unData
.pcStrVal
);
3851 else if (strcmp(child
->pcName
, "VTOY_MENU_TIMEOUT") == 0)
3853 data
->menu_timeout
= (int)strtol(child
->unData
.pcStrVal
, NULL
, 10);
3855 else if (strcmp(child
->pcName
, "VTOY_VHD_NO_WARNING") == 0)
3857 CONTROL_PARSE_INT(child
, data
->vhd_no_warning
);
3859 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_ISO") == 0)
3861 CONTROL_PARSE_INT(child
, data
->filter_iso
);
3863 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_IMG") == 0)
3865 CONTROL_PARSE_INT(child
, data
->filter_img
);
3867 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_EFI") == 0)
3869 CONTROL_PARSE_INT(child
, data
->filter_efi
);
3871 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_WIM") == 0)
3873 CONTROL_PARSE_INT(child
, data
->filter_wim
);
3875 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_VHD") == 0)
3877 CONTROL_PARSE_INT(child
, data
->filter_vhd
);
3879 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_VTOY") == 0)
3881 CONTROL_PARSE_INT(child
, data
->filter_vtoy
);
3889 static int ventoy_parse_theme(VTOY_JSON
*json
, void *p
)
3891 const char *dismode
= NULL
;
3892 VTOY_JSON
*child
= NULL
;
3893 VTOY_JSON
*node
= NULL
;
3894 path_node
*tail
= NULL
;
3895 path_node
*pnode
= NULL
;
3896 data_theme
*data
= (data_theme
*)p
;
3898 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
3903 child
= json
->pstChild
;
3905 dismode
= vtoy_json_get_string_ex(child
, "display_mode");
3906 vtoy_json_get_string(child
, "ventoy_left", sizeof(data
->ventoy_left
), data
->ventoy_left
);
3907 vtoy_json_get_string(child
, "ventoy_top", sizeof(data
->ventoy_top
), data
->ventoy_top
);
3908 vtoy_json_get_string(child
, "ventoy_color", sizeof(data
->ventoy_color
), data
->ventoy_color
);
3910 vtoy_json_get_int(child
, "default_file", &(data
->default_file
));
3911 vtoy_json_get_string(child
, "gfxmode", sizeof(data
->gfxmode
), data
->gfxmode
);
3912 vtoy_json_get_string(child
, "serial_param", sizeof(data
->serial_param
), data
->serial_param
);
3916 if (strcmp(dismode
, "CLI") == 0)
3918 data
->display_mode
= display_mode_cli
;
3920 else if (strcmp(dismode
, "serial") == 0)
3922 data
->display_mode
= display_mode_serial
;
3924 else if (strcmp(dismode
, "serial_console") == 0)
3926 data
->display_mode
= display_mode_ser_console
;
3930 data
->display_mode
= display_mode_gui
;
3934 node
= vtoy_json_find_item(child
, JSON_TYPE_STRING
, "file");
3937 data
->default_file
= 0;
3939 pnode
= zalloc(sizeof(path_node
));
3942 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3943 data
->filelist
= pnode
;
3948 node
= vtoy_json_find_item(child
, JSON_TYPE_ARRAY
, "file");
3951 for (node
= node
->pstChild
; node
; node
= node
->pstNext
)
3953 if (node
->enDataType
== JSON_TYPE_STRING
)
3955 pnode
= zalloc(sizeof(path_node
));
3958 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3966 data
->filelist
= tail
= pnode
;
3975 node
= vtoy_json_find_item(child
, JSON_TYPE_ARRAY
, "fonts");
3978 for (node
= node
->pstChild
; node
; node
= node
->pstNext
)
3980 if (node
->enDataType
== JSON_TYPE_STRING
)
3982 pnode
= zalloc(sizeof(path_node
));
3985 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3986 if (data
->fontslist
)
3993 data
->fontslist
= tail
= pnode
;
4002 static int ventoy_parse_menu_alias(VTOY_JSON
*json
, void *p
)
4005 const char *path
= NULL
;
4006 const char *alias
= NULL
;
4007 data_alias
*data
= (data_alias
*)p
;
4008 data_alias_node
*tail
= NULL
;
4009 data_alias_node
*pnode
= NULL
;
4010 VTOY_JSON
*node
= NULL
;
4012 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4017 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4019 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4024 type
= path_type_file
;
4025 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4028 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4029 type
= path_type_dir
;
4031 alias
= vtoy_json_get_string_ex(node
->pstChild
, "alias");
4035 pnode
= zalloc(sizeof(data_alias_node
));
4039 strlcpy(pnode
->path
, path
);
4040 strlcpy(pnode
->alias
, alias
);
4049 data
->list
= tail
= pnode
;
4058 static int ventoy_parse_menu_tip(VTOY_JSON
*json
, void *p
)
4061 const char *path
= NULL
;
4062 const char *tip
= NULL
;
4063 data_tip
*data
= (data_tip
*)p
;
4064 data_tip_node
*tail
= NULL
;
4065 data_tip_node
*pnode
= NULL
;
4066 VTOY_JSON
*node
= NULL
;
4067 VTOY_JSON
*tips
= NULL
;
4069 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
4074 vtoy_json_get_string(json
->pstChild
, "left", sizeof(data
->left
), data
->left
);
4075 vtoy_json_get_string(json
->pstChild
, "top", sizeof(data
->top
), data
->top
);
4076 vtoy_json_get_string(json
->pstChild
, "color", sizeof(data
->color
), data
->color
);
4078 tips
= vtoy_json_find_item(json
->pstChild
, JSON_TYPE_ARRAY
, "tips");
4084 for (node
= tips
->pstChild
; node
; node
= node
->pstNext
)
4086 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4091 type
= path_type_file
;
4092 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4095 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4096 type
= path_type_dir
;
4098 tip
= vtoy_json_get_string_ex(node
->pstChild
, "tip");
4102 pnode
= zalloc(sizeof(data_tip_node
));
4106 strlcpy(pnode
->path
, path
);
4107 strlcpy(pnode
->tip
, tip
);
4116 data
->list
= tail
= pnode
;
4124 static int ventoy_parse_menu_class(VTOY_JSON
*json
, void *p
)
4127 const char *path
= NULL
;
4128 const char *class = NULL
;
4129 data_class
*data
= (data_class
*)p
;
4130 data_class_node
*tail
= NULL
;
4131 data_class_node
*pnode
= NULL
;
4132 VTOY_JSON
*node
= NULL
;
4134 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4139 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4141 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4146 type
= class_type_key
;
4147 path
= vtoy_json_get_string_ex(node
->pstChild
, "key");
4150 type
= class_type_dir
;
4151 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4154 type
= class_type_parent
;
4155 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4158 class = vtoy_json_get_string_ex(node
->pstChild
, "class");
4162 pnode
= zalloc(sizeof(data_class_node
));
4166 strlcpy(pnode
->path
, path
);
4167 strlcpy(pnode
->class, class);
4176 data
->list
= tail
= pnode
;
4184 static int ventoy_parse_auto_install(VTOY_JSON
*json
, void *p
)
4192 const char *path
= NULL
;
4193 const char *file
= NULL
;
4194 data_auto_install
*data
= (data_auto_install
*)p
;
4195 auto_install_node
*tail
= NULL
;
4196 auto_install_node
*pnode
= NULL
;
4197 path_node
*pathnode
= NULL
;
4198 path_node
*pathtail
= NULL
;
4199 VTOY_JSON
*node
= NULL
;
4200 VTOY_JSON
*filelist
= NULL
;
4201 VTOY_JSON
*filenode
= NULL
;
4203 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4208 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4210 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4216 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4219 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4227 file
= vtoy_json_get_string_ex(node
->pstChild
, "template");
4230 pnode
= zalloc(sizeof(auto_install_node
));
4235 strlcpy(pnode
->path
, path
);
4237 pathnode
= zalloc(sizeof(path_node
));
4240 strlcpy(pathnode
->path
, file
);
4241 pnode
->list
= pathnode
;
4255 data
->list
= tail
= pnode
;
4263 timeouten
= autoselen
= 0;
4264 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "timeout", &timeout
))
4268 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "autosel", &autosel
))
4273 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "template");
4279 pnode
= zalloc(sizeof(auto_install_node
));
4286 pnode
->autoselen
= autoselen
;
4287 pnode
->timeouten
= timeouten
;
4288 pnode
->timeout
= timeout
;
4289 pnode
->autosel
= autosel
;
4290 strlcpy(pnode
->path
, path
);
4293 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4295 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4300 pathnode
= zalloc(sizeof(path_node
));
4304 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4308 pathtail
->next
= pathnode
;
4309 pathtail
= pathnode
;
4313 pnode
->list
= pathtail
= pathnode
;
4324 if (pnode
->autoselen
&& pnode
->autosel
> count
)
4336 data
->list
= tail
= pnode
;
4343 static int ventoy_parse_persistence(VTOY_JSON
*json
, void *p
)
4350 const char *path
= NULL
;
4351 const char *file
= NULL
;
4352 data_persistence
*data
= (data_persistence
*)p
;
4353 persistence_node
*tail
= NULL
;
4354 persistence_node
*pnode
= NULL
;
4355 path_node
*pathnode
= NULL
;
4356 path_node
*pathtail
= NULL
;
4357 VTOY_JSON
*node
= NULL
;
4358 VTOY_JSON
*filelist
= NULL
;
4359 VTOY_JSON
*filenode
= NULL
;
4361 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4366 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4368 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4373 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4379 file
= vtoy_json_get_string_ex(node
->pstChild
, "backend");
4382 pnode
= zalloc(sizeof(persistence_node
));
4387 strlcpy(pnode
->path
, path
);
4389 pathnode
= zalloc(sizeof(path_node
));
4392 strlcpy(pathnode
->path
, file
);
4393 pnode
->list
= pathnode
;
4407 data
->list
= tail
= pnode
;
4415 timeouten
= autoselen
= 0;
4416 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "timeout", &timeout
))
4420 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "autosel", &autosel
))
4425 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "backend");
4431 pnode
= zalloc(sizeof(persistence_node
));
4438 pnode
->autoselen
= autoselen
;
4439 pnode
->timeouten
= timeouten
;
4440 pnode
->timeout
= timeout
;
4441 pnode
->autosel
= autosel
;
4442 strlcpy(pnode
->path
, path
);
4445 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4447 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4452 pathnode
= zalloc(sizeof(path_node
));
4456 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4460 pathtail
->next
= pathnode
;
4461 pathtail
= pathnode
;
4465 pnode
->list
= pathtail
= pathnode
;
4476 if (pnode
->autoselen
&& pnode
->autosel
> count
)
4488 data
->list
= tail
= pnode
;
4495 static int ventoy_parse_injection(VTOY_JSON
*json
, void *p
)
4498 const char *path
= NULL
;
4499 const char *archive
= NULL
;
4500 data_injection
*data
= (data_injection
*)p
;
4501 injection_node
*tail
= NULL
;
4502 injection_node
*pnode
= NULL
;
4503 VTOY_JSON
*node
= NULL
;
4505 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4510 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4512 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4518 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4521 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4524 archive
= vtoy_json_get_string_ex(node
->pstChild
, "archive");
4526 if (path
&& archive
)
4528 pnode
= zalloc(sizeof(injection_node
));
4532 strlcpy(pnode
->path
, path
);
4533 strlcpy(pnode
->archive
, archive
);
4542 data
->list
= tail
= pnode
;
4550 static int ventoy_parse_conf_replace(VTOY_JSON
*json
, void *p
)
4553 const char *path
= NULL
;
4554 const char *org
= NULL
;
4555 const char *new = NULL
;
4556 data_conf_replace
*data
= (data_conf_replace
*)p
;
4557 conf_replace_node
*tail
= NULL
;
4558 conf_replace_node
*pnode
= NULL
;
4559 VTOY_JSON
*node
= NULL
;
4561 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4566 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4568 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4573 path
= vtoy_json_get_string_ex(node
->pstChild
, "iso");
4574 org
= vtoy_json_get_string_ex(node
->pstChild
, "org");
4575 new = vtoy_json_get_string_ex(node
->pstChild
, "new");
4578 vtoy_json_get_int(node
->pstChild
, "img", &img
);
4580 if (path
&& org
&& new)
4582 pnode
= zalloc(sizeof(conf_replace_node
));
4585 strlcpy(pnode
->path
, path
);
4586 strlcpy(pnode
->org
, org
);
4587 strlcpy(pnode
->new, new);
4600 data
->list
= tail
= pnode
;
4608 static int ventoy_parse_password(VTOY_JSON
*json
, void *p
)
4611 const char *bootpwd
= NULL
;
4612 const char *isopwd
= NULL
;
4613 const char *wimpwd
= NULL
;
4614 const char *imgpwd
= NULL
;
4615 const char *efipwd
= NULL
;
4616 const char *vhdpwd
= NULL
;
4617 const char *vtoypwd
= NULL
;
4618 const char *path
= NULL
;
4619 const char *pwd
= NULL
;
4620 data_password
*data
= (data_password
*)p
;
4621 menu_password
*tail
= NULL
;
4622 menu_password
*pnode
= NULL
;
4623 VTOY_JSON
*node
= NULL
;
4624 VTOY_JSON
*menupwd
= NULL
;
4626 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
4631 bootpwd
= vtoy_json_get_string_ex(json
->pstChild
, "bootpwd");
4632 isopwd
= vtoy_json_get_string_ex(json
->pstChild
, "isopwd");
4633 wimpwd
= vtoy_json_get_string_ex(json
->pstChild
, "wimpwd");
4634 imgpwd
= vtoy_json_get_string_ex(json
->pstChild
, "imgpwd");
4635 efipwd
= vtoy_json_get_string_ex(json
->pstChild
, "efipwd");
4636 vhdpwd
= vtoy_json_get_string_ex(json
->pstChild
, "vhdpwd");
4637 vtoypwd
= vtoy_json_get_string_ex(json
->pstChild
, "vtoypwd");
4640 if (bootpwd
) strlcpy(data
->bootpwd
, bootpwd
);
4641 if (isopwd
) strlcpy(data
->isopwd
, isopwd
);
4642 if (wimpwd
) strlcpy(data
->wimpwd
, wimpwd
);
4643 if (imgpwd
) strlcpy(data
->imgpwd
, imgpwd
);
4644 if (efipwd
) strlcpy(data
->efipwd
, efipwd
);
4645 if (vhdpwd
) strlcpy(data
->vhdpwd
, vhdpwd
);
4646 if (vtoypwd
) strlcpy(data
->vtoypwd
, vtoypwd
);
4649 menupwd
= vtoy_json_find_item(json
->pstChild
, JSON_TYPE_ARRAY
, "menupwd");
4655 for (node
= menupwd
->pstChild
; node
; node
= node
->pstNext
)
4657 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4663 path
= vtoy_json_get_string_ex(node
->pstChild
, "file");
4666 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4669 pwd
= vtoy_json_get_string_ex(node
->pstChild
, "pwd");
4673 pnode
= zalloc(sizeof(menu_password
));
4677 strlcpy(pnode
->path
, path
);
4678 strlcpy(pnode
->pwd
, pwd
);
4687 data
->list
= tail
= pnode
;
4696 static int ventoy_parse_image_list_real(VTOY_JSON
*json
, int type
, void *p
)
4698 VTOY_JSON
*node
= NULL
;
4699 data_image_list
*data
= (data_image_list
*)p
;
4700 path_node
*tail
= NULL
;
4701 path_node
*pnode
= NULL
;
4703 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4710 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4712 if (node
->enDataType
== JSON_TYPE_STRING
)
4714 pnode
= zalloc(sizeof(path_node
));
4717 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
4725 data
->list
= tail
= pnode
;
4733 static int ventoy_parse_image_blacklist(VTOY_JSON
*json
, void *p
)
4735 return ventoy_parse_image_list_real(json
, 1, p
);
4737 static int ventoy_parse_image_list(VTOY_JSON
*json
, void *p
)
4739 return ventoy_parse_image_list_real(json
, 0, p
);
4742 static int ventoy_parse_auto_memdisk(VTOY_JSON
*json
, void *p
)
4744 VTOY_JSON
*node
= NULL
;
4745 data_auto_memdisk
*data
= (data_auto_memdisk
*)p
;
4746 path_node
*tail
= NULL
;
4747 path_node
*pnode
= NULL
;
4749 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4754 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4756 if (node
->enDataType
== JSON_TYPE_STRING
)
4758 pnode
= zalloc(sizeof(path_node
));
4761 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
4769 data
->list
= tail
= pnode
;
4777 static int ventoy_parse_dud(VTOY_JSON
*json
, void *p
)
4780 const char *path
= NULL
;
4781 const char *file
= NULL
;
4782 data_dud
*data
= (data_dud
*)p
;
4783 dud_node
*tail
= NULL
;
4784 dud_node
*pnode
= NULL
;
4785 path_node
*pathnode
= NULL
;
4786 path_node
*pathtail
= NULL
;
4787 VTOY_JSON
*node
= NULL
;
4788 VTOY_JSON
*filelist
= NULL
;
4789 VTOY_JSON
*filenode
= NULL
;
4791 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4796 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4798 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4803 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4809 file
= vtoy_json_get_string_ex(node
->pstChild
, "dud");
4812 pnode
= zalloc(sizeof(dud_node
));
4815 strlcpy(pnode
->path
, path
);
4817 pathnode
= zalloc(sizeof(path_node
));
4820 strlcpy(pathnode
->path
, file
);
4821 pnode
->list
= pathnode
;
4835 data
->list
= tail
= pnode
;
4842 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "dud");
4848 pnode
= zalloc(sizeof(dud_node
));
4854 strlcpy(pnode
->path
, path
);
4856 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4858 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4863 pathnode
= zalloc(sizeof(path_node
));
4866 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4871 pathtail
->next
= pathnode
;
4872 pathtail
= pathnode
;
4876 pnode
->list
= pathtail
= pathnode
;
4894 data
->list
= tail
= pnode
;
4908 static int ventoy_load_old_json(const char *filename
)
4913 char *buffer
= NULL
;
4914 unsigned char *start
= NULL
;
4915 VTOY_JSON
*json
= NULL
;
4916 VTOY_JSON
*node
= NULL
;
4918 ret
= ventoy_read_file_to_buf(filename
, 4, (void **)&buffer
, &buflen
);
4921 vlog("Failed to read old ventoy.json file.\n");
4926 start
= (unsigned char *)buffer
;
4928 if (start
[0] == 0xef && start
[1] == 0xbb && start
[2] == 0xbf)
4932 else if ((start
[0] == 0xff && start
[1] == 0xfe) || (start
[0] == 0xfe && start
[1] == 0xff))
4934 vlog("ventoy.json is in UCS-2 encoding, ignore it.\n");
4939 json
= vtoy_json_create();
4946 if (vtoy_json_parse_ex(json
, buffer
+ offset
, buflen
- offset
) == JSON_SUCCESS
)
4948 vlog("parse ventoy.json success\n");
4950 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4952 ventoy_parse_json(control
);
4953 ventoy_parse_json(theme
);
4954 ventoy_parse_json(menu_alias
);
4955 ventoy_parse_json(menu_tip
);
4956 ventoy_parse_json(menu_class
);
4957 ventoy_parse_json(auto_install
);
4958 ventoy_parse_json(persistence
);
4959 ventoy_parse_json(injection
);
4960 ventoy_parse_json(conf_replace
);
4961 ventoy_parse_json(password
);
4962 ventoy_parse_json(image_list
);
4963 ventoy_parse_json(image_blacklist
);
4964 ventoy_parse_json(auto_memdisk
);
4965 ventoy_parse_json(dud
);
4970 vlog("ventoy.json has syntax error.\n");
4971 g_sysinfo
.syntax_error
= 1;
4975 vtoy_json_destroy(json
);
4982 int ventoy_http_start(const char *ip
, const char *port
)
4987 char backupname
[128];
4988 struct mg_callbacks callbacks
;
4989 const char *options
[] =
4991 "listening_ports", "24681",
4992 "document_root", "www",
4993 "index_files", "index.html",
4994 "num_threads", "16",
4995 "error_log_file", LOG_FILE
,
4996 "request_timeout_ms", "10000",
5000 for (i
= 0; i
<= bios_max
; i
++)
5002 ventoy_data_default_control(g_data_control
+ i
);
5003 ventoy_data_default_theme(g_data_theme
+ i
);
5004 ventoy_data_default_menu_alias(g_data_menu_alias
+ i
);
5005 ventoy_data_default_menu_class(g_data_menu_class
+ i
);
5006 ventoy_data_default_menu_tip(g_data_menu_tip
+ i
);
5007 ventoy_data_default_auto_install(g_data_auto_install
+ i
);
5008 ventoy_data_default_persistence(g_data_persistence
+ i
);
5009 ventoy_data_default_injection(g_data_injection
+ i
);
5010 ventoy_data_default_conf_replace(g_data_conf_replace
+ i
);
5011 ventoy_data_default_password(g_data_password
+ i
);
5012 ventoy_data_default_image_list(g_data_image_list
+ i
);
5013 ventoy_data_default_auto_memdisk(g_data_auto_memdisk
+ i
);
5014 ventoy_data_default_dud(g_data_dud
+ i
);
5017 ventoy_get_json_path(filename
, backupname
);
5018 if (ventoy_is_file_exist("%s", filename
))
5020 ventoy_copy_file(filename
, backupname
);
5021 ventoy_load_old_json(filename
);
5026 scnprintf(addr
, sizeof(addr
), "%s:%s", ip
, port
);
5029 memset(&callbacks
, 0, sizeof(callbacks
));
5030 callbacks
.begin_request
= ventoy_request_handler
;
5032 callbacks
.open_file
= ventoy_web_openfile
;
5034 g_ventoy_http_ctx
= mg_start(&callbacks
, NULL
, options
);
5036 ventoy_start_writeback_thread(ventoy_http_writeback
);
5038 return g_ventoy_http_ctx
? 0 : 1;
5041 int ventoy_http_stop(void)
5043 if (g_ventoy_http_ctx
)
5045 mg_stop(g_ventoy_http_ctx
);
5048 ventoy_stop_writeback_thread();
5052 int ventoy_http_init(void)
5054 if (!g_pub_json_buffer
)
5056 g_pub_json_buffer
= malloc(JSON_BUF_MAX
* 2);
5057 g_pub_save_buffer
= g_pub_json_buffer
+ JSON_BUF_MAX
;
5060 pthread_mutex_init(&g_api_mutex
, NULL
);
5064 void ventoy_http_exit(void)
5066 check_free(g_pub_json_buffer
);
5067 g_pub_json_buffer
= NULL
;
5068 g_pub_save_buffer
= NULL
;
5070 pthread_mutex_destroy(&g_api_mutex
);