ifdtool: Add O_BINARY to open flags for Windows compatibility

Windows requires O_BINARY when opening a binary file. Otherwise
\n characters get expanded to \r\n and <ctrl>z is treated as
end of file. For compatibility with non-Windows hosts, the patch
defines O_BINARY if it is not already defined.

Change-Id: I04cd609b644b1edbe9104153b43b9996811ffd38
Signed-off-by: Scott Duplichan <scott@notabs.org>
Reviewed-on: http://review.coreboot.org/7789
Tested-by: build bot (Jenkins)
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Reviewed-by: Edward O'Callaghan <eocallaghan@alterapraxis.com>
This commit is contained in:
Scott Duplichan 2014-12-12 21:03:06 -06:00 committed by Stefan Reinauer
parent e1a4dc803a
commit f2c9837e6f
1 changed files with 8 additions and 4 deletions

View File

@ -27,6 +27,10 @@
#include <sys/stat.h> #include <sys/stat.h>
#include "ifdtool.h" #include "ifdtool.h"
#ifndef O_BINARY
#define O_BINARY 0
#endif
#define NUM_REGIONS 5 #define NUM_REGIONS 5
static const struct region_name region_names[NUM_REGIONS] = { static const struct region_name region_names[NUM_REGIONS] = {
@ -538,7 +542,7 @@ static void write_regions(char *image, int size)
if (region.size > 0) { if (region.size > 0) {
int region_fd; int region_fd;
region_fd = open(region_filename(i), region_fd = open(region_filename(i),
O_WRONLY | O_CREAT | O_TRUNC, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY,
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if (region_fd < 0) { if (region_fd < 0) {
perror("Error while trying to open file"); perror("Error while trying to open file");
@ -564,7 +568,7 @@ static void write_image(char *filename, char *image, int size)
// Now write out new image // Now write out new image
new_fd = open(new_filename, new_fd = open(new_filename,
O_WRONLY | O_CREAT | O_TRUNC, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY,
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if (new_fd < 0) { if (new_fd < 0) {
perror("Error while trying to open file"); perror("Error while trying to open file");
@ -643,7 +647,7 @@ void inject_region(char *filename, char *image, int size, int region_type,
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
int region_fd = open(region_fname, O_RDONLY); int region_fd = open(region_fname, O_RDONLY | O_BINARY);
if (region_fd == -1) { if (region_fd == -1) {
perror("Could not open file"); perror("Could not open file");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
@ -1060,7 +1064,7 @@ int main(int argc, char *argv[])
} }
char *filename = argv[optind]; char *filename = argv[optind];
int bios_fd = open(filename, O_RDONLY); int bios_fd = open(filename, O_RDONLY | O_BINARY);
if (bios_fd == -1) { if (bios_fd == -1) {
perror("Could not open file"); perror("Could not open file");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);