diff options
author | 2022-07-04 07:21:07 +0900 | |
---|---|---|
committer | 2022-07-28 21:58:03 +0900 | |
commit | e5f52b7e2305019651fe4b6351d3466638af3488 (patch) | |
tree | 70c70da1b8190873c6b05dbc6ed9fe145bd0e106 /lib/file-util.c | |
parent | 33313647b4898746c212fd0ad8372252f226f8dc (diff) |
Initial commit for libredundancyfileop source
This patch add initial source code registration to repository.
Bug-AGL: SPEC-4500
Signed-off-by: Naoto Yamaguchi <naoto.yamaguchi@aisin.co.jp>
Change-Id: I2b7331030f69e1d4cc396db9821f88e87e5b49a2
Diffstat (limited to 'lib/file-util.c')
-rw-r--r-- | lib/file-util.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/lib/file-util.c b/lib/file-util.c new file mode 100644 index 0000000..a45c946 --- /dev/null +++ b/lib/file-util.c @@ -0,0 +1,73 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * + * @file file-util.c + * @brief EINTR safe file functions + */ +#include "file-util.h" + +#include <stdint.h> +#include <unistd.h> +#include <errno.h> + +/** + * INTR safe read + * Interface spec is similar to read. + */ +ssize_t safe_read(int fd, void *buf, size_t count) +{ + ssize_t size = 0,ressize = 0; + size_t reqsize = 0; + uint8_t *pbuf = NULL; + + pbuf = (uint8_t*)buf; + reqsize = count; + + do { + size = read(fd, pbuf, (reqsize - ressize)); + if (size < 0) { + if (errno == EINTR) { + continue; + } else { + ressize = size; + break; + } + } + + pbuf += size; + ressize += size; + } while((ressize < reqsize) && (size != 0)); + + return ressize; +} + +/** + * INTR safe write + * Interface spec is similar to read. + */ +ssize_t safe_write(int fd, void *buf, size_t count) +{ + ssize_t size = 0,ressize = 0; + size_t reqsize = 0; + uint8_t *pbuf = NULL; + + pbuf = (uint8_t*)buf; + reqsize = count; + + do { + size = write(fd, pbuf, (reqsize - ressize)); + if (size < 0) { + if (errno == EINTR) { + continue; + } else { + ressize = size; + break; + } + } + + pbuf += size; + ressize += size; + } while((ressize < reqsize) && (size != 0)); + + return ressize; +} |