1 /******************************************************************************
2 * ventoy_http.c ---- ventoy http
3 * Copyright (c) 2021, longpanda <admin@ventoy.net>
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 3 of the
8 * License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, see <http://www.gnu.org/licenses/>.
27 #if defined(_MSC_VER) || defined(WIN32)
31 #include <sys/types.h>
32 #include <sys/ioctl.h>
34 #include <sys/types.h>
35 #include <sys/mount.h>
37 #include <linux/limits.h>
42 #include <ventoy_define.h>
43 #include <ventoy_json.h>
44 #include <ventoy_util.h>
45 #include <ventoy_disk.h>
46 #include <ventoy_http.h>
47 #include "fat_filelib.h"
49 static const char *g_json_title_postfix
[bios_max
+ 1] =
51 "", "_legacy", "_uefi", "_ia32", "_aa64", "_mips", ""
54 static const char *g_ventoy_kbd_layout
[] =
56 "QWERTY_USA", "AZERTY", "CZECH_QWERTY", "CZECH_QWERTZ", "DANISH",
57 "DVORAK_USA", "FRENCH", "GERMAN", "ITALIANO", "JAPAN_106", "LATIN_USA",
58 "PORTU_BRAZIL", "QWERTY_UK", "QWERTZ", "QWERTZ_HUN", "QWERTZ_SLOV_CROAT",
59 "SPANISH", "SWEDISH", "TURKISH_Q", "VIETNAMESE",
63 static char g_ventoy_help_lang
[MAX_LANGUAGE
][8];
65 static char g_pub_path
[2 * MAX_PATH
];
66 static data_control g_data_control
[bios_max
+ 1];
67 static data_theme g_data_theme
[bios_max
+ 1];
68 static data_alias g_data_menu_alias
[bios_max
+ 1];
69 static data_tip g_data_menu_tip
[bios_max
+ 1];
70 static data_class g_data_menu_class
[bios_max
+ 1];
71 static data_image_list g_data_image_list
[bios_max
+ 1];
72 static data_image_list
*g_data_image_blacklist
= g_data_image_list
;
73 static data_auto_memdisk g_data_auto_memdisk
[bios_max
+ 1];
74 static data_password g_data_password
[bios_max
+ 1];
75 static data_conf_replace g_data_conf_replace
[bios_max
+ 1];
76 static data_injection g_data_injection
[bios_max
+ 1];
77 static data_auto_install g_data_auto_install
[bios_max
+ 1];
78 static data_persistence g_data_persistence
[bios_max
+ 1];
79 static data_dud g_data_dud
[bios_max
+ 1];
81 static char *g_pub_json_buffer
= NULL
;
82 static char *g_pub_save_buffer
= NULL
;
83 #define JSON_BUFFER g_pub_json_buffer
84 #define JSON_SAVE_BUFFER g_pub_save_buffer
86 static pthread_mutex_t g_api_mutex
;
87 static struct mg_context
*g_ventoy_http_ctx
= NULL
;
89 static int ventoy_is_kbd_valid(const char *key
)
93 for (i
= 0; g_ventoy_kbd_layout
[i
]; i
++)
95 if (strcmp(g_ventoy_kbd_layout
[i
], key
) == 0)
104 static const char * ventoy_real_path(const char *org
)
108 if (g_sysinfo
.pathcase
)
110 scnprintf(g_pub_path
, MAX_PATH
, "%s", org
);
111 count
= ventoy_path_case(g_pub_path
+ 1, 1);
125 static int ventoy_json_result(struct mg_connection
*conn
, const char *err
)
128 "HTTP/1.1 200 OK \r\n"
129 "Content-Type: application/json\r\n"
130 "Content-Length: %d\r\n"
132 (int)strlen(err
), err
);
137 static int ventoy_json_buffer(struct mg_connection
*conn
, const char *json_buf
, int json_len
)
140 "HTTP/1.1 200 OK \r\n"
141 "Content-Type: application/json\r\n"
142 "Content-Length: %d\r\n"
149 static void ventoy_free_path_node_list(path_node
*list
)
151 path_node
*next
= NULL
;
152 path_node
*node
= list
;
162 static path_node
* ventoy_path_node_add_array(VTOY_JSON
*array
)
164 path_node
*head
= NULL
;
165 path_node
*node
= NULL
;
166 path_node
*cur
= NULL
;
167 VTOY_JSON
*item
= NULL
;
169 for (item
= array
->pstChild
; item
; item
= item
->pstNext
)
171 node
= zalloc(sizeof(path_node
));
174 scnprintf(node
->path
, sizeof(node
->path
), "%s", item
->unData
.pcStrVal
);
175 vtoy_list_add(head
, cur
, node
);
182 static int ventoy_check_fuzzy_path(char *path
, int prefix
)
194 pos
= strchr(path
, '*');
197 for (cur
= pos
; *cur
; cur
++)
222 rc
= ventoy_is_directory_exist("%s%s", g_cur_dir
, path
);
226 rc
= ventoy_is_directory_exist("%s", path
);
247 return ventoy_is_file_exist("%s%s", g_cur_dir
, path
);
251 return ventoy_is_file_exist("%s", path
);
256 static int ventoy_path_list_cmp(path_node
*list1
, path_node
*list2
)
258 if (NULL
== list1
&& NULL
== list2
)
262 else if (list1
&& list2
)
264 while (list1
&& list2
)
266 if (strcmp(list1
->path
, list2
->path
))
275 if (list1
== NULL
&& list2
== NULL
)
288 static int ventoy_api_device_info(struct mg_connection
*conn
, VTOY_JSON
*json
)
294 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
295 VTOY_JSON_FMT_OBJ_BEGIN();
297 VTOY_JSON_FMT_STRN("dev_name", g_sysinfo
.cur_model
);
298 VTOY_JSON_FMT_STRN("dev_capacity", g_sysinfo
.cur_capacity
);
299 VTOY_JSON_FMT_STRN("dev_fs", g_sysinfo
.cur_fsname
);
300 VTOY_JSON_FMT_STRN("ventoy_ver", g_sysinfo
.cur_ventoy_ver
);
301 VTOY_JSON_FMT_SINT("part_style", g_sysinfo
.cur_part_style
);
302 VTOY_JSON_FMT_SINT("secure_boot", g_sysinfo
.cur_secureboot
);
304 VTOY_JSON_FMT_OBJ_END();
305 VTOY_JSON_FMT_END(pos
);
307 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
311 static int ventoy_api_sysinfo(struct mg_connection
*conn
, VTOY_JSON
*json
)
317 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
318 VTOY_JSON_FMT_OBJ_BEGIN();
319 VTOY_JSON_FMT_STRN("language", ventoy_get_os_language());
320 VTOY_JSON_FMT_STRN("curdir", g_cur_dir
);
323 VTOY_JSON_FMT_SINT("syntax_error", g_sysinfo
.syntax_error
);
324 g_sysinfo
.syntax_error
= 0;
326 VTOY_JSON_FMT_SINT("invalid_config", g_sysinfo
.invalid_config
);
327 g_sysinfo
.invalid_config
= 0;
329 #if defined(_MSC_VER) || defined(WIN32)
330 VTOY_JSON_FMT_STRN("os", "windows");
332 VTOY_JSON_FMT_STRN("os", "linux");
335 VTOY_JSON_FMT_OBJ_END();
336 VTOY_JSON_FMT_END(pos
);
338 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
342 static int ventoy_api_handshake(struct mg_connection
*conn
, VTOY_JSON
*json
)
348 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
349 VTOY_JSON_FMT_OBJ_BEGIN();
350 VTOY_JSON_FMT_SINT("status", 0);
351 VTOY_JSON_FMT_SINT("save_error", g_sysinfo
.config_save_error
);
352 g_sysinfo
.config_save_error
= 0;
353 VTOY_JSON_FMT_OBJ_END();
354 VTOY_JSON_FMT_END(pos
);
356 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
360 static int ventoy_api_check_exist(struct mg_connection
*conn
, VTOY_JSON
*json
)
365 const char *path
= NULL
;
367 path
= vtoy_json_get_string_ex(json
, "path");
368 vtoy_json_get_int(json
, "dir", &dir
);
374 exist
= ventoy_is_directory_exist("%s", path
);
378 exist
= ventoy_is_file_exist("%s", path
);
382 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
383 VTOY_JSON_FMT_OBJ_BEGIN();
384 VTOY_JSON_FMT_SINT("exist", exist
);
385 VTOY_JSON_FMT_OBJ_END();
386 VTOY_JSON_FMT_END(pos
);
388 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
392 static int ventoy_api_check_exist2(struct mg_connection
*conn
, VTOY_JSON
*json
)
401 const char *path1
= NULL
;
402 const char *path2
= NULL
;
404 path1
= vtoy_json_get_string_ex(json
, "path1");
405 path2
= vtoy_json_get_string_ex(json
, "path2");
406 vtoy_json_get_int(json
, "dir1", &dir1
);
407 vtoy_json_get_int(json
, "dir2", &dir2
);
408 vtoy_json_get_int(json
, "fuzzy1", &fuzzy1
);
409 vtoy_json_get_int(json
, "fuzzy2", &fuzzy2
);
415 exist1
= ventoy_is_directory_exist("%s", path1
);
421 exist1
= ventoy_check_fuzzy_path((char *)path1
, 0);
425 exist1
= ventoy_is_file_exist("%s", path1
);
434 exist2
= ventoy_is_directory_exist("%s", path2
);
440 exist2
= ventoy_check_fuzzy_path((char *)path2
, 0);
444 exist2
= ventoy_is_file_exist("%s", path2
);
449 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
450 VTOY_JSON_FMT_OBJ_BEGIN();
451 VTOY_JSON_FMT_SINT("exist1", exist1
);
452 VTOY_JSON_FMT_SINT("exist2", exist2
);
453 VTOY_JSON_FMT_OBJ_END();
454 VTOY_JSON_FMT_END(pos
);
456 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
460 static int ventoy_api_check_fuzzy(struct mg_connection
*conn
, VTOY_JSON
*json
)
464 const char *path
= NULL
;
466 path
= vtoy_json_get_string_ex(json
, "path");
469 exist
= ventoy_check_fuzzy_path((char *)path
, 0);
472 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
473 VTOY_JSON_FMT_OBJ_BEGIN();
474 VTOY_JSON_FMT_SINT("exist", exist
);
475 VTOY_JSON_FMT_OBJ_END();
476 VTOY_JSON_FMT_END(pos
);
478 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
485 void ventoy_data_default_control(data_control
*data
)
487 memset(data
, 0, sizeof(data_control
));
489 data
->filter_dot_underscore
= 1;
490 data
->max_search_level
= -1;
491 data
->menu_timeout
= 0;
493 strlcpy(data
->default_kbd_layout
, "QWERTY_USA");
494 strlcpy(data
->help_text_language
, "en_US");
497 int ventoy_data_cmp_control(data_control
*data1
, data_control
*data2
)
499 if (data1
->default_menu_mode
!= data2
->default_menu_mode
||
500 data1
->treeview_style
!= data2
->treeview_style
||
501 data1
->filter_dot_underscore
!= data2
->filter_dot_underscore
||
502 data1
->sort_casesensitive
!= data2
->sort_casesensitive
||
503 data1
->max_search_level
!= data2
->max_search_level
||
504 data1
->vhd_no_warning
!= data2
->vhd_no_warning
||
505 data1
->filter_iso
!= data2
->filter_iso
||
506 data1
->filter_wim
!= data2
->filter_wim
||
507 data1
->filter_efi
!= data2
->filter_efi
||
508 data1
->filter_img
!= data2
->filter_img
||
509 data1
->filter_vhd
!= data2
->filter_vhd
||
510 data1
->filter_vtoy
!= data2
->filter_vtoy
||
511 data1
->win11_bypass_check
!= data2
->win11_bypass_check
||
512 data1
->linux_remount
!= data2
->linux_remount
||
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_LINUX_REMOUNT", linux_remount
);
558 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_MENU_TIMEOUT", menu_timeout
);
560 VTOY_JSON_FMT_CTRL_STRN(L2
, "VTOY_DEFAULT_KBD_LAYOUT", default_kbd_layout
);
561 VTOY_JSON_FMT_CTRL_STRN(L2
, "VTOY_HELP_TXT_LANGUAGE", help_text_language
);
563 if (strcmp(def
->default_search_root
, data
->default_search_root
))
565 VTOY_JSON_FMT_CTRL_STRN_STR(L2
, "VTOY_DEFAULT_SEARCH_ROOT", ventoy_real_path(data
->default_search_root
));
568 if (strcmp(def
->default_image
, data
->default_image
))
570 VTOY_JSON_FMT_CTRL_STRN_STR(L2
, "VTOY_DEFAULT_IMAGE", ventoy_real_path(data
->default_image
));
573 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
574 VTOY_JSON_FMT_END(pos
);
579 int ventoy_data_json_control(data_control
*ctrl
, char *buf
, int buflen
)
585 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
586 VTOY_JSON_FMT_OBJ_BEGIN();
588 VTOY_JSON_FMT_SINT("default_menu_mode", ctrl
->default_menu_mode
);
589 VTOY_JSON_FMT_SINT("treeview_style", ctrl
->treeview_style
);
590 VTOY_JSON_FMT_SINT("filter_dot_underscore", ctrl
->filter_dot_underscore
);
591 VTOY_JSON_FMT_SINT("sort_casesensitive", ctrl
->sort_casesensitive
);
592 VTOY_JSON_FMT_SINT("max_search_level", ctrl
->max_search_level
);
593 VTOY_JSON_FMT_SINT("vhd_no_warning", ctrl
->vhd_no_warning
);
595 VTOY_JSON_FMT_SINT("filter_iso", ctrl
->filter_iso
);
596 VTOY_JSON_FMT_SINT("filter_wim", ctrl
->filter_wim
);
597 VTOY_JSON_FMT_SINT("filter_efi", ctrl
->filter_efi
);
598 VTOY_JSON_FMT_SINT("filter_img", ctrl
->filter_img
);
599 VTOY_JSON_FMT_SINT("filter_vhd", ctrl
->filter_vhd
);
600 VTOY_JSON_FMT_SINT("filter_vtoy", ctrl
->filter_vtoy
);
601 VTOY_JSON_FMT_SINT("win11_bypass_check", ctrl
->win11_bypass_check
);
602 VTOY_JSON_FMT_SINT("linux_remount", ctrl
->linux_remount
);
603 VTOY_JSON_FMT_SINT("menu_timeout", ctrl
->menu_timeout
);
604 VTOY_JSON_FMT_STRN("default_kbd_layout", ctrl
->default_kbd_layout
);
605 VTOY_JSON_FMT_STRN("help_text_language", ctrl
->help_text_language
);
608 if (ctrl
->default_search_root
[0] && ventoy_is_directory_exist("%s%s", g_cur_dir
, ctrl
->default_search_root
))
612 VTOY_JSON_FMT_STRN("default_search_root", ctrl
->default_search_root
);
613 VTOY_JSON_FMT_SINT("default_search_root_valid", valid
);
617 if (ctrl
->default_image
[0] && ventoy_is_file_exist("%s%s", g_cur_dir
, ctrl
->default_image
))
621 VTOY_JSON_FMT_STRN("default_image", ctrl
->default_image
);
622 VTOY_JSON_FMT_SINT("default_image_valid", valid
);
624 VTOY_JSON_FMT_KEY("help_list");
625 VTOY_JSON_FMT_ARY_BEGIN();
627 for (i
= 0; g_ventoy_help_lang
[i
][0]; i
++)
629 VTOY_JSON_FMT_ITEM(g_ventoy_help_lang
[i
]);
631 VTOY_JSON_FMT_ARY_ENDEX();
634 VTOY_JSON_FMT_OBJ_END();
635 VTOY_JSON_FMT_END(pos
);
640 static int ventoy_api_get_control(struct mg_connection
*conn
, VTOY_JSON
*json
)
642 api_get_func(conn
, json
, control
);
646 static int ventoy_api_save_control(struct mg_connection
*conn
, VTOY_JSON
*json
)
650 data_control
*ctrl
= NULL
;
652 vtoy_json_get_int(json
, "index", &index
);
653 ctrl
= g_data_control
+ index
;
655 VTOY_JSON_INT("default_menu_mode", ctrl
->default_menu_mode
);
656 VTOY_JSON_INT("treeview_style", ctrl
->treeview_style
);
657 VTOY_JSON_INT("filter_dot_underscore", ctrl
->filter_dot_underscore
);
658 VTOY_JSON_INT("sort_casesensitive", ctrl
->sort_casesensitive
);
659 VTOY_JSON_INT("max_search_level", ctrl
->max_search_level
);
660 VTOY_JSON_INT("vhd_no_warning", ctrl
->vhd_no_warning
);
661 VTOY_JSON_INT("filter_iso", ctrl
->filter_iso
);
662 VTOY_JSON_INT("filter_wim", ctrl
->filter_wim
);
663 VTOY_JSON_INT("filter_efi", ctrl
->filter_efi
);
664 VTOY_JSON_INT("filter_img", ctrl
->filter_img
);
665 VTOY_JSON_INT("filter_vhd", ctrl
->filter_vhd
);
666 VTOY_JSON_INT("filter_vtoy", ctrl
->filter_vtoy
);
667 VTOY_JSON_INT("win11_bypass_check", ctrl
->win11_bypass_check
);
668 VTOY_JSON_INT("linux_remount", ctrl
->linux_remount
);
669 VTOY_JSON_INT("menu_timeout", ctrl
->menu_timeout
);
671 VTOY_JSON_STR("default_image", ctrl
->default_image
);
672 VTOY_JSON_STR("default_search_root", ctrl
->default_search_root
);
673 VTOY_JSON_STR("help_text_language", ctrl
->help_text_language
);
674 VTOY_JSON_STR("default_kbd_layout", ctrl
->default_kbd_layout
);
676 ret
= ventoy_data_save_all();
678 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
686 void ventoy_data_default_theme(data_theme
*data
)
688 memset(data
, 0, sizeof(data_theme
));
689 strlcpy(data
->gfxmode
, "1024x768");
690 scnprintf(data
->ventoy_left
, sizeof(data
->ventoy_left
), "5%%");
691 scnprintf(data
->ventoy_top
, sizeof(data
->ventoy_top
), "95%%");
692 scnprintf(data
->ventoy_color
, sizeof(data
->ventoy_color
), "%s", "#0000ff");
695 int ventoy_data_cmp_theme(data_theme
*data1
, data_theme
*data2
)
697 if (data1
->display_mode
!= data2
->display_mode
||
698 strcmp(data1
->ventoy_left
, data2
->ventoy_left
) ||
699 strcmp(data1
->ventoy_top
, data2
->ventoy_top
) ||
700 strcmp(data1
->gfxmode
, data2
->gfxmode
) ||
701 strcmp(data1
->ventoy_color
, data2
->ventoy_color
)
707 if (ventoy_path_list_cmp(data1
->filelist
, data2
->filelist
))
712 if (ventoy_path_list_cmp(data1
->fontslist
, data2
->fontslist
))
721 int ventoy_data_save_theme(data_theme
*data
, const char *title
, char *buf
, int buflen
)
724 path_node
*node
= NULL
;
725 data_theme
*def
= g_data_theme
+ bios_max
;
727 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
729 VTOY_JSON_FMT_KEY_L(L1
, title
);
730 VTOY_JSON_FMT_OBJ_BEGIN_N();
734 if (data
->filelist
->next
)
736 VTOY_JSON_FMT_KEY_L(L2
, "file");
737 VTOY_JSON_FMT_ARY_BEGIN_N();
739 for (node
= data
->filelist
; node
; node
= node
->next
)
741 VTOY_JSON_FMT_ITEM_PATH_LN(L3
, node
->path
);
744 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
746 if (def
->default_file
!= data
->default_file
)
748 VTOY_JSON_FMT_SINT_LN(L2
, "default_file", data
->default_file
);
753 VTOY_JSON_FMT_STRN_PATH_LN(L2
, "file", data
->filelist
->path
);
757 if (data
->display_mode
!= def
->display_mode
)
759 if (display_mode_cli
== data
->display_mode
)
761 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "CLI");
763 else if (display_mode_serial
== data
->display_mode
)
765 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "serial");
767 else if (display_mode_ser_console
== data
->display_mode
)
769 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "serial_console");
773 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "GUI");
777 VTOY_JSON_FMT_DIFF_STRN(L2
, "gfxmode", gfxmode
);
779 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_left", ventoy_left
);
780 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_top", ventoy_top
);
781 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_color", ventoy_color
);
785 VTOY_JSON_FMT_KEY_L(L2
, "fonts");
786 VTOY_JSON_FMT_ARY_BEGIN_N();
788 for (node
= data
->fontslist
; node
; node
= node
->next
)
790 VTOY_JSON_FMT_ITEM_PATH_LN(L3
, node
->path
);
793 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
796 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
797 VTOY_JSON_FMT_END(pos
);
803 int ventoy_data_json_theme(data_theme
*data
, char *buf
, int buflen
)
806 path_node
*node
= NULL
;
808 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
809 VTOY_JSON_FMT_OBJ_BEGIN();
811 VTOY_JSON_FMT_SINT("default_file", data
->default_file
);
812 VTOY_JSON_FMT_SINT("display_mode", data
->display_mode
);
813 VTOY_JSON_FMT_STRN("gfxmode", data
->gfxmode
);
815 VTOY_JSON_FMT_STRN("ventoy_color", data
->ventoy_color
);
816 VTOY_JSON_FMT_STRN("ventoy_left", data
->ventoy_left
);
817 VTOY_JSON_FMT_STRN("ventoy_top", data
->ventoy_top
);
819 VTOY_JSON_FMT_KEY("filelist");
820 VTOY_JSON_FMT_ARY_BEGIN();
821 for (node
= data
->filelist
; node
; node
= node
->next
)
823 VTOY_JSON_FMT_OBJ_BEGIN();
824 VTOY_JSON_FMT_STRN("path", node
->path
);
825 VTOY_JSON_FMT_SINT("valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->path
));
826 VTOY_JSON_FMT_OBJ_ENDEX();
828 VTOY_JSON_FMT_ARY_ENDEX();
830 VTOY_JSON_FMT_KEY("fontslist");
831 VTOY_JSON_FMT_ARY_BEGIN();
832 for (node
= data
->fontslist
; node
; node
= node
->next
)
834 VTOY_JSON_FMT_OBJ_BEGIN();
835 VTOY_JSON_FMT_STRN("path", node
->path
);
836 VTOY_JSON_FMT_SINT("valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->path
));
837 VTOY_JSON_FMT_OBJ_ENDEX();
839 VTOY_JSON_FMT_ARY_ENDEX();
841 VTOY_JSON_FMT_OBJ_END();
842 VTOY_JSON_FMT_END(pos
);
847 static int ventoy_api_get_theme(struct mg_connection
*conn
, VTOY_JSON
*json
)
849 api_get_func(conn
, json
, theme
);
853 static int ventoy_api_save_theme(struct mg_connection
*conn
, VTOY_JSON
*json
)
857 data_theme
*data
= NULL
;
859 vtoy_json_get_int(json
, "index", &index
);
860 data
= g_data_theme
+ index
;
862 VTOY_JSON_INT("default_file", data
->default_file
);
863 VTOY_JSON_INT("display_mode", data
->display_mode
);
864 VTOY_JSON_STR("gfxmode", data
->gfxmode
);
865 VTOY_JSON_STR("ventoy_left", data
->ventoy_left
);
866 VTOY_JSON_STR("ventoy_top", data
->ventoy_top
);
867 VTOY_JSON_STR("ventoy_color", data
->ventoy_color
);
869 ret
= ventoy_data_save_all();
871 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
875 static int ventoy_api_theme_add_file(struct mg_connection
*conn
, VTOY_JSON
*json
)
879 const char *path
= NULL
;
880 path_node
*node
= NULL
;
881 path_node
*cur
= NULL
;
882 data_theme
*data
= NULL
;
884 vtoy_json_get_int(json
, "index", &index
);
885 data
= g_data_theme
+ index
;
887 path
= VTOY_JSON_STR_EX("path");
890 node
= zalloc(sizeof(path_node
));
893 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
895 vtoy_list_add(data
->filelist
, cur
, node
);
899 ret
= ventoy_data_save_all();
901 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
905 static int ventoy_api_theme_del_file(struct mg_connection
*conn
, VTOY_JSON
*json
)
909 const char *path
= NULL
;
910 path_node
*node
= NULL
;
911 path_node
*last
= NULL
;
912 data_theme
*data
= NULL
;
914 vtoy_json_get_int(json
, "index", &index
);
915 data
= g_data_theme
+ index
;
917 path
= VTOY_JSON_STR_EX("path");
920 vtoy_list_del(last
, node
, data
->filelist
, path
);
923 ret
= ventoy_data_save_all();
925 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
930 static int ventoy_api_theme_add_font(struct mg_connection
*conn
, VTOY_JSON
*json
)
934 const char *path
= NULL
;
935 path_node
*node
= NULL
;
936 path_node
*cur
= NULL
;
937 data_theme
*data
= NULL
;
939 vtoy_json_get_int(json
, "index", &index
);
940 data
= g_data_theme
+ index
;
942 path
= VTOY_JSON_STR_EX("path");
945 node
= zalloc(sizeof(path_node
));
948 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
949 vtoy_list_add(data
->fontslist
, cur
, node
);
953 ret
= ventoy_data_save_all();
955 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
960 static int ventoy_api_theme_del_font(struct mg_connection
*conn
, VTOY_JSON
*json
)
964 const char *path
= NULL
;
965 path_node
*node
= NULL
;
966 path_node
*last
= NULL
;
967 data_theme
*data
= NULL
;
969 vtoy_json_get_int(json
, "index", &index
);
970 data
= g_data_theme
+ index
;
972 path
= VTOY_JSON_STR_EX("path");
975 vtoy_list_del(last
, node
, data
->fontslist
, path
);
978 ret
= ventoy_data_save_all();
980 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
987 void ventoy_data_default_menu_alias(data_alias
*data
)
989 memset(data
, 0, sizeof(data_alias
));
992 int ventoy_data_cmp_menu_alias(data_alias
*data1
, data_alias
*data2
)
994 data_alias_node
*list1
= NULL
;
995 data_alias_node
*list2
= NULL
;
997 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1001 else if (data1
->list
&& data2
->list
)
1003 list1
= data1
->list
;
1004 list2
= data2
->list
;
1006 while (list1
&& list2
)
1008 if ((list1
->type
!= list2
->type
) ||
1009 strcmp(list1
->path
, list2
->path
) ||
1010 strcmp(list1
->alias
, list2
->alias
))
1015 list1
= list1
->next
;
1016 list2
= list2
->next
;
1019 if (list1
== NULL
&& list2
== NULL
)
1034 int ventoy_data_save_menu_alias(data_alias
*data
, const char *title
, char *buf
, int buflen
)
1037 data_alias_node
*node
= NULL
;
1039 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1041 VTOY_JSON_FMT_KEY_L(L1
, title
);
1042 VTOY_JSON_FMT_ARY_BEGIN_N();
1044 for (node
= data
->list
; node
; node
= node
->next
)
1046 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
1048 if (node
->type
== path_type_file
)
1050 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
1054 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "dir", node
->path
);
1057 VTOY_JSON_FMT_STRN_EX_LN(L3
, "alias", node
->alias
);
1059 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
1062 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1063 VTOY_JSON_FMT_END(pos
);
1069 int ventoy_data_json_menu_alias(data_alias
*data
, char *buf
, int buflen
)
1073 data_alias_node
*node
= NULL
;
1075 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1076 VTOY_JSON_FMT_ARY_BEGIN();
1078 for (node
= data
->list
; node
; node
= node
->next
)
1080 VTOY_JSON_FMT_OBJ_BEGIN();
1082 VTOY_JSON_FMT_UINT("type", node
->type
);
1083 VTOY_JSON_FMT_STRN("path", node
->path
);
1084 if (node
->type
== path_type_file
)
1086 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1090 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1093 VTOY_JSON_FMT_SINT("valid", valid
);
1094 VTOY_JSON_FMT_STRN("alias", node
->alias
);
1096 VTOY_JSON_FMT_OBJ_ENDEX();
1099 VTOY_JSON_FMT_ARY_END();
1100 VTOY_JSON_FMT_END(pos
);
1105 static int ventoy_api_get_alias(struct mg_connection
*conn
, VTOY_JSON
*json
)
1107 api_get_func(conn
, json
, menu_alias
);
1111 static int ventoy_api_save_alias(struct mg_connection
*conn
, VTOY_JSON
*json
)
1114 ret
= ventoy_data_save_all();
1116 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1120 static int ventoy_api_alias_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1124 int type
= path_type_file
;
1125 const char *path
= NULL
;
1126 const char *alias
= NULL
;
1127 data_alias_node
*node
= NULL
;
1128 data_alias_node
*cur
= NULL
;
1129 data_alias
*data
= NULL
;
1131 vtoy_json_get_int(json
, "index", &index
);
1132 data
= g_data_menu_alias
+ index
;
1134 vtoy_json_get_int(json
, "type", &type
);
1136 path
= VTOY_JSON_STR_EX("path");
1137 alias
= VTOY_JSON_STR_EX("alias");
1140 node
= zalloc(sizeof(data_alias_node
));
1144 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1145 scnprintf(node
->alias
, sizeof(node
->alias
), "%s", alias
);
1147 vtoy_list_add(data
->list
, cur
, node
);
1151 ret
= ventoy_data_save_all();
1153 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1157 static int ventoy_api_alias_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1161 const char *path
= NULL
;
1162 data_alias_node
*last
= NULL
;
1163 data_alias_node
*node
= NULL
;
1164 data_alias
*data
= NULL
;
1166 vtoy_json_get_int(json
, "index", &index
);
1167 data
= g_data_menu_alias
+ index
;
1169 path
= VTOY_JSON_STR_EX("path");
1172 vtoy_list_del(last
, node
, data
->list
, path
);
1175 ret
= ventoy_data_save_all();
1177 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1184 void ventoy_data_default_menu_tip(data_tip
*data
)
1186 memset(data
, 0, sizeof(data_tip
));
1188 scnprintf(data
->left
, sizeof(data
->left
), "10%%");
1189 scnprintf(data
->top
, sizeof(data
->top
), "81%%");
1190 scnprintf(data
->color
, sizeof(data
->color
), "%s", "blue");
1193 int ventoy_data_cmp_menu_tip(data_tip
*data1
, data_tip
*data2
)
1195 data_tip_node
*list1
= NULL
;
1196 data_tip_node
*list2
= NULL
;
1198 if (strcmp(data1
->left
, data2
->left
) || strcmp(data1
->top
, data2
->top
) || strcmp(data1
->color
, data2
->color
))
1203 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1207 else if (data1
->list
&& data2
->list
)
1209 list1
= data1
->list
;
1210 list2
= data2
->list
;
1212 while (list1
&& list2
)
1214 if ((list1
->type
!= list2
->type
) ||
1215 strcmp(list1
->path
, list2
->path
) ||
1216 strcmp(list1
->tip
, list2
->tip
))
1221 list1
= list1
->next
;
1222 list2
= list2
->next
;
1225 if (list1
== NULL
&& list2
== NULL
)
1240 int ventoy_data_save_menu_tip(data_tip
*data
, const char *title
, char *buf
, int buflen
)
1243 data_tip_node
*node
= NULL
;
1244 data_tip
*def
= g_data_menu_tip
+ bios_max
;
1246 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1247 VTOY_JSON_FMT_KEY_L(L1
, title
);
1248 VTOY_JSON_FMT_OBJ_BEGIN_N();
1250 VTOY_JSON_FMT_DIFF_STRN(L2
, "left", left
);
1251 VTOY_JSON_FMT_DIFF_STRN(L2
, "top", top
);
1252 VTOY_JSON_FMT_DIFF_STRN(L2
, "color", color
);
1256 VTOY_JSON_FMT_KEY_L(L2
, "tips");
1257 VTOY_JSON_FMT_ARY_BEGIN_N();
1259 for (node
= data
->list
; node
; node
= node
->next
)
1261 VTOY_JSON_FMT_OBJ_BEGIN_LN(L3
);
1263 if (node
->type
== path_type_file
)
1265 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "image", node
->path
);
1269 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "dir", node
->path
);
1271 VTOY_JSON_FMT_STRN_EX_LN(L4
, "tip", node
->tip
);
1273 VTOY_JSON_FMT_OBJ_ENDEX_LN(L3
);
1276 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
1279 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
1281 VTOY_JSON_FMT_END(pos
);
1287 int ventoy_data_json_menu_tip(data_tip
*data
, char *buf
, int buflen
)
1291 data_tip_node
*node
= NULL
;
1293 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1295 VTOY_JSON_FMT_OBJ_BEGIN();
1297 VTOY_JSON_FMT_STRN("left", data
->left
);
1298 VTOY_JSON_FMT_STRN("top", data
->top
);
1299 VTOY_JSON_FMT_STRN("color", data
->color
);
1301 VTOY_JSON_FMT_KEY("tips");
1302 VTOY_JSON_FMT_ARY_BEGIN();
1304 for (node
= data
->list
; node
; node
= node
->next
)
1306 VTOY_JSON_FMT_OBJ_BEGIN();
1308 VTOY_JSON_FMT_UINT("type", node
->type
);
1309 VTOY_JSON_FMT_STRN("path", node
->path
);
1310 if (node
->type
== path_type_file
)
1312 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1316 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1319 VTOY_JSON_FMT_SINT("valid", valid
);
1320 VTOY_JSON_FMT_STRN("tip", node
->tip
);
1322 VTOY_JSON_FMT_OBJ_ENDEX();
1325 VTOY_JSON_FMT_ARY_ENDEX();
1327 VTOY_JSON_FMT_OBJ_END();
1328 VTOY_JSON_FMT_END(pos
);
1333 static int ventoy_api_get_tip(struct mg_connection
*conn
, VTOY_JSON
*json
)
1335 api_get_func(conn
, json
, menu_tip
);
1339 static int ventoy_api_save_tip(struct mg_connection
*conn
, VTOY_JSON
*json
)
1343 data_tip
*data
= NULL
;
1345 vtoy_json_get_int(json
, "index", &index
);
1346 data
= g_data_menu_tip
+ index
;
1348 VTOY_JSON_STR("left", data
->left
);
1349 VTOY_JSON_STR("top", data
->top
);
1350 VTOY_JSON_STR("color", data
->color
);
1352 ret
= ventoy_data_save_all();
1354 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1358 static int ventoy_api_tip_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1362 int type
= path_type_file
;
1363 const char *path
= NULL
;
1364 const char *tip
= NULL
;
1365 data_tip_node
*node
= NULL
;
1366 data_tip_node
*cur
= NULL
;
1367 data_tip
*data
= NULL
;
1369 vtoy_json_get_int(json
, "index", &index
);
1370 data
= g_data_menu_tip
+ index
;
1372 vtoy_json_get_int(json
, "type", &type
);
1374 path
= VTOY_JSON_STR_EX("path");
1375 tip
= VTOY_JSON_STR_EX("tip");
1378 node
= zalloc(sizeof(data_tip_node
));
1382 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1383 scnprintf(node
->tip
, sizeof(node
->tip
), "%s", tip
);
1385 vtoy_list_add(data
->list
, cur
, node
);
1389 ret
= ventoy_data_save_all();
1391 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1395 static int ventoy_api_tip_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1399 const char *path
= NULL
;
1400 data_tip_node
*last
= NULL
;
1401 data_tip_node
*node
= NULL
;
1402 data_tip
*data
= NULL
;
1404 vtoy_json_get_int(json
, "index", &index
);
1405 data
= g_data_menu_tip
+ index
;
1407 path
= VTOY_JSON_STR_EX("path");
1410 vtoy_list_del(last
, node
, data
->list
, path
);
1413 ret
= ventoy_data_save_all();
1415 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1422 void ventoy_data_default_menu_class(data_class
*data
)
1424 memset(data
, 0, sizeof(data_class
));
1427 int ventoy_data_cmp_menu_class(data_class
*data1
, data_class
*data2
)
1429 data_class_node
*list1
= NULL
;
1430 data_class_node
*list2
= NULL
;
1432 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1436 else if (data1
->list
&& data2
->list
)
1438 list1
= data1
->list
;
1439 list2
= data2
->list
;
1441 while (list1
&& list2
)
1443 if ((list1
->type
!= list2
->type
) ||
1444 strcmp(list1
->path
, list2
->path
) ||
1445 strcmp(list1
->class, list2
->class))
1450 list1
= list1
->next
;
1451 list2
= list2
->next
;
1454 if (list1
== NULL
&& list2
== NULL
)
1469 int ventoy_data_save_menu_class(data_class
*data
, const char *title
, char *buf
, int buflen
)
1472 data_class_node
*node
= NULL
;
1474 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1476 VTOY_JSON_FMT_KEY_L(L1
, title
);
1477 VTOY_JSON_FMT_ARY_BEGIN_N();
1479 for (node
= data
->list
; node
; node
= node
->next
)
1481 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
1483 if (node
->type
== class_type_key
)
1485 VTOY_JSON_FMT_STRN_LN(L3
, "key", node
->path
);
1487 else if (node
->type
== class_type_dir
)
1489 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "dir", node
->path
);
1493 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
1495 VTOY_JSON_FMT_STRN_LN(L3
, "class", node
->class);
1497 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
1500 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1501 VTOY_JSON_FMT_END(pos
);
1507 int ventoy_data_json_menu_class(data_class
*data
, char *buf
, int buflen
)
1511 data_class_node
*node
= NULL
;
1513 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1514 VTOY_JSON_FMT_ARY_BEGIN();
1516 for (node
= data
->list
; node
; node
= node
->next
)
1518 VTOY_JSON_FMT_OBJ_BEGIN();
1520 VTOY_JSON_FMT_UINT("type", node
->type
);
1521 VTOY_JSON_FMT_STRN("path", node
->path
);
1523 if (node
->type
== class_type_key
)
1529 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1531 VTOY_JSON_FMT_SINT("valid", valid
);
1533 VTOY_JSON_FMT_STRN("class", node
->class);
1535 VTOY_JSON_FMT_OBJ_ENDEX();
1538 VTOY_JSON_FMT_ARY_END();
1539 VTOY_JSON_FMT_END(pos
);
1545 static int ventoy_api_get_class(struct mg_connection
*conn
, VTOY_JSON
*json
)
1547 api_get_func(conn
, json
, menu_class
);
1551 static int ventoy_api_save_class(struct mg_connection
*conn
, VTOY_JSON
*json
)
1554 ret
= ventoy_data_save_all();
1556 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1560 static int ventoy_api_class_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1564 int type
= class_type_key
;
1565 const char *path
= NULL
;
1566 const char *class = NULL
;
1567 data_class_node
*node
= NULL
;
1568 data_class_node
*cur
= NULL
;
1569 data_class
*data
= NULL
;
1571 vtoy_json_get_int(json
, "index", &index
);
1572 data
= g_data_menu_class
+ index
;
1574 vtoy_json_get_int(json
, "type", &type
);
1576 path
= VTOY_JSON_STR_EX("path");
1577 class = VTOY_JSON_STR_EX("class");
1580 node
= zalloc(sizeof(data_class_node
));
1585 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1586 scnprintf(node
->class, sizeof(node
->class), "%s", class);
1588 vtoy_list_add(data
->list
, cur
, node
);
1592 ret
= ventoy_data_save_all();
1594 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1598 static int ventoy_api_class_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1602 const char *path
= NULL
;
1603 data_class_node
*last
= NULL
;
1604 data_class_node
*node
= NULL
;
1605 data_class
*data
= NULL
;
1607 vtoy_json_get_int(json
, "index", &index
);
1608 data
= g_data_menu_class
+ index
;
1610 path
= VTOY_JSON_STR_EX("path");
1613 vtoy_list_del(last
, node
, data
->list
, path
);
1616 ret
= ventoy_data_save_all();
1618 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1625 void ventoy_data_default_auto_memdisk(data_auto_memdisk
*data
)
1627 memset(data
, 0, sizeof(data_auto_memdisk
));
1630 int ventoy_data_cmp_auto_memdisk(data_auto_memdisk
*data1
, data_auto_memdisk
*data2
)
1632 return ventoy_path_list_cmp(data1
->list
, data2
->list
);
1635 int ventoy_data_save_auto_memdisk(data_auto_memdisk
*data
, const char *title
, char *buf
, int buflen
)
1638 path_node
*node
= NULL
;
1640 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1642 VTOY_JSON_FMT_KEY_L(L1
, title
);
1643 VTOY_JSON_FMT_ARY_BEGIN_N();
1645 for (node
= data
->list
; node
; node
= node
->next
)
1647 VTOY_JSON_FMT_ITEM_PATH_LN(L2
, node
->path
);
1650 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1651 VTOY_JSON_FMT_END(pos
);
1656 int ventoy_data_json_auto_memdisk(data_auto_memdisk
*data
, char *buf
, int buflen
)
1660 path_node
*node
= NULL
;
1662 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1663 VTOY_JSON_FMT_ARY_BEGIN();
1665 for (node
= data
->list
; node
; node
= node
->next
)
1667 VTOY_JSON_FMT_OBJ_BEGIN();
1669 VTOY_JSON_FMT_STRN("path", node
->path
);
1670 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1671 VTOY_JSON_FMT_SINT("valid", valid
);
1673 VTOY_JSON_FMT_OBJ_ENDEX();
1676 VTOY_JSON_FMT_ARY_END();
1677 VTOY_JSON_FMT_END(pos
);
1682 static int ventoy_api_get_auto_memdisk(struct mg_connection
*conn
, VTOY_JSON
*json
)
1684 api_get_func(conn
, json
, auto_memdisk
);
1688 static int ventoy_api_save_auto_memdisk(struct mg_connection
*conn
, VTOY_JSON
*json
)
1692 ret
= ventoy_data_save_all();
1694 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1698 static int ventoy_api_auto_memdisk_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1702 const char *path
= NULL
;
1703 path_node
*node
= NULL
;
1704 path_node
*cur
= NULL
;
1705 data_auto_memdisk
*data
= NULL
;
1707 vtoy_json_get_int(json
, "index", &index
);
1708 data
= g_data_auto_memdisk
+ index
;
1710 path
= VTOY_JSON_STR_EX("path");
1713 node
= zalloc(sizeof(path_node
));
1716 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1717 vtoy_list_add(data
->list
, cur
, node
);
1721 ret
= ventoy_data_save_all();
1723 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1727 static int ventoy_api_auto_memdisk_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1731 const char *path
= NULL
;
1732 path_node
*last
= NULL
;
1733 path_node
*node
= NULL
;
1734 data_auto_memdisk
*data
= NULL
;
1736 vtoy_json_get_int(json
, "index", &index
);
1737 data
= g_data_auto_memdisk
+ index
;
1739 path
= VTOY_JSON_STR_EX("path");
1742 vtoy_list_del(last
, node
, data
->list
, path
);
1745 ret
= ventoy_data_save_all();
1747 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1754 void ventoy_data_default_image_list(data_image_list
*data
)
1756 memset(data
, 0, sizeof(data_image_list
));
1759 int ventoy_data_cmp_image_list(data_image_list
*data1
, data_image_list
*data2
)
1761 if (data1
->type
!= data2
->type
)
1763 if (data1
->list
|| data2
->list
)
1773 return ventoy_path_list_cmp(data1
->list
, data2
->list
);
1776 int ventoy_data_save_image_list(data_image_list
*data
, const char *title
, char *buf
, int buflen
)
1780 path_node
*node
= NULL
;
1790 prelen
= (int)strlen("image_list");
1792 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1794 if (data
->type
== 0)
1796 scnprintf(newtitle
, sizeof(newtitle
), "image_list%s", title
+ prelen
);
1800 scnprintf(newtitle
, sizeof(newtitle
), "image_blacklist%s", title
+ prelen
);
1802 VTOY_JSON_FMT_KEY_L(L1
, newtitle
);
1804 VTOY_JSON_FMT_ARY_BEGIN_N();
1806 for (node
= data
->list
; node
; node
= node
->next
)
1808 VTOY_JSON_FMT_ITEM_PATH_LN(L2
, node
->path
);
1811 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1812 VTOY_JSON_FMT_END(pos
);
1817 int ventoy_data_json_image_list(data_image_list
*data
, char *buf
, int buflen
)
1821 path_node
*node
= NULL
;
1823 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1825 VTOY_JSON_FMT_OBJ_BEGIN();
1826 VTOY_JSON_FMT_SINT("type", data
->type
);
1828 VTOY_JSON_FMT_KEY("list");
1829 VTOY_JSON_FMT_ARY_BEGIN();
1831 for (node
= data
->list
; node
; node
= node
->next
)
1833 VTOY_JSON_FMT_OBJ_BEGIN();
1835 VTOY_JSON_FMT_STRN("path", node
->path
);
1836 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1837 VTOY_JSON_FMT_SINT("valid", valid
);
1839 VTOY_JSON_FMT_OBJ_ENDEX();
1842 VTOY_JSON_FMT_ARY_ENDEX();
1843 VTOY_JSON_FMT_OBJ_END();
1845 VTOY_JSON_FMT_END(pos
);
1850 static int ventoy_api_get_image_list(struct mg_connection
*conn
, VTOY_JSON
*json
)
1852 api_get_func(conn
, json
, image_list
);
1856 static int ventoy_api_save_image_list(struct mg_connection
*conn
, VTOY_JSON
*json
)
1860 data_image_list
*data
= NULL
;
1862 vtoy_json_get_int(json
, "index", &index
);
1863 data
= g_data_image_list
+ index
;
1865 VTOY_JSON_INT("type", data
->type
);
1867 ret
= ventoy_data_save_all();
1869 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1873 static int ventoy_api_image_list_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1877 const char *path
= NULL
;
1878 path_node
*node
= NULL
;
1879 path_node
*cur
= NULL
;
1880 data_image_list
*data
= NULL
;
1882 vtoy_json_get_int(json
, "index", &index
);
1883 data
= g_data_image_list
+ index
;
1885 path
= VTOY_JSON_STR_EX("path");
1888 node
= zalloc(sizeof(path_node
));
1891 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1892 vtoy_list_add(data
->list
, cur
, node
);
1896 ret
= ventoy_data_save_all();
1898 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1902 static int ventoy_api_image_list_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1906 const char *path
= NULL
;
1907 path_node
*last
= NULL
;
1908 path_node
*node
= NULL
;
1909 data_image_list
*data
= NULL
;
1911 vtoy_json_get_int(json
, "index", &index
);
1912 data
= g_data_image_list
+ index
;
1914 path
= VTOY_JSON_STR_EX("path");
1917 vtoy_list_del(last
, node
, data
->list
, path
);
1920 ret
= ventoy_data_save_all();
1922 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1929 void ventoy_data_default_password(data_password
*data
)
1931 memset(data
, 0, sizeof(data_password
));
1934 int ventoy_data_cmp_password(data_password
*data1
, data_password
*data2
)
1936 menu_password
*list1
= NULL
;
1937 menu_password
*list2
= NULL
;
1939 if (strcmp(data1
->bootpwd
, data2
->bootpwd
) ||
1940 strcmp(data1
->isopwd
, data2
->isopwd
) ||
1941 strcmp(data1
->wimpwd
, data2
->wimpwd
) ||
1942 strcmp(data1
->vhdpwd
, data2
->vhdpwd
) ||
1943 strcmp(data1
->imgpwd
, data2
->imgpwd
) ||
1944 strcmp(data1
->efipwd
, data2
->efipwd
) ||
1945 strcmp(data1
->vtoypwd
, data2
->vtoypwd
)
1951 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1955 else if (data1
->list
&& data2
->list
)
1957 list1
= data1
->list
;
1958 list2
= data2
->list
;
1960 while (list1
&& list2
)
1962 if ((list1
->type
!= list2
->type
) || strcmp(list1
->path
, list2
->path
))
1967 list1
= list1
->next
;
1968 list2
= list2
->next
;
1971 if (list1
== NULL
&& list2
== NULL
)
1986 int ventoy_data_save_password(data_password
*data
, const char *title
, char *buf
, int buflen
)
1989 menu_password
*node
= NULL
;
1990 data_password
*def
= g_data_password
+ bios_max
;
1992 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1993 VTOY_JSON_FMT_KEY_L(L1
, title
);
1994 VTOY_JSON_FMT_OBJ_BEGIN_N();
1996 VTOY_JSON_FMT_DIFF_STRN(L2
, "bootpwd", bootpwd
);
1997 VTOY_JSON_FMT_DIFF_STRN(L2
, "isopwd", isopwd
);
1998 VTOY_JSON_FMT_DIFF_STRN(L2
, "wimpwd", wimpwd
);
1999 VTOY_JSON_FMT_DIFF_STRN(L2
, "vhdpwd", vhdpwd
);
2000 VTOY_JSON_FMT_DIFF_STRN(L2
, "imgpwd", imgpwd
);
2001 VTOY_JSON_FMT_DIFF_STRN(L2
, "efipwd", efipwd
);
2002 VTOY_JSON_FMT_DIFF_STRN(L2
, "vtoypwd", vtoypwd
);
2006 VTOY_JSON_FMT_KEY_L(L2
, "menupwd");
2007 VTOY_JSON_FMT_ARY_BEGIN_N();
2009 for (node
= data
->list
; node
; node
= node
->next
)
2011 VTOY_JSON_FMT_OBJ_BEGIN_LN(L3
);
2013 if (node
->type
== 0)
2015 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "file", node
->path
);
2019 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "parent", node
->path
);
2021 VTOY_JSON_FMT_STRN_LN(L4
, "pwd", node
->pwd
);
2023 VTOY_JSON_FMT_OBJ_ENDEX_LN(L3
);
2026 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
2029 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
2031 VTOY_JSON_FMT_END(pos
);
2037 int ventoy_data_json_password(data_password
*data
, char *buf
, int buflen
)
2041 menu_password
*node
= NULL
;
2043 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2045 VTOY_JSON_FMT_OBJ_BEGIN();
2047 VTOY_JSON_FMT_STRN("bootpwd", data
->bootpwd
);
2048 VTOY_JSON_FMT_STRN("isopwd", data
->isopwd
);
2049 VTOY_JSON_FMT_STRN("wimpwd", data
->wimpwd
);
2050 VTOY_JSON_FMT_STRN("vhdpwd", data
->vhdpwd
);
2051 VTOY_JSON_FMT_STRN("imgpwd", data
->imgpwd
);
2052 VTOY_JSON_FMT_STRN("efipwd", data
->efipwd
);
2053 VTOY_JSON_FMT_STRN("vtoypwd", data
->vtoypwd
);
2055 VTOY_JSON_FMT_KEY("list");
2056 VTOY_JSON_FMT_ARY_BEGIN();
2058 for (node
= data
->list
; node
; node
= node
->next
)
2060 VTOY_JSON_FMT_OBJ_BEGIN();
2062 VTOY_JSON_FMT_SINT("type", node
->type
);
2063 VTOY_JSON_FMT_STRN("path", node
->path
);
2064 if (node
->type
== path_type_file
)
2066 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2070 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
2073 VTOY_JSON_FMT_SINT("valid", valid
);
2074 VTOY_JSON_FMT_STRN("pwd", node
->pwd
);
2076 VTOY_JSON_FMT_OBJ_ENDEX();
2079 VTOY_JSON_FMT_ARY_ENDEX();
2081 VTOY_JSON_FMT_OBJ_END();
2082 VTOY_JSON_FMT_END(pos
);
2087 static int ventoy_api_get_password(struct mg_connection
*conn
, VTOY_JSON
*json
)
2089 api_get_func(conn
, json
, password
);
2093 static int ventoy_api_save_password(struct mg_connection
*conn
, VTOY_JSON
*json
)
2097 data_password
*data
= NULL
;
2099 vtoy_json_get_int(json
, "index", &index
);
2100 data
= g_data_password
+ index
;
2102 VTOY_JSON_STR("bootpwd", data
->bootpwd
);
2103 VTOY_JSON_STR("isopwd", data
->isopwd
);
2104 VTOY_JSON_STR("wimpwd", data
->wimpwd
);
2105 VTOY_JSON_STR("vhdpwd", data
->vhdpwd
);
2106 VTOY_JSON_STR("imgpwd", data
->imgpwd
);
2107 VTOY_JSON_STR("efipwd", data
->efipwd
);
2108 VTOY_JSON_STR("vtoypwd", data
->vtoypwd
);
2110 ret
= ventoy_data_save_all();
2112 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2116 static int ventoy_api_password_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2121 const char *path
= NULL
;
2122 const char *pwd
= NULL
;
2123 menu_password
*node
= NULL
;
2124 menu_password
*cur
= NULL
;
2125 data_password
*data
= NULL
;
2127 vtoy_json_get_int(json
, "index", &index
);
2128 data
= g_data_password
+ index
;
2130 vtoy_json_get_int(json
, "type", &type
);
2132 path
= VTOY_JSON_STR_EX("path");
2133 pwd
= VTOY_JSON_STR_EX("pwd");
2136 node
= zalloc(sizeof(menu_password
));
2140 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2141 scnprintf(node
->pwd
, sizeof(node
->pwd
), "%s", pwd
);
2143 vtoy_list_add(data
->list
, cur
, node
);
2147 ret
= ventoy_data_save_all();
2149 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2153 static int ventoy_api_password_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2157 const char *path
= NULL
;
2158 menu_password
*last
= NULL
;
2159 menu_password
*node
= NULL
;
2160 data_password
*data
= NULL
;
2162 vtoy_json_get_int(json
, "index", &index
);
2163 data
= g_data_password
+ index
;
2165 path
= VTOY_JSON_STR_EX("path");
2168 vtoy_list_del(last
, node
, data
->list
, path
);
2171 ret
= ventoy_data_save_all();
2173 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2180 void ventoy_data_default_conf_replace(data_conf_replace
*data
)
2182 memset(data
, 0, sizeof(data_conf_replace
));
2185 int ventoy_data_cmp_conf_replace(data_conf_replace
*data1
, data_conf_replace
*data2
)
2187 conf_replace_node
*list1
= NULL
;
2188 conf_replace_node
*list2
= NULL
;
2190 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2194 else if (data1
->list
&& data2
->list
)
2196 list1
= data1
->list
;
2197 list2
= data2
->list
;
2199 while (list1
&& list2
)
2201 if (list1
->image
!= list2
->image
||
2202 strcmp(list1
->path
, list2
->path
) ||
2203 strcmp(list1
->org
, list2
->org
) ||
2204 strcmp(list1
->new, list2
->new)
2210 list1
= list1
->next
;
2211 list2
= list2
->next
;
2214 if (list1
== NULL
&& list2
== NULL
)
2229 int ventoy_data_save_conf_replace(data_conf_replace
*data
, const char *title
, char *buf
, int buflen
)
2232 conf_replace_node
*node
= NULL
;
2234 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2236 VTOY_JSON_FMT_KEY_L(L1
, title
);
2237 VTOY_JSON_FMT_ARY_BEGIN_N();
2239 for (node
= data
->list
; node
; node
= node
->next
)
2241 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2243 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "iso", node
->path
);
2244 VTOY_JSON_FMT_STRN_LN(L3
, "org", node
->org
);
2245 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "new", node
->new);
2248 VTOY_JSON_FMT_SINT_LN(L3
, "img", node
->image
);
2251 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2254 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2255 VTOY_JSON_FMT_END(pos
);
2261 int ventoy_data_json_conf_replace(data_conf_replace
*data
, char *buf
, int buflen
)
2264 conf_replace_node
*node
= NULL
;
2266 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2267 VTOY_JSON_FMT_ARY_BEGIN();
2269 for (node
= data
->list
; node
; node
= node
->next
)
2271 VTOY_JSON_FMT_OBJ_BEGIN();
2273 VTOY_JSON_FMT_STRN("path", node
->path
);
2274 VTOY_JSON_FMT_SINT("valid", ventoy_check_fuzzy_path(node
->path
, 1));
2275 VTOY_JSON_FMT_STRN("org", node
->org
);
2276 VTOY_JSON_FMT_STRN("new", node
->new);
2277 VTOY_JSON_FMT_SINT("new_valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->new));
2278 VTOY_JSON_FMT_SINT("img", node
->image
);
2280 VTOY_JSON_FMT_OBJ_ENDEX();
2283 VTOY_JSON_FMT_ARY_END();
2284 VTOY_JSON_FMT_END(pos
);
2289 static int ventoy_api_get_conf_replace(struct mg_connection
*conn
, VTOY_JSON
*json
)
2291 api_get_func(conn
, json
, conf_replace
);
2295 static int ventoy_api_save_conf_replace(struct mg_connection
*conn
, VTOY_JSON
*json
)
2298 ret
= ventoy_data_save_all();
2300 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2304 static int ventoy_api_conf_replace_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2309 const char *path
= NULL
;
2310 const char *org
= NULL
;
2311 const char *new = NULL
;
2312 conf_replace_node
*node
= NULL
;
2313 conf_replace_node
*cur
= NULL
;
2314 data_conf_replace
*data
= NULL
;
2316 vtoy_json_get_int(json
, "img", &image
);
2318 vtoy_json_get_int(json
, "index", &index
);
2319 data
= g_data_conf_replace
+ index
;
2321 path
= VTOY_JSON_STR_EX("path");
2322 org
= VTOY_JSON_STR_EX("org");
2323 new = VTOY_JSON_STR_EX("new");
2324 if (path
&& org
&& new)
2326 node
= zalloc(sizeof(conf_replace_node
));
2329 node
->image
= image
;
2330 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2331 scnprintf(node
->org
, sizeof(node
->org
), "%s", org
);
2332 scnprintf(node
->new, sizeof(node
->new), "%s", new);
2334 vtoy_list_add(data
->list
, cur
, node
);
2338 ret
= ventoy_data_save_all();
2340 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2344 static int ventoy_api_conf_replace_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2348 const char *path
= NULL
;
2349 conf_replace_node
*last
= NULL
;
2350 conf_replace_node
*node
= NULL
;
2351 data_conf_replace
*data
= NULL
;
2353 vtoy_json_get_int(json
, "index", &index
);
2354 data
= g_data_conf_replace
+ index
;
2356 path
= VTOY_JSON_STR_EX("path");
2359 vtoy_list_del(last
, node
, data
->list
, path
);
2362 ret
= ventoy_data_save_all();
2364 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2372 void ventoy_data_default_dud(data_dud
*data
)
2374 memset(data
, 0, sizeof(data_dud
));
2377 int ventoy_data_cmp_dud(data_dud
*data1
, data_dud
*data2
)
2379 dud_node
*list1
= NULL
;
2380 dud_node
*list2
= NULL
;
2382 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2386 else if (data1
->list
&& data2
->list
)
2388 list1
= data1
->list
;
2389 list2
= data2
->list
;
2391 while (list1
&& list2
)
2393 if (strcmp(list1
->path
, list2
->path
))
2398 /* no need to compare dud list with default */
2399 list1
= list1
->next
;
2400 list2
= list2
->next
;
2403 if (list1
== NULL
&& list2
== NULL
)
2418 int ventoy_data_save_dud(data_dud
*data
, const char *title
, char *buf
, int buflen
)
2421 dud_node
*node
= NULL
;
2422 path_node
*pathnode
= NULL
;
2424 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2426 VTOY_JSON_FMT_KEY_L(L1
, title
);
2427 VTOY_JSON_FMT_ARY_BEGIN_N();
2429 for (node
= data
->list
; node
; node
= node
->next
)
2431 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2432 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
2434 VTOY_JSON_FMT_KEY_L(L3
, "dud");
2435 VTOY_JSON_FMT_ARY_BEGIN_N();
2436 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2438 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
2440 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
2442 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2445 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2446 VTOY_JSON_FMT_END(pos
);
2452 int ventoy_data_json_dud(data_dud
*data
, char *buf
, int buflen
)
2456 dud_node
*node
= NULL
;
2457 path_node
*pathnode
= NULL
;
2459 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2460 VTOY_JSON_FMT_ARY_BEGIN();
2462 for (node
= data
->list
; node
; node
= node
->next
)
2464 VTOY_JSON_FMT_OBJ_BEGIN();
2466 VTOY_JSON_FMT_STRN("path", node
->path
);
2467 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2468 VTOY_JSON_FMT_SINT("valid", valid
);
2471 VTOY_JSON_FMT_KEY("list");
2472 VTOY_JSON_FMT_ARY_BEGIN();
2473 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2475 VTOY_JSON_FMT_OBJ_BEGIN();
2476 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
2478 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
2479 VTOY_JSON_FMT_SINT("valid", valid
);
2480 VTOY_JSON_FMT_OBJ_ENDEX();
2482 VTOY_JSON_FMT_ARY_ENDEX();
2485 VTOY_JSON_FMT_OBJ_ENDEX();
2488 VTOY_JSON_FMT_ARY_END();
2489 VTOY_JSON_FMT_END(pos
);
2494 static int ventoy_api_get_dud(struct mg_connection
*conn
, VTOY_JSON
*json
)
2496 api_get_func(conn
, json
, dud
);
2500 static int ventoy_api_save_dud(struct mg_connection
*conn
, VTOY_JSON
*json
)
2503 ret
= ventoy_data_save_all();
2505 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2510 static int ventoy_api_dud_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2514 const char *path
= NULL
;
2515 dud_node
*node
= NULL
;
2516 dud_node
*cur
= NULL
;
2517 data_dud
*data
= NULL
;
2518 VTOY_JSON
*array
= NULL
;
2520 vtoy_json_get_int(json
, "index", &index
);
2521 data
= g_data_dud
+ index
;
2523 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "dud");
2524 path
= VTOY_JSON_STR_EX("path");
2527 node
= zalloc(sizeof(dud_node
));
2530 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2531 node
->list
= ventoy_path_node_add_array(array
);
2533 vtoy_list_add(data
->list
, cur
, node
);
2537 ret
= ventoy_data_save_all();
2539 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2543 static int ventoy_api_dud_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2547 const char *path
= NULL
;
2548 dud_node
*last
= NULL
;
2549 dud_node
*node
= NULL
;
2550 data_dud
*data
= NULL
;
2552 vtoy_json_get_int(json
, "index", &index
);
2553 data
= g_data_dud
+ index
;
2555 path
= VTOY_JSON_STR_EX("path");
2558 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
2561 ret
= ventoy_data_save_all();
2563 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2568 static int ventoy_api_dud_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2572 const char *path
= NULL
;
2573 const char *outpath
= NULL
;
2574 path_node
*pcur
= NULL
;
2575 path_node
*pnode
= NULL
;
2576 dud_node
*node
= NULL
;
2577 data_dud
*data
= NULL
;
2579 vtoy_json_get_int(json
, "index", &index
);
2580 data
= g_data_dud
+ index
;
2582 path
= VTOY_JSON_STR_EX("path");
2583 outpath
= VTOY_JSON_STR_EX("outpath");
2584 if (path
&& outpath
)
2586 for (node
= data
->list
; node
; node
= node
->next
)
2588 if (strcmp(outpath
, node
->path
) == 0)
2590 pnode
= zalloc(sizeof(path_node
));
2593 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
2594 vtoy_list_add(node
->list
, pcur
, pnode
);
2602 ret
= ventoy_data_save_all();
2604 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2608 static int ventoy_api_dud_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2612 const char *path
= NULL
;
2613 const char *outpath
= NULL
;
2614 path_node
*plast
= NULL
;
2615 path_node
*pnode
= NULL
;
2616 dud_node
*node
= NULL
;
2617 data_dud
*data
= NULL
;
2619 vtoy_json_get_int(json
, "index", &index
);
2620 data
= g_data_dud
+ index
;
2622 path
= VTOY_JSON_STR_EX("path");
2623 outpath
= VTOY_JSON_STR_EX("outpath");
2624 if (path
&& outpath
)
2626 for (node
= data
->list
; node
; node
= node
->next
)
2628 if (strcmp(outpath
, node
->path
) == 0)
2630 vtoy_list_del(plast
, pnode
, node
->list
, path
);
2636 ret
= ventoy_data_save_all();
2638 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2646 void ventoy_data_default_auto_install(data_auto_install
*data
)
2648 memset(data
, 0, sizeof(data_auto_install
));
2651 int ventoy_data_cmp_auto_install(data_auto_install
*data1
, data_auto_install
*data2
)
2653 auto_install_node
*list1
= NULL
;
2654 auto_install_node
*list2
= NULL
;
2656 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2660 else if (data1
->list
&& data2
->list
)
2662 list1
= data1
->list
;
2663 list2
= data2
->list
;
2665 while (list1
&& list2
)
2667 if (list1
->timeout
!= list2
->timeout
||
2668 list1
->autosel
!= list2
->autosel
||
2669 strcmp(list1
->path
, list2
->path
))
2674 /* no need to compare auto install list with default */
2675 list1
= list1
->next
;
2676 list2
= list2
->next
;
2679 if (list1
== NULL
&& list2
== NULL
)
2694 int ventoy_data_save_auto_install(data_auto_install
*data
, const char *title
, char *buf
, int buflen
)
2697 auto_install_node
*node
= NULL
;
2698 path_node
*pathnode
= NULL
;
2700 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2702 VTOY_JSON_FMT_KEY_L(L1
, title
);
2703 VTOY_JSON_FMT_ARY_BEGIN_N();
2705 for (node
= data
->list
; node
; node
= node
->next
)
2707 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2708 if (node
->type
== 0)
2710 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
2714 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
2718 VTOY_JSON_FMT_KEY_L(L3
, "template");
2719 VTOY_JSON_FMT_ARY_BEGIN_N();
2720 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2722 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
2724 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
2726 if (node
->timeouten
)
2728 VTOY_JSON_FMT_SINT_LN(L3
, "timeout", node
->timeout
);
2731 if (node
->autoselen
)
2733 VTOY_JSON_FMT_SINT_LN(L3
, "autosel", node
->autosel
);
2736 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2739 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2740 VTOY_JSON_FMT_END(pos
);
2746 int ventoy_data_json_auto_install(data_auto_install
*data
, char *buf
, int buflen
)
2750 auto_install_node
*node
= NULL
;
2751 path_node
*pathnode
= NULL
;
2753 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2754 VTOY_JSON_FMT_ARY_BEGIN();
2756 for (node
= data
->list
; node
; node
= node
->next
)
2758 VTOY_JSON_FMT_OBJ_BEGIN();
2760 VTOY_JSON_FMT_STRN("path", node
->path
);
2762 if (node
->type
== 0)
2764 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2768 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
2770 VTOY_JSON_FMT_SINT("valid", valid
);
2771 VTOY_JSON_FMT_SINT("type", node
->type
);
2773 VTOY_JSON_FMT_BOOL("timeouten", node
->timeouten
);
2774 VTOY_JSON_FMT_BOOL("autoselen", node
->autoselen
);
2776 VTOY_JSON_FMT_SINT("autosel", node
->autosel
);
2777 VTOY_JSON_FMT_SINT("timeout", node
->timeout
);
2779 VTOY_JSON_FMT_KEY("list");
2780 VTOY_JSON_FMT_ARY_BEGIN();
2781 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2783 VTOY_JSON_FMT_OBJ_BEGIN();
2784 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
2786 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
2787 VTOY_JSON_FMT_SINT("valid", valid
);
2788 VTOY_JSON_FMT_OBJ_ENDEX();
2790 VTOY_JSON_FMT_ARY_ENDEX();
2793 VTOY_JSON_FMT_OBJ_ENDEX();
2796 VTOY_JSON_FMT_ARY_END();
2797 VTOY_JSON_FMT_END(pos
);
2802 static int ventoy_api_get_auto_install(struct mg_connection
*conn
, VTOY_JSON
*json
)
2804 api_get_func(conn
, json
, auto_install
);
2808 static int ventoy_api_save_auto_install(struct mg_connection
*conn
, VTOY_JSON
*json
)
2814 uint8_t timeouten
= 0;
2815 uint8_t autoselen
= 0;
2816 auto_install_node
*node
= NULL
;
2817 data_auto_install
*data
= NULL
;
2819 vtoy_json_get_int(json
, "index", &index
);
2820 vtoy_json_get_int(json
, "id", &id
);
2822 vtoy_json_get_bool(json
, "timeouten", &timeouten
);
2823 vtoy_json_get_bool(json
, "autoselen", &autoselen
);
2825 data
= g_data_auto_install
+ index
;
2829 for (node
= data
->list
; node
; node
= node
->next
)
2833 node
->timeouten
= (int)timeouten
;
2834 node
->autoselen
= (int)autoselen
;
2835 VTOY_JSON_INT("timeout", node
->timeout
);
2836 VTOY_JSON_INT("autosel", node
->autosel
);
2842 ret
= ventoy_data_save_all();
2844 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2849 static int ventoy_api_auto_install_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2854 const char *path
= NULL
;
2855 auto_install_node
*node
= NULL
;
2856 auto_install_node
*cur
= NULL
;
2857 data_auto_install
*data
= NULL
;
2858 VTOY_JSON
*array
= NULL
;
2860 vtoy_json_get_int(json
, "type", &type
);
2861 vtoy_json_get_int(json
, "index", &index
);
2862 data
= g_data_auto_install
+ index
;
2864 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "template");
2865 path
= VTOY_JSON_STR_EX("path");
2868 node
= zalloc(sizeof(auto_install_node
));
2872 node
->timeouten
= 0;
2873 node
->autoselen
= 0;
2876 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2877 node
->list
= ventoy_path_node_add_array(array
);
2879 vtoy_list_add(data
->list
, cur
, node
);
2883 ret
= ventoy_data_save_all();
2885 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2889 static int ventoy_api_auto_install_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2893 const char *path
= NULL
;
2894 auto_install_node
*last
= NULL
;
2895 auto_install_node
*node
= NULL
;
2896 data_auto_install
*data
= NULL
;
2898 vtoy_json_get_int(json
, "index", &index
);
2899 data
= g_data_auto_install
+ index
;
2901 path
= VTOY_JSON_STR_EX("path");
2904 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
2907 ret
= ventoy_data_save_all();
2909 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2913 static int ventoy_api_auto_install_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2917 const char *path
= NULL
;
2918 const char *outpath
= NULL
;
2919 path_node
*pcur
= NULL
;
2920 path_node
*pnode
= NULL
;
2921 auto_install_node
*node
= NULL
;
2922 data_auto_install
*data
= NULL
;
2924 vtoy_json_get_int(json
, "index", &index
);
2925 data
= g_data_auto_install
+ index
;
2927 path
= VTOY_JSON_STR_EX("path");
2928 outpath
= VTOY_JSON_STR_EX("outpath");
2929 if (path
&& outpath
)
2931 for (node
= data
->list
; node
; node
= node
->next
)
2933 if (strcmp(outpath
, node
->path
) == 0)
2935 pnode
= zalloc(sizeof(path_node
));
2938 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
2939 vtoy_list_add(node
->list
, pcur
, pnode
);
2947 ret
= ventoy_data_save_all();
2949 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2953 static int ventoy_api_auto_install_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2957 const char *path
= NULL
;
2958 const char *outpath
= NULL
;
2959 path_node
*plast
= NULL
;
2960 path_node
*pnode
= NULL
;
2961 auto_install_node
*node
= NULL
;
2962 data_auto_install
*data
= NULL
;
2964 vtoy_json_get_int(json
, "index", &index
);
2965 data
= g_data_auto_install
+ index
;
2967 path
= VTOY_JSON_STR_EX("path");
2968 outpath
= VTOY_JSON_STR_EX("outpath");
2969 if (path
&& outpath
)
2971 for (node
= data
->list
; node
; node
= node
->next
)
2973 if (strcmp(outpath
, node
->path
) == 0)
2975 vtoy_list_del(plast
, pnode
, node
->list
, path
);
2981 ret
= ventoy_data_save_all();
2983 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2992 void ventoy_data_default_persistence(data_persistence
*data
)
2994 memset(data
, 0, sizeof(data_persistence
));
2997 int ventoy_data_cmp_persistence(data_persistence
*data1
, data_persistence
*data2
)
2999 persistence_node
*list1
= NULL
;
3000 persistence_node
*list2
= NULL
;
3002 if (NULL
== data1
->list
&& NULL
== data2
->list
)
3006 else if (data1
->list
&& data2
->list
)
3008 list1
= data1
->list
;
3009 list2
= data2
->list
;
3011 while (list1
&& list2
)
3013 if (list1
->timeout
!= list2
->timeout
||
3014 list1
->autosel
!= list2
->autosel
||
3015 strcmp(list1
->path
, list2
->path
))
3020 /* no need to compare auto install list with default */
3021 list1
= list1
->next
;
3022 list2
= list2
->next
;
3025 if (list1
== NULL
&& list2
== NULL
)
3040 int ventoy_data_save_persistence(data_persistence
*data
, const char *title
, char *buf
, int buflen
)
3043 persistence_node
*node
= NULL
;
3044 path_node
*pathnode
= NULL
;
3046 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3048 VTOY_JSON_FMT_KEY_L(L1
, title
);
3049 VTOY_JSON_FMT_ARY_BEGIN_N();
3051 for (node
= data
->list
; node
; node
= node
->next
)
3053 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
3054 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
3055 VTOY_JSON_FMT_KEY_L(L3
, "backend");
3056 VTOY_JSON_FMT_ARY_BEGIN_N();
3057 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
3059 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
3061 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
3063 if (node
->timeouten
)
3065 VTOY_JSON_FMT_SINT_LN(L3
, "timeout", node
->timeout
);
3068 if (node
->autoselen
)
3070 VTOY_JSON_FMT_SINT_LN(L3
, "autosel", node
->autosel
);
3073 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
3076 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
3077 VTOY_JSON_FMT_END(pos
);
3083 int ventoy_data_json_persistence(data_persistence
*data
, char *buf
, int buflen
)
3087 persistence_node
*node
= NULL
;
3088 path_node
*pathnode
= NULL
;
3090 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3091 VTOY_JSON_FMT_ARY_BEGIN();
3093 for (node
= data
->list
; node
; node
= node
->next
)
3095 VTOY_JSON_FMT_OBJ_BEGIN();
3097 VTOY_JSON_FMT_STRN("path", node
->path
);
3099 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
3100 VTOY_JSON_FMT_SINT("valid", valid
);
3101 VTOY_JSON_FMT_SINT("type", node
->type
);
3103 VTOY_JSON_FMT_BOOL("timeouten", node
->timeouten
);
3104 VTOY_JSON_FMT_BOOL("autoselen", node
->autoselen
);
3106 VTOY_JSON_FMT_SINT("autosel", node
->autosel
);
3107 VTOY_JSON_FMT_SINT("timeout", node
->timeout
);
3109 VTOY_JSON_FMT_KEY("list");
3110 VTOY_JSON_FMT_ARY_BEGIN();
3111 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
3113 VTOY_JSON_FMT_OBJ_BEGIN();
3114 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
3116 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
3117 VTOY_JSON_FMT_SINT("valid", valid
);
3118 VTOY_JSON_FMT_OBJ_ENDEX();
3120 VTOY_JSON_FMT_ARY_ENDEX();
3123 VTOY_JSON_FMT_OBJ_ENDEX();
3126 VTOY_JSON_FMT_ARY_END();
3127 VTOY_JSON_FMT_END(pos
);
3132 static int ventoy_api_get_persistence(struct mg_connection
*conn
, VTOY_JSON
*json
)
3134 api_get_func(conn
, json
, persistence
);
3138 static int ventoy_api_save_persistence(struct mg_connection
*conn
, VTOY_JSON
*json
)
3144 uint8_t timeouten
= 0;
3145 uint8_t autoselen
= 0;
3146 persistence_node
*node
= NULL
;
3147 data_persistence
*data
= NULL
;
3149 vtoy_json_get_int(json
, "index", &index
);
3150 vtoy_json_get_int(json
, "id", &id
);
3152 vtoy_json_get_bool(json
, "timeouten", &timeouten
);
3153 vtoy_json_get_bool(json
, "autoselen", &autoselen
);
3155 data
= g_data_persistence
+ index
;
3159 for (node
= data
->list
; node
; node
= node
->next
)
3163 node
->timeouten
= (int)timeouten
;
3164 node
->autoselen
= (int)autoselen
;
3165 VTOY_JSON_INT("timeout", node
->timeout
);
3166 VTOY_JSON_INT("autosel", node
->autosel
);
3172 ret
= ventoy_data_save_all();
3174 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3179 static int ventoy_api_persistence_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
3183 const char *path
= NULL
;
3184 persistence_node
*node
= NULL
;
3185 persistence_node
*cur
= NULL
;
3186 data_persistence
*data
= NULL
;
3187 VTOY_JSON
*array
= NULL
;
3189 vtoy_json_get_int(json
, "index", &index
);
3190 data
= g_data_persistence
+ index
;
3192 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "backend");
3193 path
= VTOY_JSON_STR_EX("path");
3196 node
= zalloc(sizeof(persistence_node
));
3199 node
->timeouten
= 0;
3200 node
->autoselen
= 0;
3203 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
3204 node
->list
= ventoy_path_node_add_array(array
);
3206 vtoy_list_add(data
->list
, cur
, node
);
3210 ret
= ventoy_data_save_all();
3212 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3216 static int ventoy_api_persistence_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
3220 const char *path
= NULL
;
3221 persistence_node
*last
= NULL
;
3222 persistence_node
*node
= NULL
;
3223 data_persistence
*data
= NULL
;
3225 vtoy_json_get_int(json
, "index", &index
);
3226 data
= g_data_persistence
+ index
;
3228 path
= VTOY_JSON_STR_EX("path");
3231 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
3234 ret
= ventoy_data_save_all();
3236 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3240 static int ventoy_api_persistence_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
3244 const char *path
= NULL
;
3245 const char *outpath
= NULL
;
3246 path_node
*pcur
= NULL
;
3247 path_node
*pnode
= NULL
;
3248 persistence_node
*node
= NULL
;
3249 data_persistence
*data
= NULL
;
3251 vtoy_json_get_int(json
, "index", &index
);
3252 data
= g_data_persistence
+ index
;
3254 path
= VTOY_JSON_STR_EX("path");
3255 outpath
= VTOY_JSON_STR_EX("outpath");
3256 if (path
&& outpath
)
3258 for (node
= data
->list
; node
; node
= node
->next
)
3260 if (strcmp(outpath
, node
->path
) == 0)
3262 pnode
= zalloc(sizeof(path_node
));
3265 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
3266 vtoy_list_add(node
->list
, pcur
, pnode
);
3274 ret
= ventoy_data_save_all();
3276 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3280 static int ventoy_api_persistence_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
3284 const char *path
= NULL
;
3285 const char *outpath
= NULL
;
3286 path_node
*plast
= NULL
;
3287 path_node
*pnode
= NULL
;
3288 persistence_node
*node
= NULL
;
3289 data_persistence
*data
= NULL
;
3291 vtoy_json_get_int(json
, "index", &index
);
3292 data
= g_data_persistence
+ index
;
3294 path
= VTOY_JSON_STR_EX("path");
3295 outpath
= VTOY_JSON_STR_EX("outpath");
3296 if (path
&& outpath
)
3298 for (node
= data
->list
; node
; node
= node
->next
)
3300 if (strcmp(outpath
, node
->path
) == 0)
3302 vtoy_list_del(plast
, pnode
, node
->list
, path
);
3308 ret
= ventoy_data_save_all();
3310 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3318 void ventoy_data_default_injection(data_injection
*data
)
3320 memset(data
, 0, sizeof(data_injection
));
3323 int ventoy_data_cmp_injection(data_injection
*data1
, data_injection
*data2
)
3325 injection_node
*list1
= NULL
;
3326 injection_node
*list2
= NULL
;
3328 if (NULL
== data1
->list
&& NULL
== data2
->list
)
3332 else if (data1
->list
&& data2
->list
)
3334 list1
= data1
->list
;
3335 list2
= data2
->list
;
3337 while (list1
&& list2
)
3339 if ((list1
->type
!= list2
->type
) ||
3340 strcmp(list1
->path
, list2
->path
) ||
3341 strcmp(list1
->archive
, list2
->archive
))
3346 list1
= list1
->next
;
3347 list2
= list2
->next
;
3350 if (list1
== NULL
&& list2
== NULL
)
3365 int ventoy_data_save_injection(data_injection
*data
, const char *title
, char *buf
, int buflen
)
3368 injection_node
*node
= NULL
;
3370 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3372 VTOY_JSON_FMT_KEY_L(L1
, title
);
3373 VTOY_JSON_FMT_ARY_BEGIN_N();
3375 for (node
= data
->list
; node
; node
= node
->next
)
3377 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
3379 if (node
->type
== 0)
3381 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
3385 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
3387 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "archive", node
->archive
);
3389 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
3392 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
3393 VTOY_JSON_FMT_END(pos
);
3399 int ventoy_data_json_injection(data_injection
*data
, char *buf
, int buflen
)
3403 injection_node
*node
= NULL
;
3405 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3406 VTOY_JSON_FMT_ARY_BEGIN();
3408 for (node
= data
->list
; node
; node
= node
->next
)
3410 VTOY_JSON_FMT_OBJ_BEGIN();
3412 VTOY_JSON_FMT_UINT("type", node
->type
);
3413 VTOY_JSON_FMT_STRN("path", node
->path
);
3415 if (node
->type
== 0)
3417 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
3421 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
3423 VTOY_JSON_FMT_SINT("valid", valid
);
3425 VTOY_JSON_FMT_STRN("archive", node
->archive
);
3427 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, node
->archive
);
3428 VTOY_JSON_FMT_SINT("archive_valid", valid
);
3430 VTOY_JSON_FMT_OBJ_ENDEX();
3433 VTOY_JSON_FMT_ARY_END();
3434 VTOY_JSON_FMT_END(pos
);
3440 static int ventoy_api_get_injection(struct mg_connection
*conn
, VTOY_JSON
*json
)
3442 api_get_func(conn
, json
, injection
);
3446 static int ventoy_api_save_injection(struct mg_connection
*conn
, VTOY_JSON
*json
)
3449 ret
= ventoy_data_save_all();
3451 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3455 static int ventoy_api_injection_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
3460 const char *path
= NULL
;
3461 const char *archive
= NULL
;
3462 injection_node
*node
= NULL
;
3463 injection_node
*cur
= NULL
;
3464 data_injection
*data
= NULL
;
3466 vtoy_json_get_int(json
, "index", &index
);
3467 data
= g_data_injection
+ index
;
3469 vtoy_json_get_int(json
, "type", &type
);
3471 path
= VTOY_JSON_STR_EX("path");
3472 archive
= VTOY_JSON_STR_EX("archive");
3473 if (path
&& archive
)
3475 node
= zalloc(sizeof(injection_node
));
3480 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
3481 scnprintf(node
->archive
, sizeof(node
->archive
), "%s", archive
);
3483 vtoy_list_add(data
->list
, cur
, node
);
3487 ret
= ventoy_data_save_all();
3489 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3493 static int ventoy_api_injection_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
3497 const char *path
= NULL
;
3498 injection_node
*last
= NULL
;
3499 injection_node
*node
= NULL
;
3500 data_injection
*data
= NULL
;
3502 vtoy_json_get_int(json
, "index", &index
);
3503 data
= g_data_injection
+ index
;
3505 path
= VTOY_JSON_STR_EX("path");
3508 vtoy_list_del(last
, node
, data
->list
, path
);
3511 ret
= ventoy_data_save_all();
3513 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3521 int ventoy_data_save_all(void)
3523 ventoy_set_writeback_event();
3527 int ventoy_data_real_save_all(void)
3533 pthread_mutex_lock(&g_api_mutex
);
3535 ssprintf(pos
, JSON_SAVE_BUFFER
, JSON_BUF_MAX
, "{\n");
3537 ventoy_save_plug(control
);
3538 ventoy_save_plug(theme
);
3539 ventoy_save_plug(menu_alias
);
3540 ventoy_save_plug(menu_tip
);
3541 ventoy_save_plug(menu_class
);
3542 ventoy_save_plug(auto_install
);
3543 ventoy_save_plug(persistence
);
3544 ventoy_save_plug(injection
);
3545 ventoy_save_plug(conf_replace
);
3546 ventoy_save_plug(password
);
3547 ventoy_save_plug(image_list
);
3548 ventoy_save_plug(auto_memdisk
);
3549 ventoy_save_plug(dud
);
3551 if (JSON_SAVE_BUFFER
[pos
- 1] == '\n' && JSON_SAVE_BUFFER
[pos
- 2] == ',')
3553 JSON_SAVE_BUFFER
[pos
- 2] = '\n';
3556 ssprintf(pos
, JSON_SAVE_BUFFER
, JSON_BUF_MAX
, "}\n");
3558 pthread_mutex_unlock(&g_api_mutex
);
3563 int ventoy_http_writeback(void)
3569 ventoy_get_json_path(filename
, NULL
);
3571 pos
= ventoy_data_real_save_all();
3574 printf("%s", JSON_SAVE_BUFFER
);
3577 ret
= ventoy_write_buf_to_file(filename
, JSON_SAVE_BUFFER
, pos
);
3580 vlog("Failed to write ventoy.json file.\n");
3581 g_sysinfo
.config_save_error
= 1;
3588 static JSON_CB g_ventoy_json_cb
[] =
3590 { "sysinfo", ventoy_api_sysinfo
},
3591 { "handshake", ventoy_api_handshake
},
3592 { "check_path", ventoy_api_check_exist
},
3593 { "check_path2", ventoy_api_check_exist2
},
3594 { "check_fuzzy", ventoy_api_check_fuzzy
},
3596 { "device_info", ventoy_api_device_info
},
3598 { "get_control", ventoy_api_get_control
},
3599 { "save_control", ventoy_api_save_control
},
3601 { "get_theme", ventoy_api_get_theme
},
3602 { "save_theme", ventoy_api_save_theme
},
3603 { "theme_add_file", ventoy_api_theme_add_file
},
3604 { "theme_del_file", ventoy_api_theme_del_file
},
3605 { "theme_add_font", ventoy_api_theme_add_font
},
3606 { "theme_del_font", ventoy_api_theme_del_font
},
3608 { "get_alias", ventoy_api_get_alias
},
3609 { "save_alias", ventoy_api_save_alias
},
3610 { "alias_add", ventoy_api_alias_add
},
3611 { "alias_del", ventoy_api_alias_del
},
3613 { "get_tip", ventoy_api_get_tip
},
3614 { "save_tip", ventoy_api_save_tip
},
3615 { "tip_add", ventoy_api_tip_add
},
3616 { "tip_del", ventoy_api_tip_del
},
3618 { "get_class", ventoy_api_get_class
},
3619 { "save_class", ventoy_api_save_class
},
3620 { "class_add", ventoy_api_class_add
},
3621 { "class_del", ventoy_api_class_del
},
3623 { "get_auto_memdisk", ventoy_api_get_auto_memdisk
},
3624 { "save_auto_memdisk", ventoy_api_save_auto_memdisk
},
3625 { "auto_memdisk_add", ventoy_api_auto_memdisk_add
},
3626 { "auto_memdisk_del", ventoy_api_auto_memdisk_del
},
3628 { "get_image_list", ventoy_api_get_image_list
},
3629 { "save_image_list", ventoy_api_save_image_list
},
3630 { "image_list_add", ventoy_api_image_list_add
},
3631 { "image_list_del", ventoy_api_image_list_del
},
3633 { "get_conf_replace", ventoy_api_get_conf_replace
},
3634 { "save_conf_replace", ventoy_api_save_conf_replace
},
3635 { "conf_replace_add", ventoy_api_conf_replace_add
},
3636 { "conf_replace_del", ventoy_api_conf_replace_del
},
3638 { "get_dud", ventoy_api_get_dud
},
3639 { "save_dud", ventoy_api_save_dud
},
3640 { "dud_add", ventoy_api_dud_add
},
3641 { "dud_del", ventoy_api_dud_del
},
3642 { "dud_add_inner", ventoy_api_dud_add_inner
},
3643 { "dud_del_inner", ventoy_api_dud_del_inner
},
3645 { "get_auto_install", ventoy_api_get_auto_install
},
3646 { "save_auto_install", ventoy_api_save_auto_install
},
3647 { "auto_install_add", ventoy_api_auto_install_add
},
3648 { "auto_install_del", ventoy_api_auto_install_del
},
3649 { "auto_install_add_inner", ventoy_api_auto_install_add_inner
},
3650 { "auto_install_del_inner", ventoy_api_auto_install_del_inner
},
3652 { "get_persistence", ventoy_api_get_persistence
},
3653 { "save_persistence", ventoy_api_save_persistence
},
3654 { "persistence_add", ventoy_api_persistence_add
},
3655 { "persistence_del", ventoy_api_persistence_del
},
3656 { "persistence_add_inner", ventoy_api_persistence_add_inner
},
3657 { "persistence_del_inner", ventoy_api_persistence_del_inner
},
3659 { "get_password", ventoy_api_get_password
},
3660 { "save_password", ventoy_api_save_password
},
3661 { "password_add", ventoy_api_password_add
},
3662 { "password_del", ventoy_api_password_del
},
3664 { "get_injection", ventoy_api_get_injection
},
3665 { "save_injection", ventoy_api_save_injection
},
3666 { "injection_add", ventoy_api_injection_add
},
3667 { "injection_del", ventoy_api_injection_del
},
3672 static int ventoy_json_handler(struct mg_connection
*conn
, VTOY_JSON
*json
)
3675 const char *method
= NULL
;
3677 method
= vtoy_json_get_string_ex(json
, "method");
3680 ventoy_json_result(conn
, VTOY_JSON_SUCCESS_RET
);
3684 if (strcmp(method
, "handshake") == 0)
3686 ventoy_api_handshake(conn
, json
);
3690 for (i
= 0; i
< (int)(sizeof(g_ventoy_json_cb
) / sizeof(g_ventoy_json_cb
[0])); i
++)
3692 if (strcmp(method
, g_ventoy_json_cb
[i
].method
) == 0)
3694 g_ventoy_json_cb
[i
].callback(conn
, json
);
3702 static int ventoy_request_handler(struct mg_connection
*conn
)
3706 VTOY_JSON
*json
= NULL
;
3707 char *post_data_buf
= NULL
;
3708 const struct mg_request_info
*ri
= NULL
;
3709 char stack_buf
[512];
3711 ri
= mg_get_request_info(conn
);
3713 if (strcmp(ri
->uri
, "/vtoy/json") == 0)
3715 if (ri
->content_length
> 500)
3717 post_data_buf
= malloc((int)(ri
->content_length
+ 4));
3718 post_buf_len
= (int)(ri
->content_length
+ 1);
3722 post_data_buf
= stack_buf
;
3723 post_buf_len
= sizeof(stack_buf
);
3726 post_data_len
= mg_read(conn
, post_data_buf
, post_buf_len
);
3727 post_data_buf
[post_data_len
] = 0;
3729 json
= vtoy_json_create();
3730 if (JSON_SUCCESS
== vtoy_json_parse(json
, post_data_buf
))
3732 pthread_mutex_lock(&g_api_mutex
);
3733 ventoy_json_handler(conn
, json
->pstChild
);
3734 pthread_mutex_unlock(&g_api_mutex
);
3738 ventoy_json_result(conn
, VTOY_JSON_INVALID_RET
);
3741 vtoy_json_destroy(json
);
3743 if (post_data_buf
!= stack_buf
)
3745 free(post_data_buf
);
3755 const char *ventoy_web_openfile(const struct mg_connection
*conn
, const char *path
, size_t *data_len
)
3757 ventoy_file
*node
= NULL
;
3766 node
= ventoy_tar_find_file(path
);
3769 *data_len
= node
->size
;
3781 static int ventoy_parse_control(VTOY_JSON
*json
, void *p
)
3784 VTOY_JSON
*node
= NULL
;
3785 VTOY_JSON
*child
= NULL
;
3786 data_control
*data
= (data_control
*)p
;
3788 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
3793 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
3795 if (node
->enDataType
== JSON_TYPE_OBJECT
)
3797 child
= node
->pstChild
;
3799 if (strcmp(child
->pcName
, "VTOY_DEFAULT_MENU_MODE") == 0)
3801 CONTROL_PARSE_INT(child
, data
->default_menu_mode
);
3803 else if (strcmp(child
->pcName
, "VTOY_WIN11_BYPASS_CHECK") == 0)
3805 CONTROL_PARSE_INT(child
, data
->win11_bypass_check
);
3807 else if (strcmp(child
->pcName
, "VTOY_LINUX_REMOUNT") == 0)
3809 CONTROL_PARSE_INT(child
, data
->linux_remount
);
3811 else if (strcmp(child
->pcName
, "VTOY_TREE_VIEW_MENU_STYLE") == 0)
3813 CONTROL_PARSE_INT(child
, data
->treeview_style
);
3815 else if (strcmp(child
->pcName
, "VTOY_FILT_DOT_UNDERSCORE_FILE") == 0)
3817 CONTROL_PARSE_INT(child
, data
->filter_dot_underscore
);
3819 else if (strcmp(child
->pcName
, "VTOY_SORT_CASE_SENSITIVE") == 0)
3821 CONTROL_PARSE_INT(child
, data
->sort_casesensitive
);
3823 else if (strcmp(child
->pcName
, "VTOY_MAX_SEARCH_LEVEL") == 0)
3825 if (strcmp(child
->unData
.pcStrVal
, "max") == 0)
3827 data
->max_search_level
= -1;
3831 data
->max_search_level
= (int)strtol(child
->unData
.pcStrVal
, NULL
, 10);
3834 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_SEARCH_ROOT") == 0)
3836 strlcpy(data
->default_search_root
, child
->unData
.pcStrVal
);
3838 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_IMAGE") == 0)
3840 strlcpy(data
->default_image
, child
->unData
.pcStrVal
);
3842 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_KBD_LAYOUT") == 0)
3844 for (i
= 0; g_ventoy_kbd_layout
[i
]; i
++)
3846 if (strcmp(child
->unData
.pcStrVal
, g_ventoy_kbd_layout
[i
]) == 0)
3848 strlcpy(data
->default_kbd_layout
, child
->unData
.pcStrVal
);
3853 else if (strcmp(child
->pcName
, "VTOY_HELP_TXT_LANGUAGE") == 0)
3855 for (i
= 0; g_ventoy_help_lang
[i
][0]; i
++)
3857 if (strcmp(child
->unData
.pcStrVal
, g_ventoy_help_lang
[i
]) == 0)
3859 strlcpy(data
->help_text_language
, child
->unData
.pcStrVal
);
3864 else if (strcmp(child
->pcName
, "VTOY_MENU_TIMEOUT") == 0)
3866 data
->menu_timeout
= (int)strtol(child
->unData
.pcStrVal
, NULL
, 10);
3868 else if (strcmp(child
->pcName
, "VTOY_VHD_NO_WARNING") == 0)
3870 CONTROL_PARSE_INT(child
, data
->vhd_no_warning
);
3872 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_ISO") == 0)
3874 CONTROL_PARSE_INT(child
, data
->filter_iso
);
3876 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_IMG") == 0)
3878 CONTROL_PARSE_INT(child
, data
->filter_img
);
3880 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_EFI") == 0)
3882 CONTROL_PARSE_INT(child
, data
->filter_efi
);
3884 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_WIM") == 0)
3886 CONTROL_PARSE_INT(child
, data
->filter_wim
);
3888 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_VHD") == 0)
3890 CONTROL_PARSE_INT(child
, data
->filter_vhd
);
3892 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_VTOY") == 0)
3894 CONTROL_PARSE_INT(child
, data
->filter_vtoy
);
3902 static int ventoy_parse_theme(VTOY_JSON
*json
, void *p
)
3904 const char *dismode
= NULL
;
3905 VTOY_JSON
*child
= NULL
;
3906 VTOY_JSON
*node
= NULL
;
3907 path_node
*tail
= NULL
;
3908 path_node
*pnode
= NULL
;
3909 data_theme
*data
= (data_theme
*)p
;
3911 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
3916 child
= json
->pstChild
;
3918 dismode
= vtoy_json_get_string_ex(child
, "display_mode");
3919 vtoy_json_get_string(child
, "ventoy_left", sizeof(data
->ventoy_left
), data
->ventoy_left
);
3920 vtoy_json_get_string(child
, "ventoy_top", sizeof(data
->ventoy_top
), data
->ventoy_top
);
3921 vtoy_json_get_string(child
, "ventoy_color", sizeof(data
->ventoy_color
), data
->ventoy_color
);
3923 vtoy_json_get_int(child
, "default_file", &(data
->default_file
));
3924 vtoy_json_get_string(child
, "gfxmode", sizeof(data
->gfxmode
), data
->gfxmode
);
3925 vtoy_json_get_string(child
, "serial_param", sizeof(data
->serial_param
), data
->serial_param
);
3929 if (strcmp(dismode
, "CLI") == 0)
3931 data
->display_mode
= display_mode_cli
;
3933 else if (strcmp(dismode
, "serial") == 0)
3935 data
->display_mode
= display_mode_serial
;
3937 else if (strcmp(dismode
, "serial_console") == 0)
3939 data
->display_mode
= display_mode_ser_console
;
3943 data
->display_mode
= display_mode_gui
;
3947 node
= vtoy_json_find_item(child
, JSON_TYPE_STRING
, "file");
3950 data
->default_file
= 0;
3952 pnode
= zalloc(sizeof(path_node
));
3955 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3956 data
->filelist
= pnode
;
3961 node
= vtoy_json_find_item(child
, JSON_TYPE_ARRAY
, "file");
3964 for (node
= node
->pstChild
; node
; node
= node
->pstNext
)
3966 if (node
->enDataType
== JSON_TYPE_STRING
)
3968 pnode
= zalloc(sizeof(path_node
));
3971 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3979 data
->filelist
= tail
= pnode
;
3988 node
= vtoy_json_find_item(child
, JSON_TYPE_ARRAY
, "fonts");
3991 for (node
= node
->pstChild
; node
; node
= node
->pstNext
)
3993 if (node
->enDataType
== JSON_TYPE_STRING
)
3995 pnode
= zalloc(sizeof(path_node
));
3998 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3999 if (data
->fontslist
)
4006 data
->fontslist
= tail
= pnode
;
4015 static int ventoy_parse_menu_alias(VTOY_JSON
*json
, void *p
)
4018 const char *path
= NULL
;
4019 const char *alias
= NULL
;
4020 data_alias
*data
= (data_alias
*)p
;
4021 data_alias_node
*tail
= NULL
;
4022 data_alias_node
*pnode
= NULL
;
4023 VTOY_JSON
*node
= NULL
;
4025 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4030 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4032 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4037 type
= path_type_file
;
4038 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4041 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4042 type
= path_type_dir
;
4044 alias
= vtoy_json_get_string_ex(node
->pstChild
, "alias");
4048 pnode
= zalloc(sizeof(data_alias_node
));
4052 strlcpy(pnode
->path
, path
);
4053 strlcpy(pnode
->alias
, alias
);
4062 data
->list
= tail
= pnode
;
4071 static int ventoy_parse_menu_tip(VTOY_JSON
*json
, void *p
)
4074 const char *path
= NULL
;
4075 const char *tip
= NULL
;
4076 data_tip
*data
= (data_tip
*)p
;
4077 data_tip_node
*tail
= NULL
;
4078 data_tip_node
*pnode
= NULL
;
4079 VTOY_JSON
*node
= NULL
;
4080 VTOY_JSON
*tips
= NULL
;
4082 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
4087 vtoy_json_get_string(json
->pstChild
, "left", sizeof(data
->left
), data
->left
);
4088 vtoy_json_get_string(json
->pstChild
, "top", sizeof(data
->top
), data
->top
);
4089 vtoy_json_get_string(json
->pstChild
, "color", sizeof(data
->color
), data
->color
);
4091 tips
= vtoy_json_find_item(json
->pstChild
, JSON_TYPE_ARRAY
, "tips");
4097 for (node
= tips
->pstChild
; node
; node
= node
->pstNext
)
4099 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4104 type
= path_type_file
;
4105 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4108 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4109 type
= path_type_dir
;
4111 tip
= vtoy_json_get_string_ex(node
->pstChild
, "tip");
4115 pnode
= zalloc(sizeof(data_tip_node
));
4119 strlcpy(pnode
->path
, path
);
4120 strlcpy(pnode
->tip
, tip
);
4129 data
->list
= tail
= pnode
;
4137 static int ventoy_parse_menu_class(VTOY_JSON
*json
, void *p
)
4140 const char *path
= NULL
;
4141 const char *class = NULL
;
4142 data_class
*data
= (data_class
*)p
;
4143 data_class_node
*tail
= NULL
;
4144 data_class_node
*pnode
= NULL
;
4145 VTOY_JSON
*node
= NULL
;
4147 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4152 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4154 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4159 type
= class_type_key
;
4160 path
= vtoy_json_get_string_ex(node
->pstChild
, "key");
4163 type
= class_type_dir
;
4164 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4167 type
= class_type_parent
;
4168 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4171 class = vtoy_json_get_string_ex(node
->pstChild
, "class");
4175 pnode
= zalloc(sizeof(data_class_node
));
4179 strlcpy(pnode
->path
, path
);
4180 strlcpy(pnode
->class, class);
4189 data
->list
= tail
= pnode
;
4197 static int ventoy_parse_auto_install(VTOY_JSON
*json
, void *p
)
4205 const char *path
= NULL
;
4206 const char *file
= NULL
;
4207 data_auto_install
*data
= (data_auto_install
*)p
;
4208 auto_install_node
*tail
= NULL
;
4209 auto_install_node
*pnode
= NULL
;
4210 path_node
*pathnode
= NULL
;
4211 path_node
*pathtail
= NULL
;
4212 VTOY_JSON
*node
= NULL
;
4213 VTOY_JSON
*filelist
= NULL
;
4214 VTOY_JSON
*filenode
= NULL
;
4216 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4221 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4223 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4229 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4232 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4240 file
= vtoy_json_get_string_ex(node
->pstChild
, "template");
4243 pnode
= zalloc(sizeof(auto_install_node
));
4248 strlcpy(pnode
->path
, path
);
4250 pathnode
= zalloc(sizeof(path_node
));
4253 strlcpy(pathnode
->path
, file
);
4254 pnode
->list
= pathnode
;
4268 data
->list
= tail
= pnode
;
4276 timeouten
= autoselen
= 0;
4277 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "timeout", &timeout
))
4281 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "autosel", &autosel
))
4286 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "template");
4292 pnode
= zalloc(sizeof(auto_install_node
));
4299 pnode
->autoselen
= autoselen
;
4300 pnode
->timeouten
= timeouten
;
4301 pnode
->timeout
= timeout
;
4302 pnode
->autosel
= autosel
;
4303 strlcpy(pnode
->path
, path
);
4306 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4308 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4313 pathnode
= zalloc(sizeof(path_node
));
4317 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4321 pathtail
->next
= pathnode
;
4322 pathtail
= pathnode
;
4326 pnode
->list
= pathtail
= pathnode
;
4337 if (pnode
->autoselen
&& pnode
->autosel
> count
)
4349 data
->list
= tail
= pnode
;
4356 static int ventoy_parse_persistence(VTOY_JSON
*json
, void *p
)
4363 const char *path
= NULL
;
4364 const char *file
= NULL
;
4365 data_persistence
*data
= (data_persistence
*)p
;
4366 persistence_node
*tail
= NULL
;
4367 persistence_node
*pnode
= NULL
;
4368 path_node
*pathnode
= NULL
;
4369 path_node
*pathtail
= NULL
;
4370 VTOY_JSON
*node
= NULL
;
4371 VTOY_JSON
*filelist
= NULL
;
4372 VTOY_JSON
*filenode
= NULL
;
4374 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4379 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4381 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4386 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4392 file
= vtoy_json_get_string_ex(node
->pstChild
, "backend");
4395 pnode
= zalloc(sizeof(persistence_node
));
4400 strlcpy(pnode
->path
, path
);
4402 pathnode
= zalloc(sizeof(path_node
));
4405 strlcpy(pathnode
->path
, file
);
4406 pnode
->list
= pathnode
;
4420 data
->list
= tail
= pnode
;
4428 timeouten
= autoselen
= 0;
4429 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "timeout", &timeout
))
4433 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "autosel", &autosel
))
4438 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "backend");
4444 pnode
= zalloc(sizeof(persistence_node
));
4451 pnode
->autoselen
= autoselen
;
4452 pnode
->timeouten
= timeouten
;
4453 pnode
->timeout
= timeout
;
4454 pnode
->autosel
= autosel
;
4455 strlcpy(pnode
->path
, path
);
4458 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4460 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4465 pathnode
= zalloc(sizeof(path_node
));
4469 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4473 pathtail
->next
= pathnode
;
4474 pathtail
= pathnode
;
4478 pnode
->list
= pathtail
= pathnode
;
4489 if (pnode
->autoselen
&& pnode
->autosel
> count
)
4501 data
->list
= tail
= pnode
;
4508 static int ventoy_parse_injection(VTOY_JSON
*json
, void *p
)
4511 const char *path
= NULL
;
4512 const char *archive
= NULL
;
4513 data_injection
*data
= (data_injection
*)p
;
4514 injection_node
*tail
= NULL
;
4515 injection_node
*pnode
= NULL
;
4516 VTOY_JSON
*node
= NULL
;
4518 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4523 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4525 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4531 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4534 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4537 archive
= vtoy_json_get_string_ex(node
->pstChild
, "archive");
4539 if (path
&& archive
)
4541 pnode
= zalloc(sizeof(injection_node
));
4545 strlcpy(pnode
->path
, path
);
4546 strlcpy(pnode
->archive
, archive
);
4555 data
->list
= tail
= pnode
;
4563 static int ventoy_parse_conf_replace(VTOY_JSON
*json
, void *p
)
4566 const char *path
= NULL
;
4567 const char *org
= NULL
;
4568 const char *new = NULL
;
4569 data_conf_replace
*data
= (data_conf_replace
*)p
;
4570 conf_replace_node
*tail
= NULL
;
4571 conf_replace_node
*pnode
= NULL
;
4572 VTOY_JSON
*node
= NULL
;
4574 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4579 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4581 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4586 path
= vtoy_json_get_string_ex(node
->pstChild
, "iso");
4587 org
= vtoy_json_get_string_ex(node
->pstChild
, "org");
4588 new = vtoy_json_get_string_ex(node
->pstChild
, "new");
4591 vtoy_json_get_int(node
->pstChild
, "img", &img
);
4593 if (path
&& org
&& new)
4595 pnode
= zalloc(sizeof(conf_replace_node
));
4598 strlcpy(pnode
->path
, path
);
4599 strlcpy(pnode
->org
, org
);
4600 strlcpy(pnode
->new, new);
4613 data
->list
= tail
= pnode
;
4621 static int ventoy_parse_password(VTOY_JSON
*json
, void *p
)
4624 const char *bootpwd
= NULL
;
4625 const char *isopwd
= NULL
;
4626 const char *wimpwd
= NULL
;
4627 const char *imgpwd
= NULL
;
4628 const char *efipwd
= NULL
;
4629 const char *vhdpwd
= NULL
;
4630 const char *vtoypwd
= NULL
;
4631 const char *path
= NULL
;
4632 const char *pwd
= NULL
;
4633 data_password
*data
= (data_password
*)p
;
4634 menu_password
*tail
= NULL
;
4635 menu_password
*pnode
= NULL
;
4636 VTOY_JSON
*node
= NULL
;
4637 VTOY_JSON
*menupwd
= NULL
;
4639 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
4644 bootpwd
= vtoy_json_get_string_ex(json
->pstChild
, "bootpwd");
4645 isopwd
= vtoy_json_get_string_ex(json
->pstChild
, "isopwd");
4646 wimpwd
= vtoy_json_get_string_ex(json
->pstChild
, "wimpwd");
4647 imgpwd
= vtoy_json_get_string_ex(json
->pstChild
, "imgpwd");
4648 efipwd
= vtoy_json_get_string_ex(json
->pstChild
, "efipwd");
4649 vhdpwd
= vtoy_json_get_string_ex(json
->pstChild
, "vhdpwd");
4650 vtoypwd
= vtoy_json_get_string_ex(json
->pstChild
, "vtoypwd");
4653 if (bootpwd
) strlcpy(data
->bootpwd
, bootpwd
);
4654 if (isopwd
) strlcpy(data
->isopwd
, isopwd
);
4655 if (wimpwd
) strlcpy(data
->wimpwd
, wimpwd
);
4656 if (imgpwd
) strlcpy(data
->imgpwd
, imgpwd
);
4657 if (efipwd
) strlcpy(data
->efipwd
, efipwd
);
4658 if (vhdpwd
) strlcpy(data
->vhdpwd
, vhdpwd
);
4659 if (vtoypwd
) strlcpy(data
->vtoypwd
, vtoypwd
);
4662 menupwd
= vtoy_json_find_item(json
->pstChild
, JSON_TYPE_ARRAY
, "menupwd");
4668 for (node
= menupwd
->pstChild
; node
; node
= node
->pstNext
)
4670 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4676 path
= vtoy_json_get_string_ex(node
->pstChild
, "file");
4679 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4682 pwd
= vtoy_json_get_string_ex(node
->pstChild
, "pwd");
4686 pnode
= zalloc(sizeof(menu_password
));
4690 strlcpy(pnode
->path
, path
);
4691 strlcpy(pnode
->pwd
, pwd
);
4700 data
->list
= tail
= pnode
;
4709 static int ventoy_parse_image_list_real(VTOY_JSON
*json
, int type
, void *p
)
4711 VTOY_JSON
*node
= NULL
;
4712 data_image_list
*data
= (data_image_list
*)p
;
4713 path_node
*tail
= NULL
;
4714 path_node
*pnode
= NULL
;
4716 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4723 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4725 if (node
->enDataType
== JSON_TYPE_STRING
)
4727 pnode
= zalloc(sizeof(path_node
));
4730 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
4738 data
->list
= tail
= pnode
;
4746 static int ventoy_parse_image_blacklist(VTOY_JSON
*json
, void *p
)
4748 return ventoy_parse_image_list_real(json
, 1, p
);
4750 static int ventoy_parse_image_list(VTOY_JSON
*json
, void *p
)
4752 return ventoy_parse_image_list_real(json
, 0, p
);
4755 static int ventoy_parse_auto_memdisk(VTOY_JSON
*json
, void *p
)
4757 VTOY_JSON
*node
= NULL
;
4758 data_auto_memdisk
*data
= (data_auto_memdisk
*)p
;
4759 path_node
*tail
= NULL
;
4760 path_node
*pnode
= NULL
;
4762 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4767 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4769 if (node
->enDataType
== JSON_TYPE_STRING
)
4771 pnode
= zalloc(sizeof(path_node
));
4774 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
4782 data
->list
= tail
= pnode
;
4790 static int ventoy_parse_dud(VTOY_JSON
*json
, void *p
)
4793 const char *path
= NULL
;
4794 const char *file
= NULL
;
4795 data_dud
*data
= (data_dud
*)p
;
4796 dud_node
*tail
= NULL
;
4797 dud_node
*pnode
= NULL
;
4798 path_node
*pathnode
= NULL
;
4799 path_node
*pathtail
= NULL
;
4800 VTOY_JSON
*node
= NULL
;
4801 VTOY_JSON
*filelist
= NULL
;
4802 VTOY_JSON
*filenode
= NULL
;
4804 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4809 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4811 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4816 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4822 file
= vtoy_json_get_string_ex(node
->pstChild
, "dud");
4825 pnode
= zalloc(sizeof(dud_node
));
4828 strlcpy(pnode
->path
, path
);
4830 pathnode
= zalloc(sizeof(path_node
));
4833 strlcpy(pathnode
->path
, file
);
4834 pnode
->list
= pathnode
;
4848 data
->list
= tail
= pnode
;
4855 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "dud");
4861 pnode
= zalloc(sizeof(dud_node
));
4867 strlcpy(pnode
->path
, path
);
4869 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4871 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4876 pathnode
= zalloc(sizeof(path_node
));
4879 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4884 pathtail
->next
= pathnode
;
4885 pathtail
= pathnode
;
4889 pnode
->list
= pathtail
= pathnode
;
4907 data
->list
= tail
= pnode
;
4921 static int ventoy_load_old_json(const char *filename
)
4926 char *buffer
= NULL
;
4927 unsigned char *start
= NULL
;
4928 VTOY_JSON
*json
= NULL
;
4929 VTOY_JSON
*node
= NULL
;
4930 VTOY_JSON
*next
= NULL
;
4932 ret
= ventoy_read_file_to_buf(filename
, 4, (void **)&buffer
, &buflen
);
4935 vlog("Failed to read old ventoy.json file.\n");
4940 start
= (unsigned char *)buffer
;
4942 if (start
[0] == 0xef && start
[1] == 0xbb && start
[2] == 0xbf)
4946 else if ((start
[0] == 0xff && start
[1] == 0xfe) || (start
[0] == 0xfe && start
[1] == 0xff))
4948 vlog("ventoy.json is in UCS-2 encoding, ignore it.\n");
4953 json
= vtoy_json_create();
4960 if (vtoy_json_parse_ex(json
, buffer
+ offset
, buflen
- offset
) == JSON_SUCCESS
)
4962 vlog("parse ventoy.json success\n");
4964 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4965 for (next
= node
->pstNext
; next
; next
= next
->pstNext
)
4967 if (node
->pcName
&& next
->pcName
&& strcmp(node
->pcName
, next
->pcName
) == 0)
4969 vlog("ventoy.json contains duplicate key <%s>.\n", node
->pcName
);
4970 g_sysinfo
.invalid_config
= 1;
4976 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4978 ventoy_parse_json(control
);
4979 ventoy_parse_json(theme
);
4980 ventoy_parse_json(menu_alias
);
4981 ventoy_parse_json(menu_tip
);
4982 ventoy_parse_json(menu_class
);
4983 ventoy_parse_json(auto_install
);
4984 ventoy_parse_json(persistence
);
4985 ventoy_parse_json(injection
);
4986 ventoy_parse_json(conf_replace
);
4987 ventoy_parse_json(password
);
4988 ventoy_parse_json(image_list
);
4989 ventoy_parse_json(image_blacklist
);
4990 ventoy_parse_json(auto_memdisk
);
4991 ventoy_parse_json(dud
);
4996 vlog("ventoy.json has syntax error.\n");
4997 g_sysinfo
.syntax_error
= 1;
5002 vtoy_json_destroy(json
);
5009 int ventoy_http_start(const char *ip
, const char *port
)
5014 char backupname
[128];
5015 struct mg_callbacks callbacks
;
5016 const char *options
[] =
5018 "listening_ports", "24681",
5019 "document_root", "www",
5020 "index_files", "index.html",
5021 "num_threads", "16",
5022 "error_log_file", LOG_FILE
,
5023 "request_timeout_ms", "10000",
5027 for (i
= 0; i
<= bios_max
; i
++)
5029 ventoy_data_default_control(g_data_control
+ i
);
5030 ventoy_data_default_theme(g_data_theme
+ i
);
5031 ventoy_data_default_menu_alias(g_data_menu_alias
+ i
);
5032 ventoy_data_default_menu_class(g_data_menu_class
+ i
);
5033 ventoy_data_default_menu_tip(g_data_menu_tip
+ i
);
5034 ventoy_data_default_auto_install(g_data_auto_install
+ i
);
5035 ventoy_data_default_persistence(g_data_persistence
+ i
);
5036 ventoy_data_default_injection(g_data_injection
+ i
);
5037 ventoy_data_default_conf_replace(g_data_conf_replace
+ i
);
5038 ventoy_data_default_password(g_data_password
+ i
);
5039 ventoy_data_default_image_list(g_data_image_list
+ i
);
5040 ventoy_data_default_auto_memdisk(g_data_auto_memdisk
+ i
);
5041 ventoy_data_default_dud(g_data_dud
+ i
);
5044 ventoy_get_json_path(filename
, backupname
);
5045 if (ventoy_is_file_exist("%s", filename
))
5047 ventoy_copy_file(filename
, backupname
);
5048 ventoy_load_old_json(filename
);
5053 scnprintf(addr
, sizeof(addr
), "%s:%s", ip
, port
);
5056 memset(&callbacks
, 0, sizeof(callbacks
));
5057 callbacks
.begin_request
= ventoy_request_handler
;
5059 callbacks
.open_file
= ventoy_web_openfile
;
5061 g_ventoy_http_ctx
= mg_start(&callbacks
, NULL
, options
);
5063 ventoy_start_writeback_thread(ventoy_http_writeback
);
5065 return g_ventoy_http_ctx
? 0 : 1;
5068 int ventoy_http_stop(void)
5070 if (g_ventoy_http_ctx
)
5072 mg_stop(g_ventoy_http_ctx
);
5075 ventoy_stop_writeback_thread();
5079 int ventoy_http_init(void)
5084 char *Buffer
= NULL
;
5087 ventoy_read_file_to_buf("www/helplist", 4, (void **)&Buffer
, &BufLen
);
5090 for (i
= 0; i
< BufLen
/ 5; i
++)
5092 memcpy(g_ventoy_help_lang
[i
], Buffer
+ i
* 5, 5);
5093 g_ventoy_help_lang
[i
][5] = 0;
5099 file
= ventoy_tar_find_file("www/helplist");
5102 for (i
= 0; i
< file
->size
/ 5; i
++)
5104 memcpy(g_ventoy_help_lang
[i
], (char *)(file
->addr
) + i
* 5, 5);
5105 g_ventoy_help_lang
[i
][5] = 0;
5110 if (!g_pub_json_buffer
)
5112 g_pub_json_buffer
= malloc(JSON_BUF_MAX
* 2);
5113 g_pub_save_buffer
= g_pub_json_buffer
+ JSON_BUF_MAX
;
5117 pthread_mutex_init(&g_api_mutex
, NULL
);
5121 void ventoy_http_exit(void)
5123 check_free(g_pub_json_buffer
);
5124 g_pub_json_buffer
= NULL
;
5125 g_pub_save_buffer
= NULL
;
5127 pthread_mutex_destroy(&g_api_mutex
);