diff --git a/commands/memset.c b/commands/memset.c index f871e07..f99bf86 100644 --- a/commands/memset.c +++ b/commands/memset.c @@ -56,7 +56,7 @@ 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 6d2a887..c7f62fc 100644 --- a/commands/mm.c +++ b/commands/mm.c @@ -53,7 +53,7 @@ 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 7ff589a..2912997 100644 --- a/commands/mw.c +++ b/commands/mw.c @@ -52,7 +52,7 @@ 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 fb8d058..7548bda 100644 --- a/fs/ramfs.c +++ b/fs/ramfs.c @@ -109,7 +109,7 @@ 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 d22519b..0052e78 100644 --- a/lib/libfile.c +++ b/lib/libfile.c @@ -501,7 +501,7 @@ { int fd, ret; - fd = open(filename, mode | O_RDONLY); + fd = open(filename, mode); if (fd < 0) { perror("open"); return fd; @@ -510,6 +510,24 @@ 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");