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;
327 #if defined(_MSC_VER) || defined(WIN32)
328 VTOY_JSON_FMT_STRN("os", "windows");
330 VTOY_JSON_FMT_STRN("os", "linux");
333 VTOY_JSON_FMT_OBJ_END();
334 VTOY_JSON_FMT_END(pos
);
336 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
340 static int ventoy_api_handshake(struct mg_connection
*conn
, VTOY_JSON
*json
)
346 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
347 VTOY_JSON_FMT_OBJ_BEGIN();
348 VTOY_JSON_FMT_SINT("status", 0);
349 VTOY_JSON_FMT_OBJ_END();
350 VTOY_JSON_FMT_END(pos
);
352 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
356 static int ventoy_api_check_exist(struct mg_connection
*conn
, VTOY_JSON
*json
)
361 const char *path
= NULL
;
363 path
= vtoy_json_get_string_ex(json
, "path");
364 vtoy_json_get_int(json
, "dir", &dir
);
370 exist
= ventoy_is_directory_exist("%s", path
);
374 exist
= ventoy_is_file_exist("%s", path
);
378 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
379 VTOY_JSON_FMT_OBJ_BEGIN();
380 VTOY_JSON_FMT_SINT("exist", exist
);
381 VTOY_JSON_FMT_OBJ_END();
382 VTOY_JSON_FMT_END(pos
);
384 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
388 static int ventoy_api_check_exist2(struct mg_connection
*conn
, VTOY_JSON
*json
)
397 const char *path1
= NULL
;
398 const char *path2
= NULL
;
400 path1
= vtoy_json_get_string_ex(json
, "path1");
401 path2
= vtoy_json_get_string_ex(json
, "path2");
402 vtoy_json_get_int(json
, "dir1", &dir1
);
403 vtoy_json_get_int(json
, "dir2", &dir2
);
404 vtoy_json_get_int(json
, "fuzzy1", &fuzzy1
);
405 vtoy_json_get_int(json
, "fuzzy2", &fuzzy2
);
411 exist1
= ventoy_is_directory_exist("%s", path1
);
417 exist1
= ventoy_check_fuzzy_path((char *)path1
, 0);
421 exist1
= ventoy_is_file_exist("%s", path1
);
430 exist2
= ventoy_is_directory_exist("%s", path2
);
436 exist2
= ventoy_check_fuzzy_path((char *)path2
, 0);
440 exist2
= ventoy_is_file_exist("%s", path2
);
445 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
446 VTOY_JSON_FMT_OBJ_BEGIN();
447 VTOY_JSON_FMT_SINT("exist1", exist1
);
448 VTOY_JSON_FMT_SINT("exist2", exist2
);
449 VTOY_JSON_FMT_OBJ_END();
450 VTOY_JSON_FMT_END(pos
);
452 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
456 static int ventoy_api_check_fuzzy(struct mg_connection
*conn
, VTOY_JSON
*json
)
460 const char *path
= NULL
;
462 path
= vtoy_json_get_string_ex(json
, "path");
465 exist
= ventoy_check_fuzzy_path((char *)path
, 0);
468 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
469 VTOY_JSON_FMT_OBJ_BEGIN();
470 VTOY_JSON_FMT_SINT("exist", exist
);
471 VTOY_JSON_FMT_OBJ_END();
472 VTOY_JSON_FMT_END(pos
);
474 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
481 void ventoy_data_default_control(data_control
*data
)
483 memset(data
, 0, sizeof(data_control
));
485 data
->filter_dot_underscore
= 1;
486 data
->max_search_level
= -1;
487 data
->menu_timeout
= 0;
489 strlcpy(data
->default_kbd_layout
, "QWERTY_USA");
490 strlcpy(data
->help_text_language
, "en_US");
493 int ventoy_data_cmp_control(data_control
*data1
, data_control
*data2
)
495 if (data1
->default_menu_mode
!= data2
->default_menu_mode
||
496 data1
->treeview_style
!= data2
->treeview_style
||
497 data1
->filter_dot_underscore
!= data2
->filter_dot_underscore
||
498 data1
->sort_casesensitive
!= data2
->sort_casesensitive
||
499 data1
->max_search_level
!= data2
->max_search_level
||
500 data1
->vhd_no_warning
!= data2
->vhd_no_warning
||
501 data1
->filter_iso
!= data2
->filter_iso
||
502 data1
->filter_wim
!= data2
->filter_wim
||
503 data1
->filter_efi
!= data2
->filter_efi
||
504 data1
->filter_img
!= data2
->filter_img
||
505 data1
->filter_vhd
!= data2
->filter_vhd
||
506 data1
->filter_vtoy
!= data2
->filter_vtoy
||
507 data1
->win11_bypass_check
!= data2
->win11_bypass_check
||
508 data1
->menu_timeout
!= data2
->menu_timeout
)
513 if (strcmp(data1
->default_search_root
, data2
->default_search_root
) ||
514 strcmp(data1
->default_image
, data2
->default_image
) ||
515 strcmp(data1
->default_kbd_layout
, data2
->default_kbd_layout
) ||
516 strcmp(data1
->help_text_language
, data2
->help_text_language
))
524 int ventoy_data_save_control(data_control
*data
, const char *title
, char *buf
, int buflen
)
527 data_control
*def
= g_data_control
+ bios_max
;
529 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
531 VTOY_JSON_FMT_KEY_L(L1
, title
);
532 VTOY_JSON_FMT_ARY_BEGIN_N();
534 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_DEFAULT_MENU_MODE", default_menu_mode
);
535 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_TREE_VIEW_MENU_STYLE", treeview_style
);
536 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILT_DOT_UNDERSCORE_FILE", filter_dot_underscore
);
537 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_SORT_CASE_SENSITIVE", sort_casesensitive
);
539 if (data
->max_search_level
>= 0)
541 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_MAX_SEARCH_LEVEL", max_search_level
);
544 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_VHD_NO_WARNING", vhd_no_warning
);
545 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_ISO", filter_iso
);
546 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_WIM", filter_wim
);
547 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_EFI", filter_efi
);
548 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_IMG", filter_img
);
549 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_VHD", filter_vhd
);
550 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_VTOY", filter_vtoy
);
551 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_WIN11_BYPASS_CHECK", win11_bypass_check
);
552 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_MENU_TIMEOUT", menu_timeout
);
554 VTOY_JSON_FMT_CTRL_STRN(L2
, "VTOY_DEFAULT_KBD_LAYOUT", default_kbd_layout
);
555 VTOY_JSON_FMT_CTRL_STRN(L2
, "VTOY_HELP_TXT_LANGUAGE", help_text_language
);
557 if (strcmp(def
->default_search_root
, data
->default_search_root
))
559 VTOY_JSON_FMT_CTRL_STRN_STR(L2
, "VTOY_DEFAULT_SEARCH_ROOT", ventoy_real_path(data
->default_search_root
));
562 if (strcmp(def
->default_image
, data
->default_image
))
564 VTOY_JSON_FMT_CTRL_STRN_STR(L2
, "VTOY_DEFAULT_IMAGE", ventoy_real_path(data
->default_image
));
567 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
568 VTOY_JSON_FMT_END(pos
);
573 int ventoy_data_json_control(data_control
*ctrl
, char *buf
, int buflen
)
579 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
580 VTOY_JSON_FMT_OBJ_BEGIN();
582 VTOY_JSON_FMT_SINT("default_menu_mode", ctrl
->default_menu_mode
);
583 VTOY_JSON_FMT_SINT("treeview_style", ctrl
->treeview_style
);
584 VTOY_JSON_FMT_SINT("filter_dot_underscore", ctrl
->filter_dot_underscore
);
585 VTOY_JSON_FMT_SINT("sort_casesensitive", ctrl
->sort_casesensitive
);
586 VTOY_JSON_FMT_SINT("max_search_level", ctrl
->max_search_level
);
587 VTOY_JSON_FMT_SINT("vhd_no_warning", ctrl
->vhd_no_warning
);
589 VTOY_JSON_FMT_SINT("filter_iso", ctrl
->filter_iso
);
590 VTOY_JSON_FMT_SINT("filter_wim", ctrl
->filter_wim
);
591 VTOY_JSON_FMT_SINT("filter_efi", ctrl
->filter_efi
);
592 VTOY_JSON_FMT_SINT("filter_img", ctrl
->filter_img
);
593 VTOY_JSON_FMT_SINT("filter_vhd", ctrl
->filter_vhd
);
594 VTOY_JSON_FMT_SINT("filter_vtoy", ctrl
->filter_vtoy
);
595 VTOY_JSON_FMT_SINT("win11_bypass_check", ctrl
->win11_bypass_check
);
596 VTOY_JSON_FMT_SINT("menu_timeout", ctrl
->menu_timeout
);
597 VTOY_JSON_FMT_STRN("default_kbd_layout", ctrl
->default_kbd_layout
);
598 VTOY_JSON_FMT_STRN("help_text_language", ctrl
->help_text_language
);
601 if (ctrl
->default_search_root
[0] && ventoy_is_directory_exist("%s%s", g_cur_dir
, ctrl
->default_search_root
))
605 VTOY_JSON_FMT_STRN("default_search_root", ctrl
->default_search_root
);
606 VTOY_JSON_FMT_SINT("default_search_root_valid", valid
);
610 if (ctrl
->default_image
[0] && ventoy_is_file_exist("%s%s", g_cur_dir
, ctrl
->default_image
))
614 VTOY_JSON_FMT_STRN("default_image", ctrl
->default_image
);
615 VTOY_JSON_FMT_SINT("default_image_valid", valid
);
617 VTOY_JSON_FMT_KEY("help_list");
618 VTOY_JSON_FMT_ARY_BEGIN();
620 for (i
= 0; g_ventoy_help_lang
[i
][0]; i
++)
622 VTOY_JSON_FMT_ITEM(g_ventoy_help_lang
[i
]);
624 VTOY_JSON_FMT_ARY_ENDEX();
627 VTOY_JSON_FMT_OBJ_END();
628 VTOY_JSON_FMT_END(pos
);
633 static int ventoy_api_get_control(struct mg_connection
*conn
, VTOY_JSON
*json
)
635 api_get_func(conn
, json
, control
);
639 static int ventoy_api_save_control(struct mg_connection
*conn
, VTOY_JSON
*json
)
643 data_control
*ctrl
= NULL
;
645 vtoy_json_get_int(json
, "index", &index
);
646 ctrl
= g_data_control
+ index
;
648 VTOY_JSON_INT("default_menu_mode", ctrl
->default_menu_mode
);
649 VTOY_JSON_INT("treeview_style", ctrl
->treeview_style
);
650 VTOY_JSON_INT("filter_dot_underscore", ctrl
->filter_dot_underscore
);
651 VTOY_JSON_INT("sort_casesensitive", ctrl
->sort_casesensitive
);
652 VTOY_JSON_INT("max_search_level", ctrl
->max_search_level
);
653 VTOY_JSON_INT("vhd_no_warning", ctrl
->vhd_no_warning
);
654 VTOY_JSON_INT("filter_iso", ctrl
->filter_iso
);
655 VTOY_JSON_INT("filter_wim", ctrl
->filter_wim
);
656 VTOY_JSON_INT("filter_efi", ctrl
->filter_efi
);
657 VTOY_JSON_INT("filter_img", ctrl
->filter_img
);
658 VTOY_JSON_INT("filter_vhd", ctrl
->filter_vhd
);
659 VTOY_JSON_INT("filter_vtoy", ctrl
->filter_vtoy
);
660 VTOY_JSON_INT("win11_bypass_check", ctrl
->win11_bypass_check
);
661 VTOY_JSON_INT("menu_timeout", ctrl
->menu_timeout
);
663 VTOY_JSON_STR("default_image", ctrl
->default_image
);
664 VTOY_JSON_STR("default_search_root", ctrl
->default_search_root
);
665 VTOY_JSON_STR("help_text_language", ctrl
->help_text_language
);
666 VTOY_JSON_STR("default_kbd_layout", ctrl
->default_kbd_layout
);
668 ret
= ventoy_data_save_all();
670 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
678 void ventoy_data_default_theme(data_theme
*data
)
680 memset(data
, 0, sizeof(data_theme
));
681 strlcpy(data
->gfxmode
, "1024x768");
682 scnprintf(data
->ventoy_left
, sizeof(data
->ventoy_left
), "5%%");
683 scnprintf(data
->ventoy_top
, sizeof(data
->ventoy_top
), "95%%");
684 scnprintf(data
->ventoy_color
, sizeof(data
->ventoy_color
), "%s", "#0000ff");
687 int ventoy_data_cmp_theme(data_theme
*data1
, data_theme
*data2
)
689 if (data1
->display_mode
!= data2
->display_mode
||
690 strcmp(data1
->ventoy_left
, data2
->ventoy_left
) ||
691 strcmp(data1
->ventoy_top
, data2
->ventoy_top
) ||
692 strcmp(data1
->gfxmode
, data2
->gfxmode
) ||
693 strcmp(data1
->ventoy_color
, data2
->ventoy_color
)
699 if (ventoy_path_list_cmp(data1
->filelist
, data2
->filelist
))
704 if (ventoy_path_list_cmp(data1
->fontslist
, data2
->fontslist
))
713 int ventoy_data_save_theme(data_theme
*data
, const char *title
, char *buf
, int buflen
)
716 path_node
*node
= NULL
;
717 data_theme
*def
= g_data_theme
+ bios_max
;
719 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
721 VTOY_JSON_FMT_KEY_L(L1
, title
);
722 VTOY_JSON_FMT_OBJ_BEGIN_N();
726 if (data
->filelist
->next
)
728 VTOY_JSON_FMT_KEY_L(L2
, "file");
729 VTOY_JSON_FMT_ARY_BEGIN_N();
731 for (node
= data
->filelist
; node
; node
= node
->next
)
733 VTOY_JSON_FMT_ITEM_PATH_LN(L3
, node
->path
);
736 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
738 if (def
->default_file
!= data
->default_file
)
740 VTOY_JSON_FMT_SINT_LN(L2
, "default_file", data
->default_file
);
745 VTOY_JSON_FMT_STRN_PATH_LN(L2
, "file", data
->filelist
->path
);
749 if (data
->display_mode
!= def
->display_mode
)
751 if (display_mode_cli
== data
->display_mode
)
753 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "CLI");
755 else if (display_mode_serial
== data
->display_mode
)
757 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "serial");
759 else if (display_mode_ser_console
== data
->display_mode
)
761 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "serial_console");
765 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "GUI");
769 VTOY_JSON_FMT_DIFF_STRN(L2
, "gfxmode", gfxmode
);
771 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_left", ventoy_left
);
772 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_top", ventoy_top
);
773 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_color", ventoy_color
);
777 VTOY_JSON_FMT_KEY_L(L2
, "fonts");
778 VTOY_JSON_FMT_ARY_BEGIN_N();
780 for (node
= data
->fontslist
; node
; node
= node
->next
)
782 VTOY_JSON_FMT_ITEM_PATH_LN(L3
, node
->path
);
785 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
788 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
789 VTOY_JSON_FMT_END(pos
);
795 int ventoy_data_json_theme(data_theme
*data
, char *buf
, int buflen
)
798 path_node
*node
= NULL
;
800 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
801 VTOY_JSON_FMT_OBJ_BEGIN();
803 VTOY_JSON_FMT_SINT("default_file", data
->default_file
);
804 VTOY_JSON_FMT_SINT("display_mode", data
->display_mode
);
805 VTOY_JSON_FMT_STRN("gfxmode", data
->gfxmode
);
807 VTOY_JSON_FMT_STRN("ventoy_color", data
->ventoy_color
);
808 VTOY_JSON_FMT_STRN("ventoy_left", data
->ventoy_left
);
809 VTOY_JSON_FMT_STRN("ventoy_top", data
->ventoy_top
);
811 VTOY_JSON_FMT_KEY("filelist");
812 VTOY_JSON_FMT_ARY_BEGIN();
813 for (node
= data
->filelist
; node
; node
= node
->next
)
815 VTOY_JSON_FMT_OBJ_BEGIN();
816 VTOY_JSON_FMT_STRN("path", node
->path
);
817 VTOY_JSON_FMT_SINT("valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->path
));
818 VTOY_JSON_FMT_OBJ_ENDEX();
820 VTOY_JSON_FMT_ARY_ENDEX();
822 VTOY_JSON_FMT_KEY("fontslist");
823 VTOY_JSON_FMT_ARY_BEGIN();
824 for (node
= data
->fontslist
; node
; node
= node
->next
)
826 VTOY_JSON_FMT_OBJ_BEGIN();
827 VTOY_JSON_FMT_STRN("path", node
->path
);
828 VTOY_JSON_FMT_SINT("valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->path
));
829 VTOY_JSON_FMT_OBJ_ENDEX();
831 VTOY_JSON_FMT_ARY_ENDEX();
833 VTOY_JSON_FMT_OBJ_END();
834 VTOY_JSON_FMT_END(pos
);
839 static int ventoy_api_get_theme(struct mg_connection
*conn
, VTOY_JSON
*json
)
841 api_get_func(conn
, json
, theme
);
845 static int ventoy_api_save_theme(struct mg_connection
*conn
, VTOY_JSON
*json
)
849 data_theme
*data
= NULL
;
851 vtoy_json_get_int(json
, "index", &index
);
852 data
= g_data_theme
+ index
;
854 VTOY_JSON_INT("default_file", data
->default_file
);
855 VTOY_JSON_INT("display_mode", data
->display_mode
);
856 VTOY_JSON_STR("gfxmode", data
->gfxmode
);
857 VTOY_JSON_STR("ventoy_left", data
->ventoy_left
);
858 VTOY_JSON_STR("ventoy_top", data
->ventoy_top
);
859 VTOY_JSON_STR("ventoy_color", data
->ventoy_color
);
861 ret
= ventoy_data_save_all();
863 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
867 static int ventoy_api_theme_add_file(struct mg_connection
*conn
, VTOY_JSON
*json
)
871 const char *path
= NULL
;
872 path_node
*node
= NULL
;
873 path_node
*cur
= NULL
;
874 data_theme
*data
= NULL
;
876 vtoy_json_get_int(json
, "index", &index
);
877 data
= g_data_theme
+ index
;
879 path
= VTOY_JSON_STR_EX("path");
882 node
= zalloc(sizeof(path_node
));
885 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
887 vtoy_list_add(data
->filelist
, cur
, node
);
891 ret
= ventoy_data_save_all();
893 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
897 static int ventoy_api_theme_del_file(struct mg_connection
*conn
, VTOY_JSON
*json
)
901 const char *path
= NULL
;
902 path_node
*node
= NULL
;
903 path_node
*last
= NULL
;
904 data_theme
*data
= NULL
;
906 vtoy_json_get_int(json
, "index", &index
);
907 data
= g_data_theme
+ index
;
909 path
= VTOY_JSON_STR_EX("path");
912 vtoy_list_del(last
, node
, data
->filelist
, path
);
915 ret
= ventoy_data_save_all();
917 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
922 static int ventoy_api_theme_add_font(struct mg_connection
*conn
, VTOY_JSON
*json
)
926 const char *path
= NULL
;
927 path_node
*node
= NULL
;
928 path_node
*cur
= NULL
;
929 data_theme
*data
= NULL
;
931 vtoy_json_get_int(json
, "index", &index
);
932 data
= g_data_theme
+ index
;
934 path
= VTOY_JSON_STR_EX("path");
937 node
= zalloc(sizeof(path_node
));
940 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
941 vtoy_list_add(data
->fontslist
, cur
, node
);
945 ret
= ventoy_data_save_all();
947 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
952 static int ventoy_api_theme_del_font(struct mg_connection
*conn
, VTOY_JSON
*json
)
956 const char *path
= NULL
;
957 path_node
*node
= NULL
;
958 path_node
*last
= NULL
;
959 data_theme
*data
= NULL
;
961 vtoy_json_get_int(json
, "index", &index
);
962 data
= g_data_theme
+ index
;
964 path
= VTOY_JSON_STR_EX("path");
967 vtoy_list_del(last
, node
, data
->fontslist
, path
);
970 ret
= ventoy_data_save_all();
972 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
979 void ventoy_data_default_menu_alias(data_alias
*data
)
981 memset(data
, 0, sizeof(data_alias
));
984 int ventoy_data_cmp_menu_alias(data_alias
*data1
, data_alias
*data2
)
986 data_alias_node
*list1
= NULL
;
987 data_alias_node
*list2
= NULL
;
989 if (NULL
== data1
->list
&& NULL
== data2
->list
)
993 else if (data1
->list
&& data2
->list
)
998 while (list1
&& list2
)
1000 if ((list1
->type
!= list2
->type
) ||
1001 strcmp(list1
->path
, list2
->path
) ||
1002 strcmp(list1
->alias
, list2
->alias
))
1007 list1
= list1
->next
;
1008 list2
= list2
->next
;
1011 if (list1
== NULL
&& list2
== NULL
)
1026 int ventoy_data_save_menu_alias(data_alias
*data
, const char *title
, char *buf
, int buflen
)
1029 data_alias_node
*node
= NULL
;
1031 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1033 VTOY_JSON_FMT_KEY_L(L1
, title
);
1034 VTOY_JSON_FMT_ARY_BEGIN_N();
1036 for (node
= data
->list
; node
; node
= node
->next
)
1038 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
1040 if (node
->type
== path_type_file
)
1042 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
1046 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "dir", node
->path
);
1049 VTOY_JSON_FMT_STRN_EX_LN(L3
, "alias", node
->alias
);
1051 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
1054 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1055 VTOY_JSON_FMT_END(pos
);
1061 int ventoy_data_json_menu_alias(data_alias
*data
, char *buf
, int buflen
)
1065 data_alias_node
*node
= NULL
;
1067 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1068 VTOY_JSON_FMT_ARY_BEGIN();
1070 for (node
= data
->list
; node
; node
= node
->next
)
1072 VTOY_JSON_FMT_OBJ_BEGIN();
1074 VTOY_JSON_FMT_UINT("type", node
->type
);
1075 VTOY_JSON_FMT_STRN("path", node
->path
);
1076 if (node
->type
== path_type_file
)
1078 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1082 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1085 VTOY_JSON_FMT_SINT("valid", valid
);
1086 VTOY_JSON_FMT_STRN("alias", node
->alias
);
1088 VTOY_JSON_FMT_OBJ_ENDEX();
1091 VTOY_JSON_FMT_ARY_END();
1092 VTOY_JSON_FMT_END(pos
);
1097 static int ventoy_api_get_alias(struct mg_connection
*conn
, VTOY_JSON
*json
)
1099 api_get_func(conn
, json
, menu_alias
);
1103 static int ventoy_api_save_alias(struct mg_connection
*conn
, VTOY_JSON
*json
)
1106 ret
= ventoy_data_save_all();
1108 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1112 static int ventoy_api_alias_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1116 int type
= path_type_file
;
1117 const char *path
= NULL
;
1118 const char *alias
= NULL
;
1119 data_alias_node
*node
= NULL
;
1120 data_alias_node
*cur
= NULL
;
1121 data_alias
*data
= NULL
;
1123 vtoy_json_get_int(json
, "index", &index
);
1124 data
= g_data_menu_alias
+ index
;
1126 vtoy_json_get_int(json
, "type", &type
);
1128 path
= VTOY_JSON_STR_EX("path");
1129 alias
= VTOY_JSON_STR_EX("alias");
1132 node
= zalloc(sizeof(data_alias_node
));
1136 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1137 scnprintf(node
->alias
, sizeof(node
->alias
), "%s", alias
);
1139 vtoy_list_add(data
->list
, cur
, node
);
1143 ret
= ventoy_data_save_all();
1145 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1149 static int ventoy_api_alias_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1153 const char *path
= NULL
;
1154 data_alias_node
*last
= NULL
;
1155 data_alias_node
*node
= NULL
;
1156 data_alias
*data
= NULL
;
1158 vtoy_json_get_int(json
, "index", &index
);
1159 data
= g_data_menu_alias
+ index
;
1161 path
= VTOY_JSON_STR_EX("path");
1164 vtoy_list_del(last
, node
, data
->list
, path
);
1167 ret
= ventoy_data_save_all();
1169 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1176 void ventoy_data_default_menu_tip(data_tip
*data
)
1178 memset(data
, 0, sizeof(data_tip
));
1180 scnprintf(data
->left
, sizeof(data
->left
), "10%%");
1181 scnprintf(data
->top
, sizeof(data
->top
), "81%%");
1182 scnprintf(data
->color
, sizeof(data
->color
), "%s", "blue");
1185 int ventoy_data_cmp_menu_tip(data_tip
*data1
, data_tip
*data2
)
1187 data_tip_node
*list1
= NULL
;
1188 data_tip_node
*list2
= NULL
;
1190 if (strcmp(data1
->left
, data2
->left
) || strcmp(data1
->top
, data2
->top
) || strcmp(data1
->color
, data2
->color
))
1195 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1199 else if (data1
->list
&& data2
->list
)
1201 list1
= data1
->list
;
1202 list2
= data2
->list
;
1204 while (list1
&& list2
)
1206 if ((list1
->type
!= list2
->type
) ||
1207 strcmp(list1
->path
, list2
->path
) ||
1208 strcmp(list1
->tip
, list2
->tip
))
1213 list1
= list1
->next
;
1214 list2
= list2
->next
;
1217 if (list1
== NULL
&& list2
== NULL
)
1232 int ventoy_data_save_menu_tip(data_tip
*data
, const char *title
, char *buf
, int buflen
)
1235 data_tip_node
*node
= NULL
;
1236 data_tip
*def
= g_data_menu_tip
+ bios_max
;
1238 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1239 VTOY_JSON_FMT_KEY_L(L1
, title
);
1240 VTOY_JSON_FMT_OBJ_BEGIN_N();
1242 VTOY_JSON_FMT_DIFF_STRN(L2
, "left", left
);
1243 VTOY_JSON_FMT_DIFF_STRN(L2
, "top", top
);
1244 VTOY_JSON_FMT_DIFF_STRN(L2
, "color", color
);
1248 VTOY_JSON_FMT_KEY_L(L2
, "tips");
1249 VTOY_JSON_FMT_ARY_BEGIN_N();
1251 for (node
= data
->list
; node
; node
= node
->next
)
1253 VTOY_JSON_FMT_OBJ_BEGIN_LN(L3
);
1255 if (node
->type
== path_type_file
)
1257 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "image", node
->path
);
1261 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "dir", node
->path
);
1263 VTOY_JSON_FMT_STRN_EX_LN(L4
, "tip", node
->tip
);
1265 VTOY_JSON_FMT_OBJ_ENDEX_LN(L3
);
1268 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
1271 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
1273 VTOY_JSON_FMT_END(pos
);
1279 int ventoy_data_json_menu_tip(data_tip
*data
, char *buf
, int buflen
)
1283 data_tip_node
*node
= NULL
;
1285 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1287 VTOY_JSON_FMT_OBJ_BEGIN();
1289 VTOY_JSON_FMT_STRN("left", data
->left
);
1290 VTOY_JSON_FMT_STRN("top", data
->top
);
1291 VTOY_JSON_FMT_STRN("color", data
->color
);
1293 VTOY_JSON_FMT_KEY("tips");
1294 VTOY_JSON_FMT_ARY_BEGIN();
1296 for (node
= data
->list
; node
; node
= node
->next
)
1298 VTOY_JSON_FMT_OBJ_BEGIN();
1300 VTOY_JSON_FMT_UINT("type", node
->type
);
1301 VTOY_JSON_FMT_STRN("path", node
->path
);
1302 if (node
->type
== path_type_file
)
1304 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1308 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1311 VTOY_JSON_FMT_SINT("valid", valid
);
1312 VTOY_JSON_FMT_STRN("tip", node
->tip
);
1314 VTOY_JSON_FMT_OBJ_ENDEX();
1317 VTOY_JSON_FMT_ARY_ENDEX();
1319 VTOY_JSON_FMT_OBJ_END();
1320 VTOY_JSON_FMT_END(pos
);
1325 static int ventoy_api_get_tip(struct mg_connection
*conn
, VTOY_JSON
*json
)
1327 api_get_func(conn
, json
, menu_tip
);
1331 static int ventoy_api_save_tip(struct mg_connection
*conn
, VTOY_JSON
*json
)
1335 data_tip
*data
= NULL
;
1337 vtoy_json_get_int(json
, "index", &index
);
1338 data
= g_data_menu_tip
+ index
;
1340 VTOY_JSON_STR("left", data
->left
);
1341 VTOY_JSON_STR("top", data
->top
);
1342 VTOY_JSON_STR("color", data
->color
);
1344 ret
= ventoy_data_save_all();
1346 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1350 static int ventoy_api_tip_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1354 int type
= path_type_file
;
1355 const char *path
= NULL
;
1356 const char *tip
= NULL
;
1357 data_tip_node
*node
= NULL
;
1358 data_tip_node
*cur
= NULL
;
1359 data_tip
*data
= NULL
;
1361 vtoy_json_get_int(json
, "index", &index
);
1362 data
= g_data_menu_tip
+ index
;
1364 vtoy_json_get_int(json
, "type", &type
);
1366 path
= VTOY_JSON_STR_EX("path");
1367 tip
= VTOY_JSON_STR_EX("tip");
1370 node
= zalloc(sizeof(data_tip_node
));
1374 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1375 scnprintf(node
->tip
, sizeof(node
->tip
), "%s", tip
);
1377 vtoy_list_add(data
->list
, cur
, node
);
1381 ret
= ventoy_data_save_all();
1383 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1387 static int ventoy_api_tip_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1391 const char *path
= NULL
;
1392 data_tip_node
*last
= NULL
;
1393 data_tip_node
*node
= NULL
;
1394 data_tip
*data
= NULL
;
1396 vtoy_json_get_int(json
, "index", &index
);
1397 data
= g_data_menu_tip
+ index
;
1399 path
= VTOY_JSON_STR_EX("path");
1402 vtoy_list_del(last
, node
, data
->list
, path
);
1405 ret
= ventoy_data_save_all();
1407 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1414 void ventoy_data_default_menu_class(data_class
*data
)
1416 memset(data
, 0, sizeof(data_class
));
1419 int ventoy_data_cmp_menu_class(data_class
*data1
, data_class
*data2
)
1421 data_class_node
*list1
= NULL
;
1422 data_class_node
*list2
= NULL
;
1424 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1428 else if (data1
->list
&& data2
->list
)
1430 list1
= data1
->list
;
1431 list2
= data2
->list
;
1433 while (list1
&& list2
)
1435 if ((list1
->type
!= list2
->type
) ||
1436 strcmp(list1
->path
, list2
->path
) ||
1437 strcmp(list1
->class, list2
->class))
1442 list1
= list1
->next
;
1443 list2
= list2
->next
;
1446 if (list1
== NULL
&& list2
== NULL
)
1461 int ventoy_data_save_menu_class(data_class
*data
, const char *title
, char *buf
, int buflen
)
1464 data_class_node
*node
= NULL
;
1466 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1468 VTOY_JSON_FMT_KEY_L(L1
, title
);
1469 VTOY_JSON_FMT_ARY_BEGIN_N();
1471 for (node
= data
->list
; node
; node
= node
->next
)
1473 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
1475 if (node
->type
== class_type_key
)
1477 VTOY_JSON_FMT_STRN_LN(L3
, "key", node
->path
);
1479 else if (node
->type
== class_type_dir
)
1481 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "dir", node
->path
);
1485 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
1487 VTOY_JSON_FMT_STRN_LN(L3
, "class", node
->class);
1489 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
1492 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1493 VTOY_JSON_FMT_END(pos
);
1499 int ventoy_data_json_menu_class(data_class
*data
, char *buf
, int buflen
)
1503 data_class_node
*node
= NULL
;
1505 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1506 VTOY_JSON_FMT_ARY_BEGIN();
1508 for (node
= data
->list
; node
; node
= node
->next
)
1510 VTOY_JSON_FMT_OBJ_BEGIN();
1512 VTOY_JSON_FMT_UINT("type", node
->type
);
1513 VTOY_JSON_FMT_STRN("path", node
->path
);
1515 if (node
->type
== class_type_key
)
1521 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1523 VTOY_JSON_FMT_SINT("valid", valid
);
1525 VTOY_JSON_FMT_STRN("class", node
->class);
1527 VTOY_JSON_FMT_OBJ_ENDEX();
1530 VTOY_JSON_FMT_ARY_END();
1531 VTOY_JSON_FMT_END(pos
);
1537 static int ventoy_api_get_class(struct mg_connection
*conn
, VTOY_JSON
*json
)
1539 api_get_func(conn
, json
, menu_class
);
1543 static int ventoy_api_save_class(struct mg_connection
*conn
, VTOY_JSON
*json
)
1546 ret
= ventoy_data_save_all();
1548 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1552 static int ventoy_api_class_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1556 int type
= class_type_key
;
1557 const char *path
= NULL
;
1558 const char *class = NULL
;
1559 data_class_node
*node
= NULL
;
1560 data_class_node
*cur
= NULL
;
1561 data_class
*data
= NULL
;
1563 vtoy_json_get_int(json
, "index", &index
);
1564 data
= g_data_menu_class
+ index
;
1566 vtoy_json_get_int(json
, "type", &type
);
1568 path
= VTOY_JSON_STR_EX("path");
1569 class = VTOY_JSON_STR_EX("class");
1572 node
= zalloc(sizeof(data_class_node
));
1577 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1578 scnprintf(node
->class, sizeof(node
->class), "%s", class);
1580 vtoy_list_add(data
->list
, cur
, node
);
1584 ret
= ventoy_data_save_all();
1586 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1590 static int ventoy_api_class_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1594 const char *path
= NULL
;
1595 data_class_node
*last
= NULL
;
1596 data_class_node
*node
= NULL
;
1597 data_class
*data
= NULL
;
1599 vtoy_json_get_int(json
, "index", &index
);
1600 data
= g_data_menu_class
+ index
;
1602 path
= VTOY_JSON_STR_EX("path");
1605 vtoy_list_del(last
, node
, data
->list
, path
);
1608 ret
= ventoy_data_save_all();
1610 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1617 void ventoy_data_default_auto_memdisk(data_auto_memdisk
*data
)
1619 memset(data
, 0, sizeof(data_auto_memdisk
));
1622 int ventoy_data_cmp_auto_memdisk(data_auto_memdisk
*data1
, data_auto_memdisk
*data2
)
1624 return ventoy_path_list_cmp(data1
->list
, data2
->list
);
1627 int ventoy_data_save_auto_memdisk(data_auto_memdisk
*data
, const char *title
, char *buf
, int buflen
)
1630 path_node
*node
= NULL
;
1632 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1634 VTOY_JSON_FMT_KEY_L(L1
, title
);
1635 VTOY_JSON_FMT_ARY_BEGIN_N();
1637 for (node
= data
->list
; node
; node
= node
->next
)
1639 VTOY_JSON_FMT_ITEM_PATH_LN(L2
, node
->path
);
1642 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1643 VTOY_JSON_FMT_END(pos
);
1648 int ventoy_data_json_auto_memdisk(data_auto_memdisk
*data
, char *buf
, int buflen
)
1652 path_node
*node
= NULL
;
1654 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1655 VTOY_JSON_FMT_ARY_BEGIN();
1657 for (node
= data
->list
; node
; node
= node
->next
)
1659 VTOY_JSON_FMT_OBJ_BEGIN();
1661 VTOY_JSON_FMT_STRN("path", node
->path
);
1662 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1663 VTOY_JSON_FMT_SINT("valid", valid
);
1665 VTOY_JSON_FMT_OBJ_ENDEX();
1668 VTOY_JSON_FMT_ARY_END();
1669 VTOY_JSON_FMT_END(pos
);
1674 static int ventoy_api_get_auto_memdisk(struct mg_connection
*conn
, VTOY_JSON
*json
)
1676 api_get_func(conn
, json
, auto_memdisk
);
1680 static int ventoy_api_save_auto_memdisk(struct mg_connection
*conn
, VTOY_JSON
*json
)
1684 ret
= ventoy_data_save_all();
1686 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1690 static int ventoy_api_auto_memdisk_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1694 const char *path
= NULL
;
1695 path_node
*node
= NULL
;
1696 path_node
*cur
= NULL
;
1697 data_auto_memdisk
*data
= NULL
;
1699 vtoy_json_get_int(json
, "index", &index
);
1700 data
= g_data_auto_memdisk
+ index
;
1702 path
= VTOY_JSON_STR_EX("path");
1705 node
= zalloc(sizeof(path_node
));
1708 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1709 vtoy_list_add(data
->list
, cur
, node
);
1713 ret
= ventoy_data_save_all();
1715 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1719 static int ventoy_api_auto_memdisk_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1723 const char *path
= NULL
;
1724 path_node
*last
= NULL
;
1725 path_node
*node
= NULL
;
1726 data_auto_memdisk
*data
= NULL
;
1728 vtoy_json_get_int(json
, "index", &index
);
1729 data
= g_data_auto_memdisk
+ index
;
1731 path
= VTOY_JSON_STR_EX("path");
1734 vtoy_list_del(last
, node
, data
->list
, path
);
1737 ret
= ventoy_data_save_all();
1739 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1746 void ventoy_data_default_image_list(data_image_list
*data
)
1748 memset(data
, 0, sizeof(data_image_list
));
1751 int ventoy_data_cmp_image_list(data_image_list
*data1
, data_image_list
*data2
)
1753 if (data1
->type
!= data2
->type
)
1755 if (data1
->list
|| data2
->list
)
1765 return ventoy_path_list_cmp(data1
->list
, data2
->list
);
1768 int ventoy_data_save_image_list(data_image_list
*data
, const char *title
, char *buf
, int buflen
)
1771 path_node
*node
= NULL
;
1780 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1782 if (data
->type
== 0)
1784 VTOY_JSON_FMT_KEY_L(L1
, "image_list");
1788 VTOY_JSON_FMT_KEY_L(L1
, "image_blacklist");
1791 VTOY_JSON_FMT_ARY_BEGIN_N();
1793 for (node
= data
->list
; node
; node
= node
->next
)
1795 VTOY_JSON_FMT_ITEM_PATH_LN(L2
, node
->path
);
1798 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1799 VTOY_JSON_FMT_END(pos
);
1804 int ventoy_data_json_image_list(data_image_list
*data
, char *buf
, int buflen
)
1808 path_node
*node
= NULL
;
1810 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1812 VTOY_JSON_FMT_OBJ_BEGIN();
1813 VTOY_JSON_FMT_SINT("type", data
->type
);
1815 VTOY_JSON_FMT_KEY("list");
1816 VTOY_JSON_FMT_ARY_BEGIN();
1818 for (node
= data
->list
; node
; node
= node
->next
)
1820 VTOY_JSON_FMT_OBJ_BEGIN();
1822 VTOY_JSON_FMT_STRN("path", node
->path
);
1823 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1824 VTOY_JSON_FMT_SINT("valid", valid
);
1826 VTOY_JSON_FMT_OBJ_ENDEX();
1829 VTOY_JSON_FMT_ARY_ENDEX();
1830 VTOY_JSON_FMT_OBJ_END();
1832 VTOY_JSON_FMT_END(pos
);
1837 static int ventoy_api_get_image_list(struct mg_connection
*conn
, VTOY_JSON
*json
)
1839 api_get_func(conn
, json
, image_list
);
1843 static int ventoy_api_save_image_list(struct mg_connection
*conn
, VTOY_JSON
*json
)
1847 data_image_list
*data
= NULL
;
1849 vtoy_json_get_int(json
, "index", &index
);
1850 data
= g_data_image_list
+ index
;
1852 VTOY_JSON_INT("type", data
->type
);
1854 ret
= ventoy_data_save_all();
1856 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1860 static int ventoy_api_image_list_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1864 const char *path
= NULL
;
1865 path_node
*node
= NULL
;
1866 path_node
*cur
= NULL
;
1867 data_image_list
*data
= NULL
;
1869 vtoy_json_get_int(json
, "index", &index
);
1870 data
= g_data_image_list
+ index
;
1872 path
= VTOY_JSON_STR_EX("path");
1875 node
= zalloc(sizeof(path_node
));
1878 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1879 vtoy_list_add(data
->list
, cur
, node
);
1883 ret
= ventoy_data_save_all();
1885 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1889 static int ventoy_api_image_list_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1893 const char *path
= NULL
;
1894 path_node
*last
= NULL
;
1895 path_node
*node
= NULL
;
1896 data_image_list
*data
= NULL
;
1898 vtoy_json_get_int(json
, "index", &index
);
1899 data
= g_data_image_list
+ index
;
1901 path
= VTOY_JSON_STR_EX("path");
1904 vtoy_list_del(last
, node
, data
->list
, path
);
1907 ret
= ventoy_data_save_all();
1909 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1916 void ventoy_data_default_password(data_password
*data
)
1918 memset(data
, 0, sizeof(data_password
));
1921 int ventoy_data_cmp_password(data_password
*data1
, data_password
*data2
)
1923 menu_password
*list1
= NULL
;
1924 menu_password
*list2
= NULL
;
1926 if (strcmp(data1
->bootpwd
, data2
->bootpwd
) ||
1927 strcmp(data1
->isopwd
, data2
->isopwd
) ||
1928 strcmp(data1
->wimpwd
, data2
->wimpwd
) ||
1929 strcmp(data1
->vhdpwd
, data2
->vhdpwd
) ||
1930 strcmp(data1
->imgpwd
, data2
->imgpwd
) ||
1931 strcmp(data1
->efipwd
, data2
->efipwd
) ||
1932 strcmp(data1
->vtoypwd
, data2
->vtoypwd
)
1938 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1942 else if (data1
->list
&& data2
->list
)
1944 list1
= data1
->list
;
1945 list2
= data2
->list
;
1947 while (list1
&& list2
)
1949 if ((list1
->type
!= list2
->type
) || strcmp(list1
->path
, list2
->path
))
1954 list1
= list1
->next
;
1955 list2
= list2
->next
;
1958 if (list1
== NULL
&& list2
== NULL
)
1973 int ventoy_data_save_password(data_password
*data
, const char *title
, char *buf
, int buflen
)
1976 menu_password
*node
= NULL
;
1977 data_password
*def
= g_data_password
+ bios_max
;
1979 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1980 VTOY_JSON_FMT_KEY_L(L1
, title
);
1981 VTOY_JSON_FMT_OBJ_BEGIN_N();
1983 VTOY_JSON_FMT_DIFF_STRN(L2
, "bootpwd", bootpwd
);
1984 VTOY_JSON_FMT_DIFF_STRN(L2
, "isopwd", isopwd
);
1985 VTOY_JSON_FMT_DIFF_STRN(L2
, "wimpwd", wimpwd
);
1986 VTOY_JSON_FMT_DIFF_STRN(L2
, "vhdpwd", vhdpwd
);
1987 VTOY_JSON_FMT_DIFF_STRN(L2
, "imgpwd", imgpwd
);
1988 VTOY_JSON_FMT_DIFF_STRN(L2
, "efipwd", efipwd
);
1989 VTOY_JSON_FMT_DIFF_STRN(L2
, "vtoypwd", vtoypwd
);
1993 VTOY_JSON_FMT_KEY_L(L2
, "menupwd");
1994 VTOY_JSON_FMT_ARY_BEGIN_N();
1996 for (node
= data
->list
; node
; node
= node
->next
)
1998 VTOY_JSON_FMT_OBJ_BEGIN_LN(L3
);
2000 if (node
->type
== 0)
2002 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "file", node
->path
);
2006 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "parent", node
->path
);
2008 VTOY_JSON_FMT_STRN_LN(L4
, "pwd", node
->pwd
);
2010 VTOY_JSON_FMT_OBJ_ENDEX_LN(L3
);
2013 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
2016 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
2018 VTOY_JSON_FMT_END(pos
);
2024 int ventoy_data_json_password(data_password
*data
, char *buf
, int buflen
)
2028 menu_password
*node
= NULL
;
2030 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2032 VTOY_JSON_FMT_OBJ_BEGIN();
2034 VTOY_JSON_FMT_STRN("bootpwd", data
->bootpwd
);
2035 VTOY_JSON_FMT_STRN("isopwd", data
->isopwd
);
2036 VTOY_JSON_FMT_STRN("wimpwd", data
->wimpwd
);
2037 VTOY_JSON_FMT_STRN("vhdpwd", data
->vhdpwd
);
2038 VTOY_JSON_FMT_STRN("imgpwd", data
->imgpwd
);
2039 VTOY_JSON_FMT_STRN("efipwd", data
->efipwd
);
2040 VTOY_JSON_FMT_STRN("vtoypwd", data
->vtoypwd
);
2042 VTOY_JSON_FMT_KEY("list");
2043 VTOY_JSON_FMT_ARY_BEGIN();
2045 for (node
= data
->list
; node
; node
= node
->next
)
2047 VTOY_JSON_FMT_OBJ_BEGIN();
2049 VTOY_JSON_FMT_SINT("type", node
->type
);
2050 VTOY_JSON_FMT_STRN("path", node
->path
);
2051 if (node
->type
== path_type_file
)
2053 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2057 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
2060 VTOY_JSON_FMT_SINT("valid", valid
);
2061 VTOY_JSON_FMT_STRN("pwd", node
->pwd
);
2063 VTOY_JSON_FMT_OBJ_ENDEX();
2066 VTOY_JSON_FMT_ARY_ENDEX();
2068 VTOY_JSON_FMT_OBJ_END();
2069 VTOY_JSON_FMT_END(pos
);
2074 static int ventoy_api_get_password(struct mg_connection
*conn
, VTOY_JSON
*json
)
2076 api_get_func(conn
, json
, password
);
2080 static int ventoy_api_save_password(struct mg_connection
*conn
, VTOY_JSON
*json
)
2084 data_password
*data
= NULL
;
2086 vtoy_json_get_int(json
, "index", &index
);
2087 data
= g_data_password
+ index
;
2089 VTOY_JSON_STR("bootpwd", data
->bootpwd
);
2090 VTOY_JSON_STR("isopwd", data
->isopwd
);
2091 VTOY_JSON_STR("wimpwd", data
->wimpwd
);
2092 VTOY_JSON_STR("vhdpwd", data
->vhdpwd
);
2093 VTOY_JSON_STR("imgpwd", data
->imgpwd
);
2094 VTOY_JSON_STR("efipwd", data
->efipwd
);
2095 VTOY_JSON_STR("vtoypwd", data
->vtoypwd
);
2097 ret
= ventoy_data_save_all();
2099 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2103 static int ventoy_api_password_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2108 const char *path
= NULL
;
2109 const char *pwd
= NULL
;
2110 menu_password
*node
= NULL
;
2111 menu_password
*cur
= NULL
;
2112 data_password
*data
= NULL
;
2114 vtoy_json_get_int(json
, "index", &index
);
2115 data
= g_data_password
+ index
;
2117 vtoy_json_get_int(json
, "type", &type
);
2119 path
= VTOY_JSON_STR_EX("path");
2120 pwd
= VTOY_JSON_STR_EX("pwd");
2123 node
= zalloc(sizeof(menu_password
));
2127 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2128 scnprintf(node
->pwd
, sizeof(node
->pwd
), "%s", pwd
);
2130 vtoy_list_add(data
->list
, cur
, node
);
2134 ret
= ventoy_data_save_all();
2136 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2140 static int ventoy_api_password_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2144 const char *path
= NULL
;
2145 menu_password
*last
= NULL
;
2146 menu_password
*node
= NULL
;
2147 data_password
*data
= NULL
;
2149 vtoy_json_get_int(json
, "index", &index
);
2150 data
= g_data_password
+ index
;
2152 path
= VTOY_JSON_STR_EX("path");
2155 vtoy_list_del(last
, node
, data
->list
, path
);
2158 ret
= ventoy_data_save_all();
2160 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2167 void ventoy_data_default_conf_replace(data_conf_replace
*data
)
2169 memset(data
, 0, sizeof(data_conf_replace
));
2172 int ventoy_data_cmp_conf_replace(data_conf_replace
*data1
, data_conf_replace
*data2
)
2174 conf_replace_node
*list1
= NULL
;
2175 conf_replace_node
*list2
= NULL
;
2177 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2181 else if (data1
->list
&& data2
->list
)
2183 list1
= data1
->list
;
2184 list2
= data2
->list
;
2186 while (list1
&& list2
)
2188 if (list1
->image
!= list2
->image
||
2189 strcmp(list1
->path
, list2
->path
) ||
2190 strcmp(list1
->org
, list2
->org
) ||
2191 strcmp(list1
->new, list2
->new)
2197 list1
= list1
->next
;
2198 list2
= list2
->next
;
2201 if (list1
== NULL
&& list2
== NULL
)
2216 int ventoy_data_save_conf_replace(data_conf_replace
*data
, const char *title
, char *buf
, int buflen
)
2219 conf_replace_node
*node
= NULL
;
2221 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2223 VTOY_JSON_FMT_KEY_L(L1
, title
);
2224 VTOY_JSON_FMT_ARY_BEGIN_N();
2226 for (node
= data
->list
; node
; node
= node
->next
)
2228 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2230 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "iso", node
->path
);
2231 VTOY_JSON_FMT_STRN_LN(L3
, "org", node
->org
);
2232 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "new", node
->new);
2235 VTOY_JSON_FMT_SINT_LN(L3
, "img", node
->image
);
2238 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2241 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2242 VTOY_JSON_FMT_END(pos
);
2248 int ventoy_data_json_conf_replace(data_conf_replace
*data
, char *buf
, int buflen
)
2251 conf_replace_node
*node
= NULL
;
2253 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2254 VTOY_JSON_FMT_ARY_BEGIN();
2256 for (node
= data
->list
; node
; node
= node
->next
)
2258 VTOY_JSON_FMT_OBJ_BEGIN();
2260 VTOY_JSON_FMT_STRN("path", node
->path
);
2261 VTOY_JSON_FMT_SINT("valid", ventoy_check_fuzzy_path(node
->path
, 1));
2262 VTOY_JSON_FMT_STRN("org", node
->org
);
2263 VTOY_JSON_FMT_STRN("new", node
->new);
2264 VTOY_JSON_FMT_SINT("new_valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->new));
2265 VTOY_JSON_FMT_SINT("img", node
->image
);
2267 VTOY_JSON_FMT_OBJ_ENDEX();
2270 VTOY_JSON_FMT_ARY_END();
2271 VTOY_JSON_FMT_END(pos
);
2276 static int ventoy_api_get_conf_replace(struct mg_connection
*conn
, VTOY_JSON
*json
)
2278 api_get_func(conn
, json
, conf_replace
);
2282 static int ventoy_api_save_conf_replace(struct mg_connection
*conn
, VTOY_JSON
*json
)
2285 ret
= ventoy_data_save_all();
2287 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2291 static int ventoy_api_conf_replace_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2296 const char *path
= NULL
;
2297 const char *org
= NULL
;
2298 const char *new = NULL
;
2299 conf_replace_node
*node
= NULL
;
2300 conf_replace_node
*cur
= NULL
;
2301 data_conf_replace
*data
= NULL
;
2303 vtoy_json_get_int(json
, "img", &image
);
2305 vtoy_json_get_int(json
, "index", &index
);
2306 data
= g_data_conf_replace
+ index
;
2308 path
= VTOY_JSON_STR_EX("path");
2309 org
= VTOY_JSON_STR_EX("org");
2310 new = VTOY_JSON_STR_EX("new");
2311 if (path
&& org
&& new)
2313 node
= zalloc(sizeof(conf_replace_node
));
2316 node
->image
= image
;
2317 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2318 scnprintf(node
->org
, sizeof(node
->org
), "%s", org
);
2319 scnprintf(node
->new, sizeof(node
->new), "%s", new);
2321 vtoy_list_add(data
->list
, cur
, node
);
2325 ret
= ventoy_data_save_all();
2327 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2331 static int ventoy_api_conf_replace_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2335 const char *path
= NULL
;
2336 conf_replace_node
*last
= NULL
;
2337 conf_replace_node
*node
= NULL
;
2338 data_conf_replace
*data
= NULL
;
2340 vtoy_json_get_int(json
, "index", &index
);
2341 data
= g_data_conf_replace
+ index
;
2343 path
= VTOY_JSON_STR_EX("path");
2346 vtoy_list_del(last
, node
, data
->list
, path
);
2349 ret
= ventoy_data_save_all();
2351 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2359 void ventoy_data_default_dud(data_dud
*data
)
2361 memset(data
, 0, sizeof(data_dud
));
2364 int ventoy_data_cmp_dud(data_dud
*data1
, data_dud
*data2
)
2366 dud_node
*list1
= NULL
;
2367 dud_node
*list2
= NULL
;
2369 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2373 else if (data1
->list
&& data2
->list
)
2375 list1
= data1
->list
;
2376 list2
= data2
->list
;
2378 while (list1
&& list2
)
2380 if (strcmp(list1
->path
, list2
->path
))
2385 /* no need to compare dud list with default */
2386 list1
= list1
->next
;
2387 list2
= list2
->next
;
2390 if (list1
== NULL
&& list2
== NULL
)
2405 int ventoy_data_save_dud(data_dud
*data
, const char *title
, char *buf
, int buflen
)
2408 dud_node
*node
= NULL
;
2409 path_node
*pathnode
= NULL
;
2411 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2413 VTOY_JSON_FMT_KEY_L(L1
, title
);
2414 VTOY_JSON_FMT_ARY_BEGIN_N();
2416 for (node
= data
->list
; node
; node
= node
->next
)
2418 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2419 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
2421 VTOY_JSON_FMT_KEY_L(L3
, "dud");
2422 VTOY_JSON_FMT_ARY_BEGIN_N();
2423 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2425 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
2427 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
2429 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2432 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2433 VTOY_JSON_FMT_END(pos
);
2439 int ventoy_data_json_dud(data_dud
*data
, char *buf
, int buflen
)
2443 dud_node
*node
= NULL
;
2444 path_node
*pathnode
= NULL
;
2446 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2447 VTOY_JSON_FMT_ARY_BEGIN();
2449 for (node
= data
->list
; node
; node
= node
->next
)
2451 VTOY_JSON_FMT_OBJ_BEGIN();
2453 VTOY_JSON_FMT_STRN("path", node
->path
);
2454 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2455 VTOY_JSON_FMT_SINT("valid", valid
);
2458 VTOY_JSON_FMT_KEY("list");
2459 VTOY_JSON_FMT_ARY_BEGIN();
2460 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2462 VTOY_JSON_FMT_OBJ_BEGIN();
2463 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
2465 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
2466 VTOY_JSON_FMT_SINT("valid", valid
);
2467 VTOY_JSON_FMT_OBJ_ENDEX();
2469 VTOY_JSON_FMT_ARY_ENDEX();
2472 VTOY_JSON_FMT_OBJ_ENDEX();
2475 VTOY_JSON_FMT_ARY_END();
2476 VTOY_JSON_FMT_END(pos
);
2481 static int ventoy_api_get_dud(struct mg_connection
*conn
, VTOY_JSON
*json
)
2483 api_get_func(conn
, json
, dud
);
2487 static int ventoy_api_save_dud(struct mg_connection
*conn
, VTOY_JSON
*json
)
2490 ret
= ventoy_data_save_all();
2492 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2497 static int ventoy_api_dud_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2501 const char *path
= NULL
;
2502 dud_node
*node
= NULL
;
2503 dud_node
*cur
= NULL
;
2504 data_dud
*data
= NULL
;
2505 VTOY_JSON
*array
= NULL
;
2507 vtoy_json_get_int(json
, "index", &index
);
2508 data
= g_data_dud
+ index
;
2510 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "dud");
2511 path
= VTOY_JSON_STR_EX("path");
2514 node
= zalloc(sizeof(dud_node
));
2517 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2518 node
->list
= ventoy_path_node_add_array(array
);
2520 vtoy_list_add(data
->list
, cur
, node
);
2524 ret
= ventoy_data_save_all();
2526 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2530 static int ventoy_api_dud_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2534 const char *path
= NULL
;
2535 dud_node
*last
= NULL
;
2536 dud_node
*node
= NULL
;
2537 data_dud
*data
= NULL
;
2539 vtoy_json_get_int(json
, "index", &index
);
2540 data
= g_data_dud
+ index
;
2542 path
= VTOY_JSON_STR_EX("path");
2545 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
2548 ret
= ventoy_data_save_all();
2550 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2555 static int ventoy_api_dud_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2559 const char *path
= NULL
;
2560 const char *outpath
= NULL
;
2561 path_node
*pcur
= NULL
;
2562 path_node
*pnode
= NULL
;
2563 dud_node
*node
= NULL
;
2564 data_dud
*data
= NULL
;
2566 vtoy_json_get_int(json
, "index", &index
);
2567 data
= g_data_dud
+ index
;
2569 path
= VTOY_JSON_STR_EX("path");
2570 outpath
= VTOY_JSON_STR_EX("outpath");
2571 if (path
&& outpath
)
2573 for (node
= data
->list
; node
; node
= node
->next
)
2575 if (strcmp(outpath
, node
->path
) == 0)
2577 pnode
= zalloc(sizeof(path_node
));
2580 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
2581 vtoy_list_add(node
->list
, pcur
, pnode
);
2589 ret
= ventoy_data_save_all();
2591 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2595 static int ventoy_api_dud_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2599 const char *path
= NULL
;
2600 const char *outpath
= NULL
;
2601 path_node
*plast
= NULL
;
2602 path_node
*pnode
= NULL
;
2603 dud_node
*node
= NULL
;
2604 data_dud
*data
= NULL
;
2606 vtoy_json_get_int(json
, "index", &index
);
2607 data
= g_data_dud
+ index
;
2609 path
= VTOY_JSON_STR_EX("path");
2610 outpath
= VTOY_JSON_STR_EX("outpath");
2611 if (path
&& outpath
)
2613 for (node
= data
->list
; node
; node
= node
->next
)
2615 if (strcmp(outpath
, node
->path
) == 0)
2617 vtoy_list_del(plast
, pnode
, node
->list
, path
);
2623 ret
= ventoy_data_save_all();
2625 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2633 void ventoy_data_default_auto_install(data_auto_install
*data
)
2635 memset(data
, 0, sizeof(data_auto_install
));
2638 int ventoy_data_cmp_auto_install(data_auto_install
*data1
, data_auto_install
*data2
)
2640 auto_install_node
*list1
= NULL
;
2641 auto_install_node
*list2
= NULL
;
2643 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2647 else if (data1
->list
&& data2
->list
)
2649 list1
= data1
->list
;
2650 list2
= data2
->list
;
2652 while (list1
&& list2
)
2654 if (list1
->timeout
!= list2
->timeout
||
2655 list1
->autosel
!= list2
->autosel
||
2656 strcmp(list1
->path
, list2
->path
))
2661 /* no need to compare auto install list with default */
2662 list1
= list1
->next
;
2663 list2
= list2
->next
;
2666 if (list1
== NULL
&& list2
== NULL
)
2681 int ventoy_data_save_auto_install(data_auto_install
*data
, const char *title
, char *buf
, int buflen
)
2684 auto_install_node
*node
= NULL
;
2685 path_node
*pathnode
= NULL
;
2687 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2689 VTOY_JSON_FMT_KEY_L(L1
, title
);
2690 VTOY_JSON_FMT_ARY_BEGIN_N();
2692 for (node
= data
->list
; node
; node
= node
->next
)
2694 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2695 if (node
->type
== 0)
2697 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
2701 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
2705 VTOY_JSON_FMT_KEY_L(L3
, "template");
2706 VTOY_JSON_FMT_ARY_BEGIN_N();
2707 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2709 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
2711 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
2713 if (node
->timeouten
)
2715 VTOY_JSON_FMT_SINT_LN(L3
, "timeout", node
->timeout
);
2718 if (node
->autoselen
)
2720 VTOY_JSON_FMT_SINT_LN(L3
, "autosel", node
->autosel
);
2723 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2726 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2727 VTOY_JSON_FMT_END(pos
);
2733 int ventoy_data_json_auto_install(data_auto_install
*data
, char *buf
, int buflen
)
2737 auto_install_node
*node
= NULL
;
2738 path_node
*pathnode
= NULL
;
2740 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2741 VTOY_JSON_FMT_ARY_BEGIN();
2743 for (node
= data
->list
; node
; node
= node
->next
)
2745 VTOY_JSON_FMT_OBJ_BEGIN();
2747 VTOY_JSON_FMT_STRN("path", node
->path
);
2749 if (node
->type
== 0)
2751 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2755 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
2757 VTOY_JSON_FMT_SINT("valid", valid
);
2758 VTOY_JSON_FMT_SINT("type", node
->type
);
2760 VTOY_JSON_FMT_BOOL("timeouten", node
->timeouten
);
2761 VTOY_JSON_FMT_BOOL("autoselen", node
->autoselen
);
2763 VTOY_JSON_FMT_SINT("autosel", node
->autosel
);
2764 VTOY_JSON_FMT_SINT("timeout", node
->timeout
);
2766 VTOY_JSON_FMT_KEY("list");
2767 VTOY_JSON_FMT_ARY_BEGIN();
2768 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2770 VTOY_JSON_FMT_OBJ_BEGIN();
2771 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
2773 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
2774 VTOY_JSON_FMT_SINT("valid", valid
);
2775 VTOY_JSON_FMT_OBJ_ENDEX();
2777 VTOY_JSON_FMT_ARY_ENDEX();
2780 VTOY_JSON_FMT_OBJ_ENDEX();
2783 VTOY_JSON_FMT_ARY_END();
2784 VTOY_JSON_FMT_END(pos
);
2789 static int ventoy_api_get_auto_install(struct mg_connection
*conn
, VTOY_JSON
*json
)
2791 api_get_func(conn
, json
, auto_install
);
2795 static int ventoy_api_save_auto_install(struct mg_connection
*conn
, VTOY_JSON
*json
)
2801 uint8_t timeouten
= 0;
2802 uint8_t autoselen
= 0;
2803 auto_install_node
*node
= NULL
;
2804 data_auto_install
*data
= NULL
;
2806 vtoy_json_get_int(json
, "index", &index
);
2807 vtoy_json_get_int(json
, "id", &id
);
2809 vtoy_json_get_bool(json
, "timeouten", &timeouten
);
2810 vtoy_json_get_bool(json
, "autoselen", &autoselen
);
2812 data
= g_data_auto_install
+ index
;
2816 for (node
= data
->list
; node
; node
= node
->next
)
2820 node
->timeouten
= (int)timeouten
;
2821 node
->autoselen
= (int)autoselen
;
2822 VTOY_JSON_INT("timeout", node
->timeout
);
2823 VTOY_JSON_INT("autosel", node
->autosel
);
2829 ret
= ventoy_data_save_all();
2831 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2836 static int ventoy_api_auto_install_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2841 const char *path
= NULL
;
2842 auto_install_node
*node
= NULL
;
2843 auto_install_node
*cur
= NULL
;
2844 data_auto_install
*data
= NULL
;
2845 VTOY_JSON
*array
= NULL
;
2847 vtoy_json_get_int(json
, "type", &type
);
2848 vtoy_json_get_int(json
, "index", &index
);
2849 data
= g_data_auto_install
+ index
;
2851 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "template");
2852 path
= VTOY_JSON_STR_EX("path");
2855 node
= zalloc(sizeof(auto_install_node
));
2859 node
->timeouten
= 0;
2860 node
->autoselen
= 0;
2863 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2864 node
->list
= ventoy_path_node_add_array(array
);
2866 vtoy_list_add(data
->list
, cur
, node
);
2870 ret
= ventoy_data_save_all();
2872 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2876 static int ventoy_api_auto_install_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2880 const char *path
= NULL
;
2881 auto_install_node
*last
= NULL
;
2882 auto_install_node
*node
= NULL
;
2883 data_auto_install
*data
= NULL
;
2885 vtoy_json_get_int(json
, "index", &index
);
2886 data
= g_data_auto_install
+ index
;
2888 path
= VTOY_JSON_STR_EX("path");
2891 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
2894 ret
= ventoy_data_save_all();
2896 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2900 static int ventoy_api_auto_install_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2904 const char *path
= NULL
;
2905 const char *outpath
= NULL
;
2906 path_node
*pcur
= NULL
;
2907 path_node
*pnode
= NULL
;
2908 auto_install_node
*node
= NULL
;
2909 data_auto_install
*data
= NULL
;
2911 vtoy_json_get_int(json
, "index", &index
);
2912 data
= g_data_auto_install
+ index
;
2914 path
= VTOY_JSON_STR_EX("path");
2915 outpath
= VTOY_JSON_STR_EX("outpath");
2916 if (path
&& outpath
)
2918 for (node
= data
->list
; node
; node
= node
->next
)
2920 if (strcmp(outpath
, node
->path
) == 0)
2922 pnode
= zalloc(sizeof(path_node
));
2925 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
2926 vtoy_list_add(node
->list
, pcur
, pnode
);
2934 ret
= ventoy_data_save_all();
2936 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2940 static int ventoy_api_auto_install_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2944 const char *path
= NULL
;
2945 const char *outpath
= NULL
;
2946 path_node
*plast
= NULL
;
2947 path_node
*pnode
= NULL
;
2948 auto_install_node
*node
= NULL
;
2949 data_auto_install
*data
= NULL
;
2951 vtoy_json_get_int(json
, "index", &index
);
2952 data
= g_data_auto_install
+ index
;
2954 path
= VTOY_JSON_STR_EX("path");
2955 outpath
= VTOY_JSON_STR_EX("outpath");
2956 if (path
&& outpath
)
2958 for (node
= data
->list
; node
; node
= node
->next
)
2960 if (strcmp(outpath
, node
->path
) == 0)
2962 vtoy_list_del(plast
, pnode
, node
->list
, path
);
2968 ret
= ventoy_data_save_all();
2970 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2979 void ventoy_data_default_persistence(data_persistence
*data
)
2981 memset(data
, 0, sizeof(data_persistence
));
2984 int ventoy_data_cmp_persistence(data_persistence
*data1
, data_persistence
*data2
)
2986 persistence_node
*list1
= NULL
;
2987 persistence_node
*list2
= NULL
;
2989 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2993 else if (data1
->list
&& data2
->list
)
2995 list1
= data1
->list
;
2996 list2
= data2
->list
;
2998 while (list1
&& list2
)
3000 if (list1
->timeout
!= list2
->timeout
||
3001 list1
->autosel
!= list2
->autosel
||
3002 strcmp(list1
->path
, list2
->path
))
3007 /* no need to compare auto install list with default */
3008 list1
= list1
->next
;
3009 list2
= list2
->next
;
3012 if (list1
== NULL
&& list2
== NULL
)
3027 int ventoy_data_save_persistence(data_persistence
*data
, const char *title
, char *buf
, int buflen
)
3030 persistence_node
*node
= NULL
;
3031 path_node
*pathnode
= NULL
;
3033 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3035 VTOY_JSON_FMT_KEY_L(L1
, title
);
3036 VTOY_JSON_FMT_ARY_BEGIN_N();
3038 for (node
= data
->list
; node
; node
= node
->next
)
3040 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
3041 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
3042 VTOY_JSON_FMT_KEY_L(L3
, "backend");
3043 VTOY_JSON_FMT_ARY_BEGIN_N();
3044 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
3046 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
3048 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
3050 if (node
->timeouten
)
3052 VTOY_JSON_FMT_SINT_LN(L3
, "timeout", node
->timeout
);
3055 if (node
->autoselen
)
3057 VTOY_JSON_FMT_SINT_LN(L3
, "autosel", node
->autosel
);
3060 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
3063 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
3064 VTOY_JSON_FMT_END(pos
);
3070 int ventoy_data_json_persistence(data_persistence
*data
, char *buf
, int buflen
)
3074 persistence_node
*node
= NULL
;
3075 path_node
*pathnode
= NULL
;
3077 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3078 VTOY_JSON_FMT_ARY_BEGIN();
3080 for (node
= data
->list
; node
; node
= node
->next
)
3082 VTOY_JSON_FMT_OBJ_BEGIN();
3084 VTOY_JSON_FMT_STRN("path", node
->path
);
3086 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
3087 VTOY_JSON_FMT_SINT("valid", valid
);
3088 VTOY_JSON_FMT_SINT("type", node
->type
);
3090 VTOY_JSON_FMT_BOOL("timeouten", node
->timeouten
);
3091 VTOY_JSON_FMT_BOOL("autoselen", node
->autoselen
);
3093 VTOY_JSON_FMT_SINT("autosel", node
->autosel
);
3094 VTOY_JSON_FMT_SINT("timeout", node
->timeout
);
3096 VTOY_JSON_FMT_KEY("list");
3097 VTOY_JSON_FMT_ARY_BEGIN();
3098 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
3100 VTOY_JSON_FMT_OBJ_BEGIN();
3101 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
3103 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
3104 VTOY_JSON_FMT_SINT("valid", valid
);
3105 VTOY_JSON_FMT_OBJ_ENDEX();
3107 VTOY_JSON_FMT_ARY_ENDEX();
3110 VTOY_JSON_FMT_OBJ_ENDEX();
3113 VTOY_JSON_FMT_ARY_END();
3114 VTOY_JSON_FMT_END(pos
);
3119 static int ventoy_api_get_persistence(struct mg_connection
*conn
, VTOY_JSON
*json
)
3121 api_get_func(conn
, json
, persistence
);
3125 static int ventoy_api_save_persistence(struct mg_connection
*conn
, VTOY_JSON
*json
)
3131 uint8_t timeouten
= 0;
3132 uint8_t autoselen
= 0;
3133 persistence_node
*node
= NULL
;
3134 data_persistence
*data
= NULL
;
3136 vtoy_json_get_int(json
, "index", &index
);
3137 vtoy_json_get_int(json
, "id", &id
);
3139 vtoy_json_get_bool(json
, "timeouten", &timeouten
);
3140 vtoy_json_get_bool(json
, "autoselen", &autoselen
);
3142 data
= g_data_persistence
+ index
;
3146 for (node
= data
->list
; node
; node
= node
->next
)
3150 node
->timeouten
= (int)timeouten
;
3151 node
->autoselen
= (int)autoselen
;
3152 VTOY_JSON_INT("timeout", node
->timeout
);
3153 VTOY_JSON_INT("autosel", node
->autosel
);
3159 ret
= ventoy_data_save_all();
3161 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3166 static int ventoy_api_persistence_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
3170 const char *path
= NULL
;
3171 persistence_node
*node
= NULL
;
3172 persistence_node
*cur
= NULL
;
3173 data_persistence
*data
= NULL
;
3174 VTOY_JSON
*array
= NULL
;
3176 vtoy_json_get_int(json
, "index", &index
);
3177 data
= g_data_persistence
+ index
;
3179 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "backend");
3180 path
= VTOY_JSON_STR_EX("path");
3183 node
= zalloc(sizeof(persistence_node
));
3186 node
->timeouten
= 0;
3187 node
->autoselen
= 0;
3190 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
3191 node
->list
= ventoy_path_node_add_array(array
);
3193 vtoy_list_add(data
->list
, cur
, node
);
3197 ret
= ventoy_data_save_all();
3199 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3203 static int ventoy_api_persistence_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
3207 const char *path
= NULL
;
3208 persistence_node
*last
= NULL
;
3209 persistence_node
*node
= NULL
;
3210 data_persistence
*data
= NULL
;
3212 vtoy_json_get_int(json
, "index", &index
);
3213 data
= g_data_persistence
+ index
;
3215 path
= VTOY_JSON_STR_EX("path");
3218 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
3221 ret
= ventoy_data_save_all();
3223 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3227 static int ventoy_api_persistence_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
3231 const char *path
= NULL
;
3232 const char *outpath
= NULL
;
3233 path_node
*pcur
= NULL
;
3234 path_node
*pnode
= NULL
;
3235 persistence_node
*node
= NULL
;
3236 data_persistence
*data
= NULL
;
3238 vtoy_json_get_int(json
, "index", &index
);
3239 data
= g_data_persistence
+ index
;
3241 path
= VTOY_JSON_STR_EX("path");
3242 outpath
= VTOY_JSON_STR_EX("outpath");
3243 if (path
&& outpath
)
3245 for (node
= data
->list
; node
; node
= node
->next
)
3247 if (strcmp(outpath
, node
->path
) == 0)
3249 pnode
= zalloc(sizeof(path_node
));
3252 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
3253 vtoy_list_add(node
->list
, pcur
, pnode
);
3261 ret
= ventoy_data_save_all();
3263 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3267 static int ventoy_api_persistence_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
3271 const char *path
= NULL
;
3272 const char *outpath
= NULL
;
3273 path_node
*plast
= NULL
;
3274 path_node
*pnode
= NULL
;
3275 persistence_node
*node
= NULL
;
3276 data_persistence
*data
= NULL
;
3278 vtoy_json_get_int(json
, "index", &index
);
3279 data
= g_data_persistence
+ index
;
3281 path
= VTOY_JSON_STR_EX("path");
3282 outpath
= VTOY_JSON_STR_EX("outpath");
3283 if (path
&& outpath
)
3285 for (node
= data
->list
; node
; node
= node
->next
)
3287 if (strcmp(outpath
, node
->path
) == 0)
3289 vtoy_list_del(plast
, pnode
, node
->list
, path
);
3295 ret
= ventoy_data_save_all();
3297 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3305 void ventoy_data_default_injection(data_injection
*data
)
3307 memset(data
, 0, sizeof(data_injection
));
3310 int ventoy_data_cmp_injection(data_injection
*data1
, data_injection
*data2
)
3312 injection_node
*list1
= NULL
;
3313 injection_node
*list2
= NULL
;
3315 if (NULL
== data1
->list
&& NULL
== data2
->list
)
3319 else if (data1
->list
&& data2
->list
)
3321 list1
= data1
->list
;
3322 list2
= data2
->list
;
3324 while (list1
&& list2
)
3326 if ((list1
->type
!= list2
->type
) ||
3327 strcmp(list1
->path
, list2
->path
) ||
3328 strcmp(list1
->archive
, list2
->archive
))
3333 list1
= list1
->next
;
3334 list2
= list2
->next
;
3337 if (list1
== NULL
&& list2
== NULL
)
3352 int ventoy_data_save_injection(data_injection
*data
, const char *title
, char *buf
, int buflen
)
3355 injection_node
*node
= NULL
;
3357 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3359 VTOY_JSON_FMT_KEY_L(L1
, title
);
3360 VTOY_JSON_FMT_ARY_BEGIN_N();
3362 for (node
= data
->list
; node
; node
= node
->next
)
3364 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
3366 if (node
->type
== 0)
3368 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
3372 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
3374 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "archive", node
->archive
);
3376 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
3379 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
3380 VTOY_JSON_FMT_END(pos
);
3386 int ventoy_data_json_injection(data_injection
*data
, char *buf
, int buflen
)
3390 injection_node
*node
= NULL
;
3392 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3393 VTOY_JSON_FMT_ARY_BEGIN();
3395 for (node
= data
->list
; node
; node
= node
->next
)
3397 VTOY_JSON_FMT_OBJ_BEGIN();
3399 VTOY_JSON_FMT_UINT("type", node
->type
);
3400 VTOY_JSON_FMT_STRN("path", node
->path
);
3402 if (node
->type
== 0)
3404 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
3408 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
3410 VTOY_JSON_FMT_SINT("valid", valid
);
3412 VTOY_JSON_FMT_STRN("archive", node
->archive
);
3414 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, node
->archive
);
3415 VTOY_JSON_FMT_SINT("archive_valid", valid
);
3417 VTOY_JSON_FMT_OBJ_ENDEX();
3420 VTOY_JSON_FMT_ARY_END();
3421 VTOY_JSON_FMT_END(pos
);
3427 static int ventoy_api_get_injection(struct mg_connection
*conn
, VTOY_JSON
*json
)
3429 api_get_func(conn
, json
, injection
);
3433 static int ventoy_api_save_injection(struct mg_connection
*conn
, VTOY_JSON
*json
)
3436 ret
= ventoy_data_save_all();
3438 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3442 static int ventoy_api_injection_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
3447 const char *path
= NULL
;
3448 const char *archive
= NULL
;
3449 injection_node
*node
= NULL
;
3450 injection_node
*cur
= NULL
;
3451 data_injection
*data
= NULL
;
3453 vtoy_json_get_int(json
, "index", &index
);
3454 data
= g_data_injection
+ index
;
3456 vtoy_json_get_int(json
, "type", &type
);
3458 path
= VTOY_JSON_STR_EX("path");
3459 archive
= VTOY_JSON_STR_EX("archive");
3460 if (path
&& archive
)
3462 node
= zalloc(sizeof(injection_node
));
3467 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
3468 scnprintf(node
->archive
, sizeof(node
->archive
), "%s", archive
);
3470 vtoy_list_add(data
->list
, cur
, node
);
3474 ret
= ventoy_data_save_all();
3476 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3480 static int ventoy_api_injection_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
3484 const char *path
= NULL
;
3485 injection_node
*last
= NULL
;
3486 injection_node
*node
= NULL
;
3487 data_injection
*data
= NULL
;
3489 vtoy_json_get_int(json
, "index", &index
);
3490 data
= g_data_injection
+ index
;
3492 path
= VTOY_JSON_STR_EX("path");
3495 vtoy_list_del(last
, node
, data
->list
, path
);
3498 ret
= ventoy_data_save_all();
3500 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3508 int ventoy_data_save_all(void)
3510 ventoy_set_writeback_event();
3514 int ventoy_data_real_save_all(void)
3520 pthread_mutex_lock(&g_api_mutex
);
3522 ssprintf(pos
, JSON_SAVE_BUFFER
, JSON_BUF_MAX
, "{\n");
3524 ventoy_save_plug(control
);
3525 ventoy_save_plug(theme
);
3526 ventoy_save_plug(menu_alias
);
3527 ventoy_save_plug(menu_tip
);
3528 ventoy_save_plug(menu_class
);
3529 ventoy_save_plug(auto_install
);
3530 ventoy_save_plug(persistence
);
3531 ventoy_save_plug(injection
);
3532 ventoy_save_plug(conf_replace
);
3533 ventoy_save_plug(password
);
3534 ventoy_save_plug(image_list
);
3535 ventoy_save_plug(auto_memdisk
);
3536 ventoy_save_plug(dud
);
3538 if (JSON_SAVE_BUFFER
[pos
- 1] == '\n' && JSON_SAVE_BUFFER
[pos
- 2] == ',')
3540 JSON_SAVE_BUFFER
[pos
- 2] = '\n';
3543 ssprintf(pos
, JSON_SAVE_BUFFER
, JSON_BUF_MAX
, "}\n");
3545 pthread_mutex_unlock(&g_api_mutex
);
3550 int ventoy_http_writeback(void)
3556 ventoy_get_json_path(filename
, NULL
);
3558 pos
= ventoy_data_real_save_all();
3561 printf("%s", JSON_SAVE_BUFFER
);
3564 ret
= ventoy_write_buf_to_file(filename
, JSON_SAVE_BUFFER
, pos
);
3567 vlog("Failed to write ventoy.json file.\n");
3574 static JSON_CB g_ventoy_json_cb
[] =
3576 { "sysinfo", ventoy_api_sysinfo
},
3577 { "handshake", ventoy_api_handshake
},
3578 { "check_path", ventoy_api_check_exist
},
3579 { "check_path2", ventoy_api_check_exist2
},
3580 { "check_fuzzy", ventoy_api_check_fuzzy
},
3582 { "device_info", ventoy_api_device_info
},
3584 { "get_control", ventoy_api_get_control
},
3585 { "save_control", ventoy_api_save_control
},
3587 { "get_theme", ventoy_api_get_theme
},
3588 { "save_theme", ventoy_api_save_theme
},
3589 { "theme_add_file", ventoy_api_theme_add_file
},
3590 { "theme_del_file", ventoy_api_theme_del_file
},
3591 { "theme_add_font", ventoy_api_theme_add_font
},
3592 { "theme_del_font", ventoy_api_theme_del_font
},
3594 { "get_alias", ventoy_api_get_alias
},
3595 { "save_alias", ventoy_api_save_alias
},
3596 { "alias_add", ventoy_api_alias_add
},
3597 { "alias_del", ventoy_api_alias_del
},
3599 { "get_tip", ventoy_api_get_tip
},
3600 { "save_tip", ventoy_api_save_tip
},
3601 { "tip_add", ventoy_api_tip_add
},
3602 { "tip_del", ventoy_api_tip_del
},
3604 { "get_class", ventoy_api_get_class
},
3605 { "save_class", ventoy_api_save_class
},
3606 { "class_add", ventoy_api_class_add
},
3607 { "class_del", ventoy_api_class_del
},
3609 { "get_auto_memdisk", ventoy_api_get_auto_memdisk
},
3610 { "save_auto_memdisk", ventoy_api_save_auto_memdisk
},
3611 { "auto_memdisk_add", ventoy_api_auto_memdisk_add
},
3612 { "auto_memdisk_del", ventoy_api_auto_memdisk_del
},
3614 { "get_image_list", ventoy_api_get_image_list
},
3615 { "save_image_list", ventoy_api_save_image_list
},
3616 { "image_list_add", ventoy_api_image_list_add
},
3617 { "image_list_del", ventoy_api_image_list_del
},
3619 { "get_conf_replace", ventoy_api_get_conf_replace
},
3620 { "save_conf_replace", ventoy_api_save_conf_replace
},
3621 { "conf_replace_add", ventoy_api_conf_replace_add
},
3622 { "conf_replace_del", ventoy_api_conf_replace_del
},
3624 { "get_dud", ventoy_api_get_dud
},
3625 { "save_dud", ventoy_api_save_dud
},
3626 { "dud_add", ventoy_api_dud_add
},
3627 { "dud_del", ventoy_api_dud_del
},
3628 { "dud_add_inner", ventoy_api_dud_add_inner
},
3629 { "dud_del_inner", ventoy_api_dud_del_inner
},
3631 { "get_auto_install", ventoy_api_get_auto_install
},
3632 { "save_auto_install", ventoy_api_save_auto_install
},
3633 { "auto_install_add", ventoy_api_auto_install_add
},
3634 { "auto_install_del", ventoy_api_auto_install_del
},
3635 { "auto_install_add_inner", ventoy_api_auto_install_add_inner
},
3636 { "auto_install_del_inner", ventoy_api_auto_install_del_inner
},
3638 { "get_persistence", ventoy_api_get_persistence
},
3639 { "save_persistence", ventoy_api_save_persistence
},
3640 { "persistence_add", ventoy_api_persistence_add
},
3641 { "persistence_del", ventoy_api_persistence_del
},
3642 { "persistence_add_inner", ventoy_api_persistence_add_inner
},
3643 { "persistence_del_inner", ventoy_api_persistence_del_inner
},
3645 { "get_password", ventoy_api_get_password
},
3646 { "save_password", ventoy_api_save_password
},
3647 { "password_add", ventoy_api_password_add
},
3648 { "password_del", ventoy_api_password_del
},
3650 { "get_injection", ventoy_api_get_injection
},
3651 { "save_injection", ventoy_api_save_injection
},
3652 { "injection_add", ventoy_api_injection_add
},
3653 { "injection_del", ventoy_api_injection_del
},
3658 static int ventoy_json_handler(struct mg_connection
*conn
, VTOY_JSON
*json
)
3661 const char *method
= NULL
;
3663 method
= vtoy_json_get_string_ex(json
, "method");
3666 ventoy_json_result(conn
, VTOY_JSON_SUCCESS_RET
);
3670 if (strcmp(method
, "handshake") == 0)
3672 ventoy_api_handshake(conn
, json
);
3676 for (i
= 0; i
< (int)(sizeof(g_ventoy_json_cb
) / sizeof(g_ventoy_json_cb
[0])); i
++)
3678 if (strcmp(method
, g_ventoy_json_cb
[i
].method
) == 0)
3680 g_ventoy_json_cb
[i
].callback(conn
, json
);
3688 static int ventoy_request_handler(struct mg_connection
*conn
)
3692 VTOY_JSON
*json
= NULL
;
3693 char *post_data_buf
= NULL
;
3694 const struct mg_request_info
*ri
= NULL
;
3695 char stack_buf
[512];
3697 ri
= mg_get_request_info(conn
);
3699 if (strcmp(ri
->uri
, "/vtoy/json") == 0)
3701 if (ri
->content_length
> 500)
3703 post_data_buf
= malloc((int)(ri
->content_length
+ 4));
3704 post_buf_len
= (int)(ri
->content_length
+ 1);
3708 post_data_buf
= stack_buf
;
3709 post_buf_len
= sizeof(stack_buf
);
3712 post_data_len
= mg_read(conn
, post_data_buf
, post_buf_len
);
3713 post_data_buf
[post_data_len
] = 0;
3715 json
= vtoy_json_create();
3716 if (JSON_SUCCESS
== vtoy_json_parse(json
, post_data_buf
))
3718 pthread_mutex_lock(&g_api_mutex
);
3719 ventoy_json_handler(conn
, json
->pstChild
);
3720 pthread_mutex_unlock(&g_api_mutex
);
3724 ventoy_json_result(conn
, VTOY_JSON_INVALID_RET
);
3727 vtoy_json_destroy(json
);
3729 if (post_data_buf
!= stack_buf
)
3731 free(post_data_buf
);
3741 const char *ventoy_web_openfile(const struct mg_connection
*conn
, const char *path
, size_t *data_len
)
3743 ventoy_file
*node
= NULL
;
3752 node
= ventoy_tar_find_file(path
);
3755 *data_len
= node
->size
;
3767 static int ventoy_parse_control(VTOY_JSON
*json
, void *p
)
3770 VTOY_JSON
*node
= NULL
;
3771 VTOY_JSON
*child
= NULL
;
3772 data_control
*data
= (data_control
*)p
;
3774 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
3779 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
3781 if (node
->enDataType
== JSON_TYPE_OBJECT
)
3783 child
= node
->pstChild
;
3785 if (strcmp(child
->pcName
, "VTOY_DEFAULT_MENU_MODE") == 0)
3787 CONTROL_PARSE_INT(child
, data
->default_menu_mode
);
3789 else if (strcmp(child
->pcName
, "VTOY_WIN11_BYPASS_CHECK") == 0)
3791 CONTROL_PARSE_INT(child
, data
->win11_bypass_check
);
3793 else if (strcmp(child
->pcName
, "VTOY_TREE_VIEW_MENU_STYLE") == 0)
3795 CONTROL_PARSE_INT(child
, data
->treeview_style
);
3797 else if (strcmp(child
->pcName
, "VTOY_FILT_DOT_UNDERSCORE_FILE") == 0)
3799 CONTROL_PARSE_INT(child
, data
->filter_dot_underscore
);
3801 else if (strcmp(child
->pcName
, "VTOY_SORT_CASE_SENSITIVE") == 0)
3803 CONTROL_PARSE_INT(child
, data
->sort_casesensitive
);
3805 else if (strcmp(child
->pcName
, "VTOY_MAX_SEARCH_LEVEL") == 0)
3807 if (strcmp(child
->unData
.pcStrVal
, "max") == 0)
3809 data
->max_search_level
= -1;
3813 data
->max_search_level
= (int)strtol(child
->unData
.pcStrVal
, NULL
, 10);
3816 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_SEARCH_ROOT") == 0)
3818 strlcpy(data
->default_search_root
, child
->unData
.pcStrVal
);
3820 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_IMAGE") == 0)
3822 strlcpy(data
->default_image
, child
->unData
.pcStrVal
);
3824 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_KBD_LAYOUT") == 0)
3826 for (i
= 0; g_ventoy_kbd_layout
[i
]; i
++)
3828 if (strcmp(child
->unData
.pcStrVal
, g_ventoy_kbd_layout
[i
]) == 0)
3830 strlcpy(data
->default_kbd_layout
, child
->unData
.pcStrVal
);
3835 else if (strcmp(child
->pcName
, "VTOY_HELP_TXT_LANGUAGE") == 0)
3837 for (i
= 0; g_ventoy_help_lang
[i
][0]; i
++)
3839 if (strcmp(child
->unData
.pcStrVal
, g_ventoy_help_lang
[i
]) == 0)
3841 strlcpy(data
->help_text_language
, child
->unData
.pcStrVal
);
3846 else if (strcmp(child
->pcName
, "VTOY_MENU_TIMEOUT") == 0)
3848 data
->menu_timeout
= (int)strtol(child
->unData
.pcStrVal
, NULL
, 10);
3850 else if (strcmp(child
->pcName
, "VTOY_VHD_NO_WARNING") == 0)
3852 CONTROL_PARSE_INT(child
, data
->vhd_no_warning
);
3854 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_ISO") == 0)
3856 CONTROL_PARSE_INT(child
, data
->filter_iso
);
3858 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_IMG") == 0)
3860 CONTROL_PARSE_INT(child
, data
->filter_img
);
3862 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_EFI") == 0)
3864 CONTROL_PARSE_INT(child
, data
->filter_efi
);
3866 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_WIM") == 0)
3868 CONTROL_PARSE_INT(child
, data
->filter_wim
);
3870 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_VHD") == 0)
3872 CONTROL_PARSE_INT(child
, data
->filter_vhd
);
3874 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_VTOY") == 0)
3876 CONTROL_PARSE_INT(child
, data
->filter_vtoy
);
3884 static int ventoy_parse_theme(VTOY_JSON
*json
, void *p
)
3886 const char *dismode
= NULL
;
3887 VTOY_JSON
*child
= NULL
;
3888 VTOY_JSON
*node
= NULL
;
3889 path_node
*tail
= NULL
;
3890 path_node
*pnode
= NULL
;
3891 data_theme
*data
= (data_theme
*)p
;
3893 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
3898 child
= json
->pstChild
;
3900 dismode
= vtoy_json_get_string_ex(child
, "display_mode");
3901 vtoy_json_get_string(child
, "ventoy_left", sizeof(data
->ventoy_left
), data
->ventoy_left
);
3902 vtoy_json_get_string(child
, "ventoy_top", sizeof(data
->ventoy_top
), data
->ventoy_top
);
3903 vtoy_json_get_string(child
, "ventoy_color", sizeof(data
->ventoy_color
), data
->ventoy_color
);
3905 vtoy_json_get_int(child
, "default_file", &(data
->default_file
));
3906 vtoy_json_get_string(child
, "gfxmode", sizeof(data
->gfxmode
), data
->gfxmode
);
3907 vtoy_json_get_string(child
, "serial_param", sizeof(data
->serial_param
), data
->serial_param
);
3911 if (strcmp(dismode
, "CLI") == 0)
3913 data
->display_mode
= display_mode_cli
;
3915 else if (strcmp(dismode
, "serial") == 0)
3917 data
->display_mode
= display_mode_serial
;
3919 else if (strcmp(dismode
, "serial_console") == 0)
3921 data
->display_mode
= display_mode_ser_console
;
3925 data
->display_mode
= display_mode_gui
;
3929 node
= vtoy_json_find_item(child
, JSON_TYPE_STRING
, "file");
3932 data
->default_file
= 0;
3934 pnode
= zalloc(sizeof(path_node
));
3937 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3938 data
->filelist
= pnode
;
3943 node
= vtoy_json_find_item(child
, JSON_TYPE_ARRAY
, "file");
3946 for (node
= node
->pstChild
; node
; node
= node
->pstNext
)
3948 if (node
->enDataType
== JSON_TYPE_STRING
)
3950 pnode
= zalloc(sizeof(path_node
));
3953 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3961 data
->filelist
= tail
= pnode
;
3970 node
= vtoy_json_find_item(child
, JSON_TYPE_ARRAY
, "fonts");
3973 for (node
= node
->pstChild
; node
; node
= node
->pstNext
)
3975 if (node
->enDataType
== JSON_TYPE_STRING
)
3977 pnode
= zalloc(sizeof(path_node
));
3980 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3981 if (data
->fontslist
)
3988 data
->fontslist
= tail
= pnode
;
3997 static int ventoy_parse_menu_alias(VTOY_JSON
*json
, void *p
)
4000 const char *path
= NULL
;
4001 const char *alias
= NULL
;
4002 data_alias
*data
= (data_alias
*)p
;
4003 data_alias_node
*tail
= NULL
;
4004 data_alias_node
*pnode
= NULL
;
4005 VTOY_JSON
*node
= NULL
;
4007 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4012 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4014 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4019 type
= path_type_file
;
4020 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4023 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4024 type
= path_type_dir
;
4026 alias
= vtoy_json_get_string_ex(node
->pstChild
, "alias");
4030 pnode
= zalloc(sizeof(data_alias_node
));
4034 strlcpy(pnode
->path
, path
);
4035 strlcpy(pnode
->alias
, alias
);
4044 data
->list
= tail
= pnode
;
4053 static int ventoy_parse_menu_tip(VTOY_JSON
*json
, void *p
)
4056 const char *path
= NULL
;
4057 const char *tip
= NULL
;
4058 data_tip
*data
= (data_tip
*)p
;
4059 data_tip_node
*tail
= NULL
;
4060 data_tip_node
*pnode
= NULL
;
4061 VTOY_JSON
*node
= NULL
;
4062 VTOY_JSON
*tips
= NULL
;
4064 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
4069 vtoy_json_get_string(json
->pstChild
, "left", sizeof(data
->left
), data
->left
);
4070 vtoy_json_get_string(json
->pstChild
, "top", sizeof(data
->top
), data
->top
);
4071 vtoy_json_get_string(json
->pstChild
, "color", sizeof(data
->color
), data
->color
);
4073 tips
= vtoy_json_find_item(json
->pstChild
, JSON_TYPE_ARRAY
, "tips");
4079 for (node
= tips
->pstChild
; node
; node
= node
->pstNext
)
4081 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4086 type
= path_type_file
;
4087 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4090 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4091 type
= path_type_dir
;
4093 tip
= vtoy_json_get_string_ex(node
->pstChild
, "tip");
4097 pnode
= zalloc(sizeof(data_tip_node
));
4101 strlcpy(pnode
->path
, path
);
4102 strlcpy(pnode
->tip
, tip
);
4111 data
->list
= tail
= pnode
;
4119 static int ventoy_parse_menu_class(VTOY_JSON
*json
, void *p
)
4122 const char *path
= NULL
;
4123 const char *class = NULL
;
4124 data_class
*data
= (data_class
*)p
;
4125 data_class_node
*tail
= NULL
;
4126 data_class_node
*pnode
= NULL
;
4127 VTOY_JSON
*node
= NULL
;
4129 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4134 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4136 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4141 type
= class_type_key
;
4142 path
= vtoy_json_get_string_ex(node
->pstChild
, "key");
4145 type
= class_type_dir
;
4146 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4149 type
= class_type_parent
;
4150 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4153 class = vtoy_json_get_string_ex(node
->pstChild
, "class");
4157 pnode
= zalloc(sizeof(data_class_node
));
4161 strlcpy(pnode
->path
, path
);
4162 strlcpy(pnode
->class, class);
4171 data
->list
= tail
= pnode
;
4179 static int ventoy_parse_auto_install(VTOY_JSON
*json
, void *p
)
4187 const char *path
= NULL
;
4188 const char *file
= NULL
;
4189 data_auto_install
*data
= (data_auto_install
*)p
;
4190 auto_install_node
*tail
= NULL
;
4191 auto_install_node
*pnode
= NULL
;
4192 path_node
*pathnode
= NULL
;
4193 path_node
*pathtail
= NULL
;
4194 VTOY_JSON
*node
= NULL
;
4195 VTOY_JSON
*filelist
= NULL
;
4196 VTOY_JSON
*filenode
= NULL
;
4198 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4203 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4205 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4211 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4214 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4222 file
= vtoy_json_get_string_ex(node
->pstChild
, "template");
4225 pnode
= zalloc(sizeof(auto_install_node
));
4230 strlcpy(pnode
->path
, path
);
4232 pathnode
= zalloc(sizeof(path_node
));
4235 strlcpy(pathnode
->path
, file
);
4236 pnode
->list
= pathnode
;
4250 data
->list
= tail
= pnode
;
4258 timeouten
= autoselen
= 0;
4259 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "timeout", &timeout
))
4263 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "autosel", &autosel
))
4268 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "template");
4274 pnode
= zalloc(sizeof(auto_install_node
));
4281 pnode
->autoselen
= autoselen
;
4282 pnode
->timeouten
= timeouten
;
4283 pnode
->timeout
= timeout
;
4284 pnode
->autosel
= autosel
;
4285 strlcpy(pnode
->path
, path
);
4288 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4290 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4295 pathnode
= zalloc(sizeof(path_node
));
4299 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4303 pathtail
->next
= pathnode
;
4304 pathtail
= pathnode
;
4308 pnode
->list
= pathtail
= pathnode
;
4319 if (pnode
->autoselen
&& pnode
->autosel
> count
)
4331 data
->list
= tail
= pnode
;
4338 static int ventoy_parse_persistence(VTOY_JSON
*json
, void *p
)
4345 const char *path
= NULL
;
4346 const char *file
= NULL
;
4347 data_persistence
*data
= (data_persistence
*)p
;
4348 persistence_node
*tail
= NULL
;
4349 persistence_node
*pnode
= NULL
;
4350 path_node
*pathnode
= NULL
;
4351 path_node
*pathtail
= NULL
;
4352 VTOY_JSON
*node
= NULL
;
4353 VTOY_JSON
*filelist
= NULL
;
4354 VTOY_JSON
*filenode
= NULL
;
4356 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4361 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4363 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4368 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4374 file
= vtoy_json_get_string_ex(node
->pstChild
, "backend");
4377 pnode
= zalloc(sizeof(persistence_node
));
4382 strlcpy(pnode
->path
, path
);
4384 pathnode
= zalloc(sizeof(path_node
));
4387 strlcpy(pathnode
->path
, file
);
4388 pnode
->list
= pathnode
;
4402 data
->list
= tail
= pnode
;
4410 timeouten
= autoselen
= 0;
4411 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "timeout", &timeout
))
4415 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "autosel", &autosel
))
4420 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "backend");
4426 pnode
= zalloc(sizeof(persistence_node
));
4433 pnode
->autoselen
= autoselen
;
4434 pnode
->timeouten
= timeouten
;
4435 pnode
->timeout
= timeout
;
4436 pnode
->autosel
= autosel
;
4437 strlcpy(pnode
->path
, path
);
4440 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4442 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4447 pathnode
= zalloc(sizeof(path_node
));
4451 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4455 pathtail
->next
= pathnode
;
4456 pathtail
= pathnode
;
4460 pnode
->list
= pathtail
= pathnode
;
4471 if (pnode
->autoselen
&& pnode
->autosel
> count
)
4483 data
->list
= tail
= pnode
;
4490 static int ventoy_parse_injection(VTOY_JSON
*json
, void *p
)
4493 const char *path
= NULL
;
4494 const char *archive
= NULL
;
4495 data_injection
*data
= (data_injection
*)p
;
4496 injection_node
*tail
= NULL
;
4497 injection_node
*pnode
= NULL
;
4498 VTOY_JSON
*node
= NULL
;
4500 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4505 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4507 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4513 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4516 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4519 archive
= vtoy_json_get_string_ex(node
->pstChild
, "archive");
4521 if (path
&& archive
)
4523 pnode
= zalloc(sizeof(injection_node
));
4527 strlcpy(pnode
->path
, path
);
4528 strlcpy(pnode
->archive
, archive
);
4537 data
->list
= tail
= pnode
;
4545 static int ventoy_parse_conf_replace(VTOY_JSON
*json
, void *p
)
4548 const char *path
= NULL
;
4549 const char *org
= NULL
;
4550 const char *new = NULL
;
4551 data_conf_replace
*data
= (data_conf_replace
*)p
;
4552 conf_replace_node
*tail
= NULL
;
4553 conf_replace_node
*pnode
= NULL
;
4554 VTOY_JSON
*node
= NULL
;
4556 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4561 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4563 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4568 path
= vtoy_json_get_string_ex(node
->pstChild
, "iso");
4569 org
= vtoy_json_get_string_ex(node
->pstChild
, "org");
4570 new = vtoy_json_get_string_ex(node
->pstChild
, "new");
4573 vtoy_json_get_int(node
->pstChild
, "img", &img
);
4575 if (path
&& org
&& new)
4577 pnode
= zalloc(sizeof(conf_replace_node
));
4580 strlcpy(pnode
->path
, path
);
4581 strlcpy(pnode
->org
, org
);
4582 strlcpy(pnode
->new, new);
4595 data
->list
= tail
= pnode
;
4603 static int ventoy_parse_password(VTOY_JSON
*json
, void *p
)
4606 const char *bootpwd
= NULL
;
4607 const char *isopwd
= NULL
;
4608 const char *wimpwd
= NULL
;
4609 const char *imgpwd
= NULL
;
4610 const char *efipwd
= NULL
;
4611 const char *vhdpwd
= NULL
;
4612 const char *vtoypwd
= NULL
;
4613 const char *path
= NULL
;
4614 const char *pwd
= NULL
;
4615 data_password
*data
= (data_password
*)p
;
4616 menu_password
*tail
= NULL
;
4617 menu_password
*pnode
= NULL
;
4618 VTOY_JSON
*node
= NULL
;
4619 VTOY_JSON
*menupwd
= NULL
;
4621 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
4626 bootpwd
= vtoy_json_get_string_ex(json
->pstChild
, "bootpwd");
4627 isopwd
= vtoy_json_get_string_ex(json
->pstChild
, "isopwd");
4628 wimpwd
= vtoy_json_get_string_ex(json
->pstChild
, "wimpwd");
4629 imgpwd
= vtoy_json_get_string_ex(json
->pstChild
, "imgpwd");
4630 efipwd
= vtoy_json_get_string_ex(json
->pstChild
, "efipwd");
4631 vhdpwd
= vtoy_json_get_string_ex(json
->pstChild
, "vhdpwd");
4632 vtoypwd
= vtoy_json_get_string_ex(json
->pstChild
, "vtoypwd");
4635 if (bootpwd
) strlcpy(data
->bootpwd
, bootpwd
);
4636 if (isopwd
) strlcpy(data
->isopwd
, isopwd
);
4637 if (wimpwd
) strlcpy(data
->wimpwd
, wimpwd
);
4638 if (imgpwd
) strlcpy(data
->imgpwd
, imgpwd
);
4639 if (efipwd
) strlcpy(data
->efipwd
, efipwd
);
4640 if (vhdpwd
) strlcpy(data
->vhdpwd
, vhdpwd
);
4641 if (vtoypwd
) strlcpy(data
->vtoypwd
, vtoypwd
);
4644 menupwd
= vtoy_json_find_item(json
->pstChild
, JSON_TYPE_ARRAY
, "menupwd");
4650 for (node
= menupwd
->pstChild
; node
; node
= node
->pstNext
)
4652 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4658 path
= vtoy_json_get_string_ex(node
->pstChild
, "file");
4661 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4664 pwd
= vtoy_json_get_string_ex(node
->pstChild
, "pwd");
4668 pnode
= zalloc(sizeof(menu_password
));
4672 strlcpy(pnode
->path
, path
);
4673 strlcpy(pnode
->pwd
, pwd
);
4682 data
->list
= tail
= pnode
;
4691 static int ventoy_parse_image_list_real(VTOY_JSON
*json
, int type
, void *p
)
4693 VTOY_JSON
*node
= NULL
;
4694 data_image_list
*data
= (data_image_list
*)p
;
4695 path_node
*tail
= NULL
;
4696 path_node
*pnode
= NULL
;
4698 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4705 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4707 if (node
->enDataType
== JSON_TYPE_STRING
)
4709 pnode
= zalloc(sizeof(path_node
));
4712 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
4720 data
->list
= tail
= pnode
;
4728 static int ventoy_parse_image_blacklist(VTOY_JSON
*json
, void *p
)
4730 return ventoy_parse_image_list_real(json
, 1, p
);
4732 static int ventoy_parse_image_list(VTOY_JSON
*json
, void *p
)
4734 return ventoy_parse_image_list_real(json
, 0, p
);
4737 static int ventoy_parse_auto_memdisk(VTOY_JSON
*json
, void *p
)
4739 VTOY_JSON
*node
= NULL
;
4740 data_auto_memdisk
*data
= (data_auto_memdisk
*)p
;
4741 path_node
*tail
= NULL
;
4742 path_node
*pnode
= NULL
;
4744 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4749 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4751 if (node
->enDataType
== JSON_TYPE_STRING
)
4753 pnode
= zalloc(sizeof(path_node
));
4756 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
4764 data
->list
= tail
= pnode
;
4772 static int ventoy_parse_dud(VTOY_JSON
*json
, void *p
)
4775 const char *path
= NULL
;
4776 const char *file
= NULL
;
4777 data_dud
*data
= (data_dud
*)p
;
4778 dud_node
*tail
= NULL
;
4779 dud_node
*pnode
= NULL
;
4780 path_node
*pathnode
= NULL
;
4781 path_node
*pathtail
= NULL
;
4782 VTOY_JSON
*node
= NULL
;
4783 VTOY_JSON
*filelist
= NULL
;
4784 VTOY_JSON
*filenode
= NULL
;
4786 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4791 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4793 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4798 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4804 file
= vtoy_json_get_string_ex(node
->pstChild
, "dud");
4807 pnode
= zalloc(sizeof(dud_node
));
4810 strlcpy(pnode
->path
, path
);
4812 pathnode
= zalloc(sizeof(path_node
));
4815 strlcpy(pathnode
->path
, file
);
4816 pnode
->list
= pathnode
;
4830 data
->list
= tail
= pnode
;
4837 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "dud");
4843 pnode
= zalloc(sizeof(dud_node
));
4849 strlcpy(pnode
->path
, path
);
4851 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4853 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4858 pathnode
= zalloc(sizeof(path_node
));
4861 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4866 pathtail
->next
= pathnode
;
4867 pathtail
= pathnode
;
4871 pnode
->list
= pathtail
= pathnode
;
4889 data
->list
= tail
= pnode
;
4903 static int ventoy_load_old_json(const char *filename
)
4908 char *buffer
= NULL
;
4909 unsigned char *start
= NULL
;
4910 VTOY_JSON
*json
= NULL
;
4911 VTOY_JSON
*node
= NULL
;
4913 ret
= ventoy_read_file_to_buf(filename
, 4, (void **)&buffer
, &buflen
);
4916 vlog("Failed to read old ventoy.json file.\n");
4921 start
= (unsigned char *)buffer
;
4923 if (start
[0] == 0xef && start
[1] == 0xbb && start
[2] == 0xbf)
4927 else if ((start
[0] == 0xff && start
[1] == 0xfe) || (start
[0] == 0xfe && start
[1] == 0xff))
4929 vlog("ventoy.json is in UCS-2 encoding, ignore it.\n");
4934 json
= vtoy_json_create();
4941 if (vtoy_json_parse_ex(json
, buffer
+ offset
, buflen
- offset
) == JSON_SUCCESS
)
4943 vlog("parse ventoy.json success\n");
4945 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4947 ventoy_parse_json(control
);
4948 ventoy_parse_json(theme
);
4949 ventoy_parse_json(menu_alias
);
4950 ventoy_parse_json(menu_tip
);
4951 ventoy_parse_json(menu_class
);
4952 ventoy_parse_json(auto_install
);
4953 ventoy_parse_json(persistence
);
4954 ventoy_parse_json(injection
);
4955 ventoy_parse_json(conf_replace
);
4956 ventoy_parse_json(password
);
4957 ventoy_parse_json(image_list
);
4958 ventoy_parse_json(image_blacklist
);
4959 ventoy_parse_json(auto_memdisk
);
4960 ventoy_parse_json(dud
);
4965 vlog("ventoy.json has syntax error.\n");
4966 g_sysinfo
.syntax_error
= 1;
4970 vtoy_json_destroy(json
);
4977 int ventoy_http_start(const char *ip
, const char *port
)
4982 char backupname
[128];
4983 struct mg_callbacks callbacks
;
4984 const char *options
[] =
4986 "listening_ports", "24681",
4987 "document_root", "www",
4988 "index_files", "index.html",
4989 "num_threads", "16",
4990 "error_log_file", LOG_FILE
,
4991 "request_timeout_ms", "10000",
4995 for (i
= 0; i
<= bios_max
; i
++)
4997 ventoy_data_default_control(g_data_control
+ i
);
4998 ventoy_data_default_theme(g_data_theme
+ i
);
4999 ventoy_data_default_menu_alias(g_data_menu_alias
+ i
);
5000 ventoy_data_default_menu_class(g_data_menu_class
+ i
);
5001 ventoy_data_default_menu_tip(g_data_menu_tip
+ i
);
5002 ventoy_data_default_auto_install(g_data_auto_install
+ i
);
5003 ventoy_data_default_persistence(g_data_persistence
+ i
);
5004 ventoy_data_default_injection(g_data_injection
+ i
);
5005 ventoy_data_default_conf_replace(g_data_conf_replace
+ i
);
5006 ventoy_data_default_password(g_data_password
+ i
);
5007 ventoy_data_default_image_list(g_data_image_list
+ i
);
5008 ventoy_data_default_auto_memdisk(g_data_auto_memdisk
+ i
);
5009 ventoy_data_default_dud(g_data_dud
+ i
);
5012 ventoy_get_json_path(filename
, backupname
);
5013 if (ventoy_is_file_exist("%s", filename
))
5015 ventoy_copy_file(filename
, backupname
);
5016 ventoy_load_old_json(filename
);
5021 scnprintf(addr
, sizeof(addr
), "%s:%s", ip
, port
);
5024 memset(&callbacks
, 0, sizeof(callbacks
));
5025 callbacks
.begin_request
= ventoy_request_handler
;
5027 callbacks
.open_file
= ventoy_web_openfile
;
5029 g_ventoy_http_ctx
= mg_start(&callbacks
, NULL
, options
);
5031 ventoy_start_writeback_thread(ventoy_http_writeback
);
5033 return g_ventoy_http_ctx
? 0 : 1;
5036 int ventoy_http_stop(void)
5038 if (g_ventoy_http_ctx
)
5040 mg_stop(g_ventoy_http_ctx
);
5043 ventoy_stop_writeback_thread();
5047 int ventoy_http_init(void)
5052 char *Buffer
= NULL
;
5055 ventoy_read_file_to_buf("www/helplist", 4, (void **)&Buffer
, &BufLen
);
5058 for (i
= 0; i
< BufLen
/ 5; i
++)
5060 memcpy(g_ventoy_help_lang
[i
], Buffer
+ i
* 5, 5);
5061 g_ventoy_help_lang
[i
][5] = 0;
5067 file
= ventoy_tar_find_file("www/helplist");
5070 for (i
= 0; i
< file
->size
/ 5; i
++)
5072 memcpy(g_ventoy_help_lang
[i
], (char *)(file
->addr
) + i
* 5, 5);
5073 g_ventoy_help_lang
[i
][5] = 0;
5078 if (!g_pub_json_buffer
)
5080 g_pub_json_buffer
= malloc(JSON_BUF_MAX
* 2);
5081 g_pub_save_buffer
= g_pub_json_buffer
+ JSON_BUF_MAX
;
5085 pthread_mutex_init(&g_api_mutex
, NULL
);
5089 void ventoy_http_exit(void)
5091 check_free(g_pub_json_buffer
);
5092 g_pub_json_buffer
= NULL
;
5093 g_pub_save_buffer
= NULL
;
5095 pthread_mutex_destroy(&g_api_mutex
);