diff --git a/src/bled/bled.c b/src/bled/bled.c index 3d4be7c4..51d2f526 100644 --- a/src/bled/bled.c +++ b/src/bled/bled.c @@ -21,6 +21,8 @@ typedef long long int(*unpacker_t)(transformer_state_t *xstate); smallint bb_got_signal; uint64_t bb_total_rb; printf_t bled_printf = NULL; +read_t bled_read = NULL; +write_t bled_write = NULL; progress_t bled_progress = NULL; unsigned long* bled_cancel_request; static bool bled_initialized = 0; @@ -228,12 +230,15 @@ int64_t bled_uncompress_from_buffer_to_buffer(const char* src, const size_t src_ * void progress_function(const uint64_t read_bytes); * - point to an unsigned long variable, to be used to cancel operations when set to non zero */ -int bled_init(printf_t print_function, progress_t progress_function, unsigned long* cancel_request) +int bled_init(printf_t print_function, read_t read_function, write_t write_function, + progress_t progress_function, unsigned long* cancel_request) { if (bled_initialized) return -1; bled_initialized = true; bled_printf = print_function; + bled_read = read_function; + bled_write = write_function; bled_progress = progress_function; bled_cancel_request = cancel_request; return 0; diff --git a/src/bled/bled.h b/src/bled/bled.h index 6ec51ec0..43a22562 100644 --- a/src/bled/bled.h +++ b/src/bled/bled.h @@ -17,6 +17,8 @@ typedef void (*printf_t) (const char* format, ...); typedef void (*progress_t) (const uint64_t read_bytes); +typedef int (*read_t)(int fd, void* buf, unsigned int count); +typedef int (*write_t)(int fd, const void* buf, unsigned int count); typedef enum { BLED_COMPRESSION_NONE = 0, @@ -46,11 +48,13 @@ int64_t bled_uncompress_from_buffer_to_buffer(const char* src, const size_t src_ * When the parameters are not NULL you can: * - specify the printf-like function you want to use to output message * void print_function(const char* format, ...); + * - specify the read/write functions you want to use; * - specify the function you want to use to display progress, based on number of source archive bytes read * void progress_function(const uint64_t read_bytes); * - point to an unsigned long variable, to be used to cancel operations when set to non zero */ -int bled_init(printf_t print_function, progress_t progress_function, unsigned long* cancel_request); +int bled_init(printf_t print_function, read_t read_function, write_t write_function, + progress_t progress_function, unsigned long* cancel_request); /* This call frees any resource used by the library */ void bled_exit(void); diff --git a/src/bled/libbb.h b/src/bled/libbb.h index faf71b9d..1048354f 100644 --- a/src/bled/libbb.h +++ b/src/bled/libbb.h @@ -125,6 +125,8 @@ typedef struct _llist_t { extern void (*bled_printf) (const char* format, ...); extern void (*bled_progress) (const uint64_t processed_bytes); +extern int (*bled_read)(int fd, void* buf, unsigned int count); +extern int (*bled_write)(int fd, const void* buf, unsigned int count); extern unsigned long* bled_cancel_request; #define xfunc_die() longjmp(bb_error_jmp, 1) @@ -159,9 +161,9 @@ static inline int fnmatch(const char *pattern, const char *string, int flags) {r static inline pid_t wait(int* status) { *status = 4; return -1; } #define wait_any_nohang wait -/* This override enables the display of a progress based on the number of bytes read */ +/* This enables the display of a progress based on the number of bytes read */ extern uint64_t bb_total_rb; -static inline int full_read(int fd, void *buf, size_t count) { +static inline int full_read(int fd, void *buf, unsigned int count) { int rb; if (fd < 0) { @@ -179,12 +181,12 @@ static inline int full_read(int fd, void *buf, size_t count) { if (fd == bb_virtual_fd) { if (bb_virtual_pos + count > bb_virtual_len) - count = bb_virtual_len - bb_virtual_pos; + count = (unsigned int)(bb_virtual_len - bb_virtual_pos); memcpy(buf, &bb_virtual_buf[bb_virtual_pos], count); bb_virtual_pos += count; rb = (int)count; } else { - rb = _read(fd, buf, (int)count); + rb = (bled_read != NULL) ? bled_read(fd, buf, count) : _read(fd, buf, count); } if (rb > 0) { bb_total_rb += rb; @@ -194,13 +196,17 @@ static inline int full_read(int fd, void *buf, size_t count) { return rb; } +static inline int full_write(int fd, const void* buffer, unsigned int count) +{ + return (bled_write != NULL) ? bled_write(fd, buffer, count) : _write(fd, buffer, count); +} + static inline struct tm *localtime_r(const time_t *timep, struct tm *result) { if (localtime_s(result, timep) != 0) result = NULL; return result; } -#define full_write _write #define safe_read full_read #define lstat stat #define xmalloc malloc diff --git a/src/bled/open_transformer.c b/src/bled/open_transformer.c index 08a495de..2bc62bfe 100644 --- a/src/bled/open_transformer.c +++ b/src/bled/open_transformer.c @@ -42,9 +42,12 @@ ssize_t FAST_FUNC transformer_write(transformer_state_t *xstate, const void *buf memcpy(xstate->mem_output_buf + pos, buf, bufsize); xstate->mem_output_size += bufsize; } else { - nwrote = full_write(xstate->dst_fd, buf, (unsigned)bufsize); + nwrote = full_write(xstate->dst_fd, buf, (unsigned int)bufsize); if (nwrote != (ssize_t)bufsize) { - bb_perror_msg("write error - %d bytes written but %d expected", (int)nwrote, (int)bufsize); + if (nwrote < 0) + bb_perror_msg("write error: %d", (int)nwrote); + else + bb_perror_msg("write error: %d bytes written but %d expected", (int)nwrote, (int)bufsize); nwrote = -1; goto ret; } diff --git a/src/bled/platform.h b/src/bled/platform.h index f8819589..7345703a 100644 --- a/src/bled/platform.h +++ b/src/bled/platform.h @@ -220,7 +220,7 @@ static __inline uint64_t bswap_64(uint64_t x) #elif defined(BYTE_ORDER) && BYTE_ORDER == LITTLE_ENDIAN # define BB_BIG_ENDIAN 0 # define BB_LITTLE_ENDIAN 1 -#elif defined(__386__) || defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM) || (defined(_M_ARM64)) +#elif defined(__386__) || defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64) # define BB_BIG_ENDIAN 0 # define BB_LITTLE_ENDIAN 1 #else diff --git a/src/format.c b/src/format.c index c3c362d5..197fc145 100644 --- a/src/format.c +++ b/src/format.c @@ -2262,7 +2262,7 @@ static BOOL WriteDrive(HANDLE hPhysicalDrive, HANDLE hSourceImage) if (img_report.compression_type != BLED_COMPRESSION_NONE) { uprintf("Writing compressed image..."); - bled_init(_uprintf, update_progress, &FormatStatus); + bled_init(_uprintf, NULL, NULL, update_progress, &FormatStatus); bled_ret = bled_uncompress_with_handles(hSourceImage, hPhysicalDrive, img_report.compression_type); bled_exit(); if ((bled_ret < 0) && (SCODE_CODE(FormatStatus) != ERROR_CANCELLED)) { diff --git a/src/net.c b/src/net.c index 19ef56a9..0ac450b1 100644 --- a/src/net.c +++ b/src/net.c @@ -916,7 +916,7 @@ static DWORD WINAPI DownloadISOThread(LPVOID param) free(sig); uprintf("Signature is valid ✓"); uncompressed_size = *((uint64_t*)&compressed[5]); - if ((uncompressed_size < 1 * MB) && (bled_init(_uprintf, NULL, &FormatStatus) >= 0)) { + if ((uncompressed_size < 1 * MB) && (bled_init(_uprintf, NULL, NULL, NULL, &FormatStatus) >= 0)) { fido_script = malloc((size_t)uncompressed_size); size = bled_uncompress_from_buffer_to_buffer(compressed, dwCompressedSize, fido_script, (size_t)uncompressed_size, BLED_COMPRESSION_LZMA); bled_exit(); diff --git a/src/rufus.rc b/src/rufus.rc index 0098818c..085846a8 100644 --- a/src/rufus.rc +++ b/src/rufus.rc @@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDD_DIALOG DIALOGEX 12, 12, 232, 326 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_ACCEPTFILES -CAPTION "Rufus 3.9.1589" +CAPTION "Rufus 3.9.1590" FONT 9, "Segoe UI Symbol", 400, 0, 0x0 BEGIN LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP @@ -394,8 +394,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 3,9,1589,0 - PRODUCTVERSION 3,9,1589,0 + FILEVERSION 3,9,1590,0 + PRODUCTVERSION 3,9,1590,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -413,13 +413,13 @@ BEGIN VALUE "Comments", "https://rufus.ie" VALUE "CompanyName", "Akeo Consulting" VALUE "FileDescription", "Rufus" - VALUE "FileVersion", "3.9.1589" + VALUE "FileVersion", "3.9.1590" VALUE "InternalName", "Rufus" VALUE "LegalCopyright", "© 2011-2019 Pete Batard (GPL v3)" VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html" VALUE "OriginalFilename", "rufus-3.9.exe" VALUE "ProductName", "Rufus" - VALUE "ProductVersion", "3.9.1589" + VALUE "ProductVersion", "3.9.1590" END END BLOCK "VarFileInfo" diff --git a/src/vhd.c b/src/vhd.c index 1e2b2212..482d832b 100644 --- a/src/vhd.c +++ b/src/vhd.c @@ -250,7 +250,7 @@ BOOL IsCompressedBootableImage(const char* path) if (buf == NULL) return FALSE; FormatStatus = 0; - bled_init(_uprintf, NULL, &FormatStatus); + bled_init(_uprintf, NULL, NULL, NULL, &FormatStatus); dc = bled_uncompress_to_buffer(path, (char*)buf, MBR_SIZE, file_assoc[i].type); bled_exit(); if (dc != MBR_SIZE) {