|
From: Spencer O. <nt...@us...> - 2001-09-17 00:00:00
|
Cygwin would fail to reopen a previously written file if the mode is
not given.
Simplified converting the open flags and made sure the win32 O_BINARY
bit is set.
Added define for systems that do not support O_BINARY.
Signed-off-by: Spencer Oliver <nt...@us...>
---
src/helper/replacements.h | 6 ++++++
src/target/arm_semihosting.c | 36 +++++++++++++++++++++---------------
2 files changed, 27 insertions(+), 15 deletions(-)
diff --git a/src/helper/replacements.h b/src/helper/replacements.h
index 2b3ea73..3598dd9 100644
--- a/src/helper/replacements.h
+++ b/src/helper/replacements.h
@@ -40,6 +40,12 @@
#define ENOTSUP 134 /* Not supported */
#endif
+/* for systems that do not support O_BINARY
+ * linux being one of them */
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
#ifndef HAVE_SYS_TIME_H
#ifndef _TIMEVAL_DEFINED
diff --git a/src/target/arm_semihosting.c b/src/target/arm_semihosting.c
index 1d0acd6..be90702 100644
--- a/src/target/arm_semihosting.c
+++ b/src/target/arm_semihosting.c
@@ -2,6 +2,9 @@
* Copyright (C) 2009 by Marvell Technology Group Ltd. *
* Written by Nicolas Pitre <ni...@ma...> *
* *
+ * Copyright (C) 2010 by Spencer Oliver *
+ * sp...@sp... *
+ * *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
@@ -41,6 +44,20 @@
#include <helper/binarybuffer.h>
#include <helper/log.h>
+static int open_modeflags[12] = {
+ O_RDONLY,
+ O_RDONLY | O_BINARY,
+ O_RDWR,
+ O_RDWR | O_BINARY,
+ O_WRONLY | O_CREAT | O_TRUNC,
+ O_WRONLY | O_CREAT | O_TRUNC | O_BINARY,
+ O_RDWR | O_CREAT | O_TRUNC,
+ O_RDWR | O_CREAT | O_TRUNC | O_BINARY,
+ O_WRONLY | O_CREAT | O_APPEND,
+ O_WRONLY | O_CREAT | O_APPEND | O_BINARY,
+ O_RDWR | O_CREAT | O_APPEND,
+ O_RDWR | O_CREAT | O_APPEND | O_BINARY
+};
static int do_semihosting(struct target *target)
{
@@ -72,28 +89,17 @@ static int do_semihosting(struct target *target)
uint32_t l = target_buffer_get_u32(target, params+8);
if (l <= 255 && m <= 11) {
uint8_t fn[256];
- int mode;
retval = target_read_memory(target, a, 1, l, fn);
if (retval != ERROR_OK)
return retval;
fn[l] = 0;
- if (m & 0x2)
- mode = O_RDWR;
- else if (m & 0xc)
- mode = O_WRONLY;
- else
- mode = O_RDONLY;
- if (m >= 8)
- mode |= O_CREAT|O_APPEND;
- else if (m >= 4)
- mode |= O_CREAT|O_TRUNC;
if (strcmp((char *)fn, ":tt") == 0) {
- if ((mode & 3) == 0)
- result = dup(0);
+ if (m < 4)
+ result = STDIN_FILENO;
else
- result = dup(1);
+ result = STDOUT_FILENO;
} else
- result = open((char *)fn, mode);
+ result = open((char *)fn, open_modeflags[m], 0644);
armv4_5->semihosting_errno = errno;
} else {
result = -1;
--
1.6.5.1.1367.gcd48
--------------070804070800010304070305--
|