]> git.sur5r.net Git - openocd/commitdiff
ARM semihosting: fix writing to stdout
authorSpencer Oliver <ntfreak@users.sourceforge.net>
Wed, 27 Jan 2010 21:20:18 +0000 (21:20 +0000)
committerSpencer Oliver <ntfreak@users.sourceforge.net>
Thu, 28 Jan 2010 20:21:31 +0000 (20:21 +0000)
SYS_FLEN would be called before a write on a descriptor to check its size.
Currently lseek would fail with -1 when given the stdout/stderr descriptor.
Changing to use fstat seems to be the standard way of handling this.

Signed-off-by: Spencer Oliver <ntfreak@users.sourceforge.net>
src/helper/system.h
src/target/arm_semihosting.c

index 169df1cb4f28945d062263cd79fe7f5cab479782..af19d018db1dfc41c16e6cfc9b033d107f05a0bc 100644 (file)
@@ -50,6 +50,8 @@
 #ifdef _WIN32
 #include <winsock2.h>
 #include <ws2tcpip.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 #endif
 // --- platform specific headers ---
 
index f4244c84d11c15985590e2abda59317f1db34fb3..1d0acd63142f1aa840ec9278ca4ab4c56b2e39c9 100644 (file)
@@ -230,18 +230,14 @@ static int do_semihosting(struct target *target)
                        return retval;
                else {
                        int fd = target_buffer_get_u32(target, params+0);
-                       off_t cur = lseek(fd, 0, SEEK_CUR);
-                       if (cur == (off_t)-1) {
+                       struct stat buf;
+                       result = fstat(fd, &buf);
+                       if (result == -1) {
                                armv4_5->semihosting_errno = errno;
                                result = -1;
                                break;
                        }
-                       result = lseek(fd, 0, SEEK_END);
-                       armv4_5->semihosting_errno = errno;
-                       if (lseek(fd, cur, SEEK_SET) == (off_t)-1) {
-                               armv4_5->semihosting_errno = errno;
-                               result = -1;
-                       }
+                       result = buf.st_size;
                }
                break;