]>
glassweightruler.freedombox.rocks Git - Ventoy.git/blob - Plugson/src/Core/ventoy_util.c
6d3d9e738713adfb91f6ae3e71d380240566b1de
1 /******************************************************************************
2 * ventoy_util.c ---- ventoy util
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/>.
22 #include <ventoy_define.h>
23 #include <ventoy_util.h>
26 static int g_tar_filenum
= 0;
27 static char *g_tar_buffer
= NULL
;
28 static ventoy_file
*g_tar_filelist
= NULL
;
32 unsigned char *g_unxz_buffer
= NULL
;
35 void unxz_error(char *x
)
40 int unxz_flush(void *src
, unsigned int size
)
42 memcpy(g_unxz_buffer
+ g_unxz_len
, src
, size
);
43 g_unxz_len
+= (int)size
;
49 uint64_t ventoy_get_human_readable_gb(uint64_t SizeBytes
)
54 double GB
= SizeBytes
* 1.0 / 1000 / 1000 / 1000;
56 if ((SizeBytes
% SIZE_1GB
) == 0)
58 return (uint64_t)(SizeBytes
/ SIZE_1GB
);
61 for (i
= 0; i
< 12; i
++)
65 Delta
= (Pow2
- GB
) / Pow2
;
69 Delta
= (GB
- Pow2
) / Pow2
;
83 ventoy_file
* ventoy_tar_find_file(const char *path
)
87 ventoy_file
*node
= g_tar_filelist
;
89 len
= (int)strlen(path
);
91 for (i
= 0; i
< g_tar_filenum
; i
++, node
++)
93 if (node
->pathlen
== len
&& memcmp(node
->path
, path
, len
) == 0)
98 if (node
->pathlen
> len
)
108 int ventoy_decompress_tar(char *tarbuf
, int buflen
, int *tarsize
)
113 unsigned char *buffer
= NULL
;
114 char tarxz
[MAX_PATH
];
116 #if defined(_MSC_VER) || defined(WIN32)
117 scnprintf(tarxz
, sizeof(tarxz
), "%s\\ventoy\\%s", g_ventoy_dir
, PLUGSON_TXZ
);
119 scnprintf(tarxz
, sizeof(tarxz
), "%s/tool/%s", g_ventoy_dir
, PLUGSON_TXZ
);
122 if (ventoy_read_file_to_buf(tarxz
, 0, (void **)&buffer
, &BufLen
))
124 vlog("Failed to read file <%s>\n", tarxz
);
128 g_unxz_buffer
= (unsigned char *)tarbuf
;
131 unxz(buffer
, BufLen
, NULL
, unxz_flush
, NULL
, &inused
, unxz_error
);
132 vlog("xzlen:%u rawdata size:%d\n", BufLen
, g_unxz_len
);
134 if (inused
!= BufLen
)
136 vlog("Failed to unxz data %d %d\n", inused
, BufLen
);
141 *tarsize
= g_unxz_len
;
150 int ventoy_www_init(void)
157 ventoy_file
*node
= NULL
;
158 ventoy_file
*node2
= NULL
;
159 VENTOY_TAR_HEAD
*pHead
= NULL
;
164 g_tar_filelist
= malloc(VENTOY_FILE_MAX
* sizeof(ventoy_file
));
165 g_tar_buffer
= malloc(TAR_BUF_MAX
);
169 if ((!g_tar_filelist
) || (!g_tar_buffer
))
174 if (ventoy_decompress_tar(g_tar_buffer
, TAR_BUF_MAX
, &tarsize
))
176 vlog("Failed to decompress tar\n");
180 pHead
= (VENTOY_TAR_HEAD
*)g_tar_buffer
;
181 node
= g_tar_filelist
;
183 while (g_tar_filenum
< VENTOY_FILE_MAX
&& size
< tarsize
&& memcmp(pHead
->magic
, TMAGIC
, 5) == 0)
185 if (pHead
->typeflag
== REGTYPE
)
187 node
->size
= (int)strtol(pHead
->size
, NULL
, 8);
188 node
->pathlen
= (int)scnprintf(node
->path
, MAX_PATH
, "%s", pHead
->name
);
189 node
->addr
= pHead
+ 1;
191 if (node
->pathlen
== 13 && strcmp(pHead
->name
, "www/buildtime") == 0)
193 scnprintf(g_sysinfo
.buildtime
, sizeof(g_sysinfo
.buildtime
), "%s", (char *)node
->addr
);
194 vlog("Plugson buildtime %s\n", g_sysinfo
.buildtime
);
197 offset
= 512 + VENTOY_UP_ALIGN(node
->size
, 512);
207 pHead
= (VENTOY_TAR_HEAD
*)((char *)pHead
+ offset
);
213 for (i
= 0; i
< g_tar_filenum
; i
++)
214 for (j
= i
+ 1; j
< g_tar_filenum
; j
++)
216 node
= g_tar_filelist
+ i
;
217 node2
= g_tar_filelist
+ j
;
219 if (node
->pathlen
> node2
->pathlen
)
221 memcpy(&tmpnode
, node
, sizeof(ventoy_file
));
222 memcpy(node
, node2
, sizeof(ventoy_file
));
223 memcpy(node2
, &tmpnode
, sizeof(ventoy_file
));
227 vlog("Total extract %d files from tar file.\n", g_tar_filenum
);
232 void ventoy_www_exit(void)
234 check_free(g_tar_filelist
);
235 check_free(g_tar_buffer
);
236 g_tar_filelist
= NULL
;
242 void ventoy_get_json_path(char *path
, char *backup
)
244 #if defined(_MSC_VER) || defined(WIN32)
245 scnprintf(path
, 64, "%C:\\ventoy\\ventoy.json", g_cur_dir
[0]);
248 scnprintf(backup
, 64, "%C:\\ventoy\\ventoy_backup.json", g_cur_dir
[0]);
251 scnprintf(path
, 64, "%s/ventoy/ventoy.json", g_cur_dir
);
254 scnprintf(backup
, 64, "%s/ventoy/ventoy_backup.json", g_cur_dir
);
260 static const char g_encoding_table
[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
261 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
262 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
263 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
264 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
265 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
266 'w', 'x', 'y', 'z', '0', '1', '2', '3',
267 '4', '5', '6', '7', '8', '9', '+', '/'};
269 char * ventoy_base64_encode(const char *data
, int input_length
, int *output_length
)
273 char *encoded_data
= NULL
;
274 int mod_table
[] = {0, 2, 1};
276 *output_length
= 4 * ((input_length
+ 2) / 3);
277 encoded_data
= malloc(*output_length
+ 4);
283 while (i
< input_length
)
285 unsigned int octet_a
= i
< input_length
? (unsigned char)data
[i
++] : 0;
286 unsigned int octet_b
= i
< input_length
? (unsigned char)data
[i
++] : 0;
287 unsigned int octet_c
= i
< input_length
? (unsigned char)data
[i
++] : 0;
289 unsigned int triple
= (octet_a
<< 0x10) + (octet_b
<< 0x08) + octet_c
;
291 encoded_data
[j
++] = g_encoding_table
[(triple
>> 3 * 6) & 0x3F];
292 encoded_data
[j
++] = g_encoding_table
[(triple
>> 2 * 6) & 0x3F];
293 encoded_data
[j
++] = g_encoding_table
[(triple
>> 1 * 6) & 0x3F];
294 encoded_data
[j
++] = g_encoding_table
[(triple
>> 0 * 6) & 0x3F];
297 for (i
= 0; i
< mod_table
[input_length
% 3]; i
++)
299 encoded_data
[*output_length
- 1 - i
] = '=';