diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2018-08-13 16:56:04 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2018-08-13 16:56:04 +0200 |
commit | 5c7690f9152b4b898654ee01e633ce5d677faf18 (patch) | |
tree | dfc001844c5f01903b1e8cdd5e6069fbf4eb45f1 | |
parent | 85451a740ff31ba411493c7617e2951493c78e10 (diff) | |
parent | 90245ebc5328b998d24b0ab9f6a91496036c3202 (diff) | |
download | barebox-5c7690f9152b4b898654ee01e633ce5d677faf18.tar.gz barebox-5c7690f9152b4b898654ee01e633ce5d677faf18.tar.xz |
Merge branch 'for-next/memcmds'
-rw-r--r-- | commands/memset.c | 2 | ||||
-rw-r--r-- | commands/mm.c | 2 | ||||
-rw-r--r-- | commands/mw.c | 2 | ||||
-rw-r--r-- | fs/ramfs.c | 2 | ||||
-rw-r--r-- | lib/libfile.c | 20 |
5 files changed, 23 insertions, 5 deletions
diff --git a/commands/memset.c b/commands/memset.c index f871e07c9..f99bf86c0 100644 --- a/commands/memset.c +++ b/commands/memset.c @@ -56,7 +56,7 @@ static int do_memset(int argc, char *argv[]) c = strtoull_suffix(argv[optind + 1], NULL, 0); n = strtoull_suffix(argv[optind + 2], NULL, 0); - fd = open_and_lseek(file, mode | O_WRONLY, s); + fd = open_and_lseek(file, mode | O_WRONLY | O_CREAT, s); if (fd < 0) return 1; diff --git a/commands/mm.c b/commands/mm.c index 6d2a88789..c7f62fca5 100644 --- a/commands/mm.c +++ b/commands/mm.c @@ -53,7 +53,7 @@ static int do_mem_mm(int argc, char *argv[]) value = simple_strtoull(argv[optind++], NULL, 0); mask = simple_strtoull(argv[optind++], NULL, 0); - fd = open_and_lseek(filename, mode | O_RDWR, adr); + fd = open_and_lseek(filename, mode | O_RDWR | O_CREAT, adr); if (fd < 0) return 1; diff --git a/commands/mw.c b/commands/mw.c index 7ff589abb..2912997a3 100644 --- a/commands/mw.c +++ b/commands/mw.c @@ -52,7 +52,7 @@ static int do_mem_mw(int argc, char *argv[]) adr = strtoull_suffix(argv[optind++], NULL, 0); - fd = open_and_lseek(filename, mode | O_WRONLY, adr); + fd = open_and_lseek(filename, mode | O_WRONLY | O_CREAT, adr); if (fd < 0) return 1; diff --git a/fs/ramfs.c b/fs/ramfs.c index fb8d0580d..7548bdac9 100644 --- a/fs/ramfs.c +++ b/fs/ramfs.c @@ -109,7 +109,7 @@ static struct ramfs_chunk *ramfs_get_chunk(void) if (!data) return NULL; - data->data = malloc(CHUNK_SIZE); + data->data = calloc(CHUNK_SIZE, 1); if (!data->data) { free(data); return NULL; diff --git a/lib/libfile.c b/lib/libfile.c index d22519b8f..0052e789f 100644 --- a/lib/libfile.c +++ b/lib/libfile.c @@ -501,7 +501,7 @@ int open_and_lseek(const char *filename, int mode, loff_t pos) { int fd, ret; - fd = open(filename, mode | O_RDONLY); + fd = open(filename, mode); if (fd < 0) { perror("open"); return fd; @@ -510,6 +510,24 @@ int open_and_lseek(const char *filename, int mode, loff_t pos) if (!pos) return fd; + if (mode & (O_WRONLY | O_RDWR)) { + struct stat s; + + ret = fstat(fd, &s); + if (ret) { + perror("fstat"); + return ret; + } + + if (s.st_size < pos) { + ret = ftruncate(fd, pos); + if (ret) { + perror("ftruncate"); + return ret; + } + } + } + ret = lseek(fd, pos, SEEK_SET); if (ret == -1) { perror("lseek"); |