diff options
Diffstat (limited to 'fastbootd/utils.c')
-rw-r--r-- | fastbootd/utils.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/fastbootd/utils.c b/fastbootd/utils.c index 16e1c09..cac5509 100644 --- a/fastbootd/utils.c +++ b/fastbootd/utils.c @@ -34,6 +34,7 @@ #include <stdio.h> #include <sys/ioctl.h> #include <linux/fs.h> +#include <stdlib.h> #include "utils.h" #include "debug.h" @@ -46,6 +47,7 @@ #define BLKSECDISCARD _IO(0x12,125) #endif +#define READ_BUF_SIZE (16*1024) int get_stream_size(FILE *stream) { int size; @@ -145,3 +147,60 @@ int wipe_block_device(int fd, int64_t len) return 0; } +int create_temp_file() { + char tempname[] = "/dev/fastboot_data_XXXXXX"; + int fd; + + fd = mkstemp(tempname); + if (fd < 0) + return -1; + + unlink(tempname); + + return fd; +} + +ssize_t bulk_write(int bulk_in, const char *buf, size_t length) +{ + size_t count = 0; + ssize_t ret; + + do { + ret = TEMP_FAILURE_RETRY(write(bulk_in, buf + count, length - count)); + if (ret < 0) { + D(WARN, "[ bulk_write failed fd=%d length=%d errno=%d %s ]", + bulk_in, length, errno, strerror(errno)); + return -1; + } else { + count += ret; + } + } while (count < length); + + D(VERBOSE, "[ bulk_write done fd=%d ]", bulk_in); + return count; +} + +ssize_t bulk_read(int bulk_out, char *buf, size_t length) +{ + ssize_t ret; + size_t n = 0; + + while (n < length) { + size_t to_read = (length - n > READ_BUF_SIZE) ? READ_BUF_SIZE : length - n; + ret = TEMP_FAILURE_RETRY(read(bulk_out, buf + n, to_read)); + if (ret < 0) { + D(WARN, "[ bulk_read failed fd=%d length=%d errno=%d %s ]", + bulk_out, length, errno, strerror(errno)); + return ret; + } + n += ret; + if (ret < (ssize_t)to_read) { + D(VERBOSE, "bulk_read short read, ret=%zd to_read=%u n=%u length=%u", + ret, to_read, n, length); + break; + } + } + + return n; +} + |