1 /* Remote File-I/O communications
3 Copyright (C) 2003-2019 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 /* See the GDB User Guide for details of the GDB remote protocol. */
25 #include "gdbsupport/gdb_wait.h"
27 #include "remote-fileio.h"
28 #include "event-loop.h"
30 #include "filenames.h"
31 #include "gdbsupport/filestuff.h"
34 #include "gdbsupport/gdb_sys_time.h"
36 #include <sys/cygwin.h> /* For cygwin_conv_path. */
45 #define FIO_FD_INVALID -1
46 #define FIO_FD_CONSOLE_IN -2
47 #define FIO_FD_CONSOLE_OUT -3
49 static int remote_fio_system_call_allowed
= 0;
52 remote_fileio_init_fd_map (void)
56 if (!remote_fio_data
.fd_map
)
58 remote_fio_data
.fd_map
= XNEWVEC (int, 10);
59 remote_fio_data
.fd_map_size
= 10;
60 remote_fio_data
.fd_map
[0] = FIO_FD_CONSOLE_IN
;
61 remote_fio_data
.fd_map
[1] = FIO_FD_CONSOLE_OUT
;
62 remote_fio_data
.fd_map
[2] = FIO_FD_CONSOLE_OUT
;
63 for (i
= 3; i
< 10; ++i
)
64 remote_fio_data
.fd_map
[i
] = FIO_FD_INVALID
;
70 remote_fileio_resize_fd_map (void)
72 int i
= remote_fio_data
.fd_map_size
;
74 if (!remote_fio_data
.fd_map
)
75 return remote_fileio_init_fd_map ();
76 remote_fio_data
.fd_map_size
+= 10;
77 remote_fio_data
.fd_map
=
78 (int *) xrealloc (remote_fio_data
.fd_map
,
79 remote_fio_data
.fd_map_size
* sizeof (int));
80 for (; i
< remote_fio_data
.fd_map_size
; i
++)
81 remote_fio_data
.fd_map
[i
] = FIO_FD_INVALID
;
82 return remote_fio_data
.fd_map_size
- 10;
86 remote_fileio_next_free_fd (void)
90 for (i
= 0; i
< remote_fio_data
.fd_map_size
; ++i
)
91 if (remote_fio_data
.fd_map
[i
] == FIO_FD_INVALID
)
93 return remote_fileio_resize_fd_map ();
97 remote_fileio_fd_to_targetfd (int fd
)
99 int target_fd
= remote_fileio_next_free_fd ();
101 remote_fio_data
.fd_map
[target_fd
] = fd
;
106 remote_fileio_map_fd (int target_fd
)
108 remote_fileio_init_fd_map ();
109 if (target_fd
< 0 || target_fd
>= remote_fio_data
.fd_map_size
)
110 return FIO_FD_INVALID
;
111 return remote_fio_data
.fd_map
[target_fd
];
115 remote_fileio_close_target_fd (int target_fd
)
117 remote_fileio_init_fd_map ();
118 if (target_fd
>= 0 && target_fd
< remote_fio_data
.fd_map_size
)
119 remote_fio_data
.fd_map
[target_fd
] = FIO_FD_INVALID
;
123 remote_fileio_oflags_to_host (long flags
)
127 if (flags
& FILEIO_O_CREAT
)
129 if (flags
& FILEIO_O_EXCL
)
131 if (flags
& FILEIO_O_TRUNC
)
133 if (flags
& FILEIO_O_APPEND
)
135 if (flags
& FILEIO_O_RDONLY
)
137 if (flags
& FILEIO_O_WRONLY
)
139 if (flags
& FILEIO_O_RDWR
)
141 /* On systems supporting binary and text mode, always open files in
150 remote_fileio_mode_to_host (long mode
, int open_call
)
156 if (mode
& FILEIO_S_IFREG
)
158 if (mode
& FILEIO_S_IFDIR
)
160 if (mode
& FILEIO_S_IFCHR
)
163 if (mode
& FILEIO_S_IRUSR
)
165 if (mode
& FILEIO_S_IWUSR
)
167 if (mode
& FILEIO_S_IXUSR
)
170 if (mode
& FILEIO_S_IRGRP
)
174 if (mode
& FILEIO_S_IWGRP
)
178 if (mode
& FILEIO_S_IXGRP
)
181 if (mode
& FILEIO_S_IROTH
)
184 if (mode
& FILEIO_S_IWOTH
)
188 if (mode
& FILEIO_S_IXOTH
)
195 remote_fileio_seek_flag_to_host (long num
, int *flag
)
201 case FILEIO_SEEK_SET
:
204 case FILEIO_SEEK_CUR
:
207 case FILEIO_SEEK_END
:
217 remote_fileio_extract_long (char **buf
, LONGEST
*retlong
)
222 if (!buf
|| !*buf
|| !**buf
|| !retlong
)
224 c
= strchr (*buf
, ',');
228 c
= strchr (*buf
, '\0');
229 while (strchr ("+-", **buf
))
235 for (*retlong
= 0; **buf
; ++*buf
)
238 if (**buf
>= '0' && **buf
<= '9')
239 *retlong
+= **buf
- '0';
240 else if (**buf
>= 'a' && **buf
<= 'f')
241 *retlong
+= **buf
- 'a' + 10;
242 else if (**buf
>= 'A' && **buf
<= 'F')
243 *retlong
+= **buf
- 'A' + 10;
253 remote_fileio_extract_int (char **buf
, long *retint
)
260 ret
= remote_fileio_extract_long (buf
, &retlong
);
262 *retint
= (long) retlong
;
267 remote_fileio_extract_ptr_w_len (char **buf
, CORE_ADDR
*ptrval
, int *length
)
272 if (!buf
|| !*buf
|| !**buf
|| !ptrval
|| !length
)
274 c
= strchr (*buf
, '/');
278 if (remote_fileio_extract_long (buf
, &retlong
))
280 *ptrval
= (CORE_ADDR
) retlong
;
282 if (remote_fileio_extract_long (buf
, &retlong
))
284 *length
= (int) retlong
;
289 remote_fileio_to_fio_long (LONGEST num
, fio_long_t fnum
)
291 host_to_bigendian (num
, (char *) fnum
, 8);
295 remote_fileio_to_fio_timeval (struct timeval
*tv
, struct fio_timeval
*ftv
)
297 host_to_fileio_time (tv
->tv_sec
, ftv
->ftv_sec
);
298 remote_fileio_to_fio_long (tv
->tv_usec
, ftv
->ftv_usec
);
301 /* The quit handler originally installed. */
302 static quit_handler_ftype
*remote_fileio_o_quit_handler
;
304 /* What to do on a QUIT call while handling a file I/O request. We
305 throw a quit exception, which is caught by remote_fileio_request
306 and translated to an EINTR reply back to the target. */
309 remote_fileio_quit_handler (void)
311 if (check_quit_flag ())
316 remote_fileio_reply (remote_target
*remote
, int retcode
, int error
)
319 int ctrl_c
= check_quit_flag ();
327 sprintf (buf
+ strlen (buf
), "%x", retcode
);
331 error
= FILEIO_EINTR
;
337 sprintf (buf
+ strlen (buf
), ",%x", error
);
341 quit_handler
= remote_fileio_o_quit_handler
;
342 putpkt (remote
, buf
);
346 remote_fileio_ioerror (remote_target
*remote
)
348 remote_fileio_reply (remote
, -1, FILEIO_EIO
);
352 remote_fileio_badfd (remote_target
*remote
)
354 remote_fileio_reply (remote
, -1, FILEIO_EBADF
);
358 remote_fileio_return_errno (remote_target
*remote
, int retcode
)
360 remote_fileio_reply (remote
, retcode
, retcode
< 0
361 ? host_to_fileio_error (errno
) : 0);
365 remote_fileio_return_success (remote_target
*remote
, int retcode
)
367 remote_fileio_reply (remote
, retcode
, 0);
371 remote_fileio_func_open (remote_target
*remote
, char *buf
)
381 /* 1. Parameter: Ptr to pathname / length incl. trailing zero. */
382 if (remote_fileio_extract_ptr_w_len (&buf
, &ptrval
, &length
))
384 remote_fileio_ioerror (remote
);
387 /* 2. Parameter: open flags */
388 if (remote_fileio_extract_int (&buf
, &num
))
390 remote_fileio_ioerror (remote
);
393 flags
= remote_fileio_oflags_to_host (num
);
394 /* 3. Parameter: open mode */
395 if (remote_fileio_extract_int (&buf
, &num
))
397 remote_fileio_ioerror (remote
);
400 mode
= remote_fileio_mode_to_host (num
, 1);
402 /* Request pathname. */
403 pathname
= (char *) alloca (length
);
404 if (target_read_memory (ptrval
, (gdb_byte
*) pathname
, length
) != 0)
406 remote_fileio_ioerror (remote
);
410 /* Check if pathname exists and is not a regular file or directory. If so,
411 return an appropriate error code. Same for trying to open directories
413 if (!stat (pathname
, &st
))
415 if (!S_ISREG (st
.st_mode
) && !S_ISDIR (st
.st_mode
))
417 remote_fileio_reply (remote
, -1, FILEIO_ENODEV
);
420 if (S_ISDIR (st
.st_mode
)
421 && ((flags
& O_WRONLY
) == O_WRONLY
|| (flags
& O_RDWR
) == O_RDWR
))
423 remote_fileio_reply (remote
, -1, FILEIO_EISDIR
);
428 fd
= gdb_open_cloexec (pathname
, flags
, mode
);
431 remote_fileio_return_errno (remote
, -1);
435 fd
= remote_fileio_fd_to_targetfd (fd
);
436 remote_fileio_return_success (remote
, fd
);
440 remote_fileio_func_close (remote_target
*remote
, char *buf
)
445 /* Parameter: file descriptor */
446 if (remote_fileio_extract_int (&buf
, &num
))
448 remote_fileio_ioerror (remote
);
451 fd
= remote_fileio_map_fd ((int) num
);
452 if (fd
== FIO_FD_INVALID
)
454 remote_fileio_badfd (remote
);
458 if (fd
!= FIO_FD_CONSOLE_IN
&& fd
!= FIO_FD_CONSOLE_OUT
&& close (fd
))
459 remote_fileio_return_errno (remote
, -1);
460 remote_fileio_close_target_fd ((int) num
);
461 remote_fileio_return_success (remote
, 0);
465 remote_fileio_func_read (remote_target
*remote
, char *buf
)
473 off_t old_offset
, new_offset
;
475 /* 1. Parameter: file descriptor */
476 if (remote_fileio_extract_int (&buf
, &target_fd
))
478 remote_fileio_ioerror (remote
);
481 fd
= remote_fileio_map_fd ((int) target_fd
);
482 if (fd
== FIO_FD_INVALID
)
484 remote_fileio_badfd (remote
);
487 /* 2. Parameter: buffer pointer */
488 if (remote_fileio_extract_long (&buf
, &lnum
))
490 remote_fileio_ioerror (remote
);
493 ptrval
= (CORE_ADDR
) lnum
;
494 /* 3. Parameter: buffer length */
495 if (remote_fileio_extract_int (&buf
, &num
))
497 remote_fileio_ioerror (remote
);
500 length
= (size_t) num
;
504 case FIO_FD_CONSOLE_OUT
:
505 remote_fileio_badfd (remote
);
507 case FIO_FD_CONSOLE_IN
:
509 static char *remaining_buf
= NULL
;
510 static int remaining_length
= 0;
512 buffer
= (gdb_byte
*) xmalloc (16384);
515 if (remaining_length
> length
)
517 memcpy (buffer
, remaining_buf
, length
);
518 memmove (remaining_buf
, remaining_buf
+ length
,
519 remaining_length
- length
);
520 remaining_length
-= length
;
525 memcpy (buffer
, remaining_buf
, remaining_length
);
526 xfree (remaining_buf
);
527 remaining_buf
= NULL
;
528 ret
= remaining_length
;
533 /* Windows (at least XP and Server 2003) has difficulty
534 with large reads from consoles. If a handle is
535 backed by a real console device, overly large reads
536 from the handle will fail and set errno == ENOMEM.
537 On a Windows Server 2003 system where I tested,
538 reading 26608 bytes from the console was OK, but
539 anything above 26609 bytes would fail. The limit has
540 been observed to vary on different systems. So, we
541 limit this read to something smaller than that - by a
542 safe margin, in case the limit depends on system
543 resources or version. */
544 ret
= ui_file_read (gdb_stdtargin
, (char *) buffer
, 16383);
545 if (ret
> 0 && (size_t)ret
> length
)
547 remaining_buf
= (char *) xmalloc (ret
- length
);
548 remaining_length
= ret
- length
;
549 memcpy (remaining_buf
, buffer
+ length
, remaining_length
);
556 buffer
= (gdb_byte
*) xmalloc (length
);
557 /* POSIX defines EINTR behaviour of read in a weird way. It's allowed
558 for read() to return -1 even if "some" bytes have been read. It
559 has been corrected in SUSv2 but that doesn't help us much...
560 Therefore a complete solution must check how many bytes have been
561 read on EINTR to return a more reliable value to the target */
562 old_offset
= lseek (fd
, 0, SEEK_CUR
);
563 ret
= read (fd
, buffer
, length
);
564 if (ret
< 0 && errno
== EINTR
)
566 new_offset
= lseek (fd
, 0, SEEK_CUR
);
567 /* If some data has been read, return the number of bytes read.
568 The Ctrl-C flag is set in remote_fileio_reply() anyway. */
569 if (old_offset
!= new_offset
)
570 ret
= new_offset
- old_offset
;
577 errno
= target_write_memory (ptrval
, buffer
, ret
);
583 remote_fileio_return_errno (remote
, -1);
585 remote_fileio_return_success (remote
, ret
);
591 remote_fileio_func_write (remote_target
*remote
, char *buf
)
600 /* 1. Parameter: file descriptor */
601 if (remote_fileio_extract_int (&buf
, &target_fd
))
603 remote_fileio_ioerror (remote
);
606 fd
= remote_fileio_map_fd ((int) target_fd
);
607 if (fd
== FIO_FD_INVALID
)
609 remote_fileio_badfd (remote
);
612 /* 2. Parameter: buffer pointer */
613 if (remote_fileio_extract_long (&buf
, &lnum
))
615 remote_fileio_ioerror (remote
);
618 ptrval
= (CORE_ADDR
) lnum
;
619 /* 3. Parameter: buffer length */
620 if (remote_fileio_extract_int (&buf
, &num
))
622 remote_fileio_ioerror (remote
);
625 length
= (size_t) num
;
627 buffer
= (gdb_byte
*) xmalloc (length
);
628 if (target_read_memory (ptrval
, buffer
, length
) != 0)
631 remote_fileio_ioerror (remote
);
637 case FIO_FD_CONSOLE_IN
:
638 remote_fileio_badfd (remote
);
641 case FIO_FD_CONSOLE_OUT
:
642 ui_file_write (target_fd
== 1 ? gdb_stdtarg
: gdb_stdtargerr
,
643 (char *) buffer
, length
);
644 gdb_flush (target_fd
== 1 ? gdb_stdtarg
: gdb_stdtargerr
);
648 ret
= write (fd
, buffer
, length
);
649 if (ret
< 0 && errno
== EACCES
)
650 errno
= EBADF
; /* Cygwin returns EACCESS when writing to a
656 remote_fileio_return_errno (remote
, -1);
658 remote_fileio_return_success (remote
, ret
);
664 remote_fileio_func_lseek (remote_target
*remote
, char *buf
)
671 /* 1. Parameter: file descriptor */
672 if (remote_fileio_extract_int (&buf
, &num
))
674 remote_fileio_ioerror (remote
);
677 fd
= remote_fileio_map_fd ((int) num
);
678 if (fd
== FIO_FD_INVALID
)
680 remote_fileio_badfd (remote
);
683 else if (fd
== FIO_FD_CONSOLE_IN
|| fd
== FIO_FD_CONSOLE_OUT
)
685 remote_fileio_reply (remote
, -1, FILEIO_ESPIPE
);
689 /* 2. Parameter: offset */
690 if (remote_fileio_extract_long (&buf
, &lnum
))
692 remote_fileio_ioerror (remote
);
695 offset
= (off_t
) lnum
;
696 /* 3. Parameter: flag */
697 if (remote_fileio_extract_int (&buf
, &num
))
699 remote_fileio_ioerror (remote
);
702 if (remote_fileio_seek_flag_to_host (num
, &flag
))
704 remote_fileio_reply (remote
, -1, FILEIO_EINVAL
);
708 ret
= lseek (fd
, offset
, flag
);
710 if (ret
== (off_t
) -1)
711 remote_fileio_return_errno (remote
, -1);
713 remote_fileio_return_success (remote
, ret
);
717 remote_fileio_func_rename (remote_target
*remote
, char *buf
)
719 CORE_ADDR old_ptr
, new_ptr
;
720 int old_len
, new_len
;
721 char *oldpath
, *newpath
;
723 struct stat ost
, nst
;
725 /* 1. Parameter: Ptr to oldpath / length incl. trailing zero */
726 if (remote_fileio_extract_ptr_w_len (&buf
, &old_ptr
, &old_len
))
728 remote_fileio_ioerror (remote
);
732 /* 2. Parameter: Ptr to newpath / length incl. trailing zero */
733 if (remote_fileio_extract_ptr_w_len (&buf
, &new_ptr
, &new_len
))
735 remote_fileio_ioerror (remote
);
739 /* Request oldpath using 'm' packet */
740 oldpath
= (char *) alloca (old_len
);
741 if (target_read_memory (old_ptr
, (gdb_byte
*) oldpath
, old_len
) != 0)
743 remote_fileio_ioerror (remote
);
747 /* Request newpath using 'm' packet */
748 newpath
= (char *) alloca (new_len
);
749 if (target_read_memory (new_ptr
, (gdb_byte
*) newpath
, new_len
) != 0)
751 remote_fileio_ioerror (remote
);
755 /* Only operate on regular files and directories. */
756 of
= stat (oldpath
, &ost
);
757 nf
= stat (newpath
, &nst
);
758 if ((!of
&& !S_ISREG (ost
.st_mode
) && !S_ISDIR (ost
.st_mode
))
759 || (!nf
&& !S_ISREG (nst
.st_mode
) && !S_ISDIR (nst
.st_mode
)))
761 remote_fileio_reply (remote
, -1, FILEIO_EACCES
);
765 ret
= rename (oldpath
, newpath
);
769 /* Special case: newpath is a non-empty directory. Some systems
770 return ENOTEMPTY, some return EEXIST. We coerce that to be
772 if (errno
== ENOTEMPTY
)
775 /* Workaround some Cygwin problems with correct errnos. */
778 if (!of
&& !nf
&& S_ISDIR (nst
.st_mode
))
780 if (S_ISREG (ost
.st_mode
))
784 char oldfullpath
[PATH_MAX
];
785 char newfullpath
[PATH_MAX
];
788 cygwin_conv_path (CCP_WIN_A_TO_POSIX
, oldpath
, oldfullpath
,
790 cygwin_conv_path (CCP_WIN_A_TO_POSIX
, newpath
, newfullpath
,
792 len
= strlen (oldfullpath
);
793 if (IS_DIR_SEPARATOR (newfullpath
[len
])
794 && !filename_ncmp (oldfullpath
, newfullpath
, len
))
803 remote_fileio_return_errno (remote
, -1);
806 remote_fileio_return_success (remote
, ret
);
810 remote_fileio_func_unlink (remote_target
*remote
, char *buf
)
818 /* Parameter: Ptr to pathname / length incl. trailing zero */
819 if (remote_fileio_extract_ptr_w_len (&buf
, &ptrval
, &length
))
821 remote_fileio_ioerror (remote
);
824 /* Request pathname using 'm' packet */
825 pathname
= (char *) alloca (length
);
826 if (target_read_memory (ptrval
, (gdb_byte
*) pathname
, length
) != 0)
828 remote_fileio_ioerror (remote
);
832 /* Only operate on regular files (and directories, which allows to return
833 the correct return code). */
834 if (!stat (pathname
, &st
) && !S_ISREG (st
.st_mode
) && !S_ISDIR (st
.st_mode
))
836 remote_fileio_reply (remote
, -1, FILEIO_ENODEV
);
840 ret
= unlink (pathname
);
843 remote_fileio_return_errno (remote
, -1);
845 remote_fileio_return_success (remote
, ret
);
849 remote_fileio_func_stat (remote_target
*remote
, char *buf
)
851 CORE_ADDR statptr
, nameptr
;
858 /* 1. Parameter: Ptr to pathname / length incl. trailing zero */
859 if (remote_fileio_extract_ptr_w_len (&buf
, &nameptr
, &namelength
))
861 remote_fileio_ioerror (remote
);
865 /* 2. Parameter: Ptr to struct stat */
866 if (remote_fileio_extract_long (&buf
, &lnum
))
868 remote_fileio_ioerror (remote
);
871 statptr
= (CORE_ADDR
) lnum
;
873 /* Request pathname using 'm' packet */
874 pathname
= (char *) alloca (namelength
);
875 if (target_read_memory (nameptr
, (gdb_byte
*) pathname
, namelength
) != 0)
877 remote_fileio_ioerror (remote
);
881 ret
= stat (pathname
, &st
);
885 remote_fileio_return_errno (remote
, -1);
888 /* Only operate on regular files and directories. */
889 if (!ret
&& !S_ISREG (st
.st_mode
) && !S_ISDIR (st
.st_mode
))
891 remote_fileio_reply (remote
, -1, FILEIO_EACCES
);
896 host_to_fileio_stat (&st
, &fst
);
897 host_to_fileio_uint (0, fst
.fst_dev
);
899 errno
= target_write_memory (statptr
, (gdb_byte
*) &fst
, sizeof fst
);
902 remote_fileio_return_errno (remote
, -1);
906 remote_fileio_return_success (remote
, ret
);
910 remote_fileio_func_fstat (remote_target
*remote
, char *buf
)
920 /* 1. Parameter: file descriptor */
921 if (remote_fileio_extract_int (&buf
, &target_fd
))
923 remote_fileio_ioerror (remote
);
926 fd
= remote_fileio_map_fd ((int) target_fd
);
927 if (fd
== FIO_FD_INVALID
)
929 remote_fileio_badfd (remote
);
932 /* 2. Parameter: Ptr to struct stat */
933 if (remote_fileio_extract_long (&buf
, &lnum
))
935 remote_fileio_ioerror (remote
);
938 ptrval
= (CORE_ADDR
) lnum
;
940 if (fd
== FIO_FD_CONSOLE_IN
|| fd
== FIO_FD_CONSOLE_OUT
)
942 host_to_fileio_uint (1, fst
.fst_dev
);
943 memset (&st
, 0, sizeof (st
));
944 st
.st_mode
= S_IFCHR
| (fd
== FIO_FD_CONSOLE_IN
? S_IRUSR
: S_IWUSR
);
947 st
.st_uid
= getuid ();
950 st
.st_gid
= getgid ();
952 #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
955 #if HAVE_STRUCT_STAT_ST_BLOCKS
958 if (!gettimeofday (&tv
, NULL
))
959 st
.st_atime
= st
.st_mtime
= st
.st_ctime
= tv
.tv_sec
;
961 st
.st_atime
= st
.st_mtime
= st
.st_ctime
= (time_t) 0;
965 ret
= fstat (fd
, &st
);
969 remote_fileio_return_errno (remote
, -1);
974 host_to_fileio_stat (&st
, &fst
);
976 errno
= target_write_memory (ptrval
, (gdb_byte
*) &fst
, sizeof fst
);
979 remote_fileio_return_errno (remote
, -1);
983 remote_fileio_return_success (remote
, ret
);
987 remote_fileio_func_gettimeofday (remote_target
*remote
, char *buf
)
993 struct fio_timeval ftv
;
995 /* 1. Parameter: struct timeval pointer */
996 if (remote_fileio_extract_long (&buf
, &lnum
))
998 remote_fileio_ioerror (remote
);
1001 ptrval
= (CORE_ADDR
) lnum
;
1002 /* 2. Parameter: some pointer value... */
1003 if (remote_fileio_extract_long (&buf
, &lnum
))
1005 remote_fileio_ioerror (remote
);
1008 /* ...which has to be NULL. */
1011 remote_fileio_reply (remote
, -1, FILEIO_EINVAL
);
1015 ret
= gettimeofday (&tv
, NULL
);
1019 remote_fileio_return_errno (remote
, -1);
1025 remote_fileio_to_fio_timeval (&tv
, &ftv
);
1027 errno
= target_write_memory (ptrval
, (gdb_byte
*) &ftv
, sizeof ftv
);
1030 remote_fileio_return_errno (remote
, -1);
1034 remote_fileio_return_success (remote
, ret
);
1038 remote_fileio_func_isatty (remote_target
*remote
, char *buf
)
1043 /* Parameter: file descriptor */
1044 if (remote_fileio_extract_int (&buf
, &target_fd
))
1046 remote_fileio_ioerror (remote
);
1049 fd
= remote_fileio_map_fd ((int) target_fd
);
1050 int ret
= fd
== FIO_FD_CONSOLE_IN
|| fd
== FIO_FD_CONSOLE_OUT
? 1 : 0;
1051 remote_fileio_return_success (remote
, ret
);
1055 remote_fileio_func_system (remote_target
*remote
, char *buf
)
1059 char *cmdline
= NULL
;
1061 /* Parameter: Ptr to commandline / length incl. trailing zero */
1062 if (remote_fileio_extract_ptr_w_len (&buf
, &ptrval
, &length
))
1064 remote_fileio_ioerror (remote
);
1070 /* Request commandline using 'm' packet */
1071 cmdline
= (char *) alloca (length
);
1072 if (target_read_memory (ptrval
, (gdb_byte
*) cmdline
, length
) != 0)
1074 remote_fileio_ioerror (remote
);
1079 /* Check if system(3) has been explicitly allowed using the
1080 `set remote system-call-allowed 1' command. If length is 0,
1081 indicating a NULL parameter to the system call, return zero to
1082 indicate a shell is not available. Otherwise fail with EPERM. */
1083 if (!remote_fio_system_call_allowed
)
1086 remote_fileio_return_success (remote
, 0);
1088 remote_fileio_reply (remote
, -1, FILEIO_EPERM
);
1092 ret
= system (cmdline
);
1095 remote_fileio_return_success (remote
, ret
);
1097 remote_fileio_return_errno (remote
, -1);
1099 remote_fileio_return_success (remote
, WEXITSTATUS (ret
));
1104 void (*func
)(remote_target
*remote
, char *);
1105 } remote_fio_func_map
[] = {
1106 { "open", remote_fileio_func_open
},
1107 { "close", remote_fileio_func_close
},
1108 { "read", remote_fileio_func_read
},
1109 { "write", remote_fileio_func_write
},
1110 { "lseek", remote_fileio_func_lseek
},
1111 { "rename", remote_fileio_func_rename
},
1112 { "unlink", remote_fileio_func_unlink
},
1113 { "stat", remote_fileio_func_stat
},
1114 { "fstat", remote_fileio_func_fstat
},
1115 { "gettimeofday", remote_fileio_func_gettimeofday
},
1116 { "isatty", remote_fileio_func_isatty
},
1117 { "system", remote_fileio_func_system
},
1122 do_remote_fileio_request (remote_target
*remote
, char *buf
)
1127 quit_handler
= remote_fileio_quit_handler
;
1129 c
= strchr (++buf
, ',');
1133 c
= strchr (buf
, '\0');
1134 for (idx
= 0; remote_fio_func_map
[idx
].name
; ++idx
)
1135 if (!strcmp (remote_fio_func_map
[idx
].name
, buf
))
1137 if (!remote_fio_func_map
[idx
].name
)
1138 remote_fileio_reply (remote
, -1, FILEIO_ENOSYS
);
1140 remote_fio_func_map
[idx
].func (remote
, c
);
1143 /* Close any open descriptors, and reinitialize the file mapping. */
1146 remote_fileio_reset (void)
1150 for (ix
= 0; ix
!= remote_fio_data
.fd_map_size
; ix
++)
1152 int fd
= remote_fio_data
.fd_map
[ix
];
1157 if (remote_fio_data
.fd_map
)
1159 xfree (remote_fio_data
.fd_map
);
1160 remote_fio_data
.fd_map
= NULL
;
1161 remote_fio_data
.fd_map_size
= 0;
1165 /* Handle a file I/O request. BUF points to the packet containing the
1166 request. CTRLC_PENDING_P should be nonzero if the target has not
1167 acknowledged the Ctrl-C sent asynchronously earlier. */
1170 remote_fileio_request (remote_target
*remote
, char *buf
, int ctrlc_pending_p
)
1172 /* Save the previous quit handler, so we can restore it. No need
1173 for a cleanup since we catch all exceptions below. Note that the
1174 quit handler is also restored by remote_fileio_reply just before
1175 pushing a packet. */
1176 remote_fileio_o_quit_handler
= quit_handler
;
1178 if (ctrlc_pending_p
)
1180 /* If the target hasn't responded to the Ctrl-C sent
1181 asynchronously earlier, take this opportunity to send the
1182 Ctrl-C synchronously. */
1184 remote_fileio_reply (remote
, -1, FILEIO_EINTR
);
1190 do_remote_fileio_request (remote
, buf
);
1192 catch (const gdb_exception
&ex
)
1194 if (ex
.reason
== RETURN_QUIT
)
1195 remote_fileio_reply (remote
, -1, FILEIO_EINTR
);
1197 remote_fileio_reply (remote
, -1, FILEIO_EIO
);
1201 quit_handler
= remote_fileio_o_quit_handler
;
1205 /* Unpack an fio_uint_t. */
1208 remote_fileio_to_host_uint (fio_uint_t fnum
)
1210 return extract_unsigned_integer ((gdb_byte
*) fnum
, 4,
1214 /* Unpack an fio_ulong_t. */
1217 remote_fileio_to_host_ulong (fio_ulong_t fnum
)
1219 return extract_unsigned_integer ((gdb_byte
*) fnum
, 8,
1223 /* Unpack an fio_mode_t. */
1226 remote_fileio_to_host_mode (fio_mode_t fnum
)
1228 return remote_fileio_mode_to_host (remote_fileio_to_host_uint (fnum
),
1232 /* Unpack an fio_time_t. */
1235 remote_fileio_to_host_time (fio_time_t fnum
)
1237 return remote_fileio_to_host_uint (fnum
);
1241 /* See remote-fileio.h. */
1244 remote_fileio_to_host_stat (struct fio_stat
*fst
, struct stat
*st
)
1246 memset (st
, 0, sizeof (struct stat
));
1248 st
->st_dev
= remote_fileio_to_host_uint (fst
->fst_dev
);
1249 st
->st_ino
= remote_fileio_to_host_uint (fst
->fst_ino
);
1250 st
->st_mode
= remote_fileio_to_host_mode (fst
->fst_mode
);
1251 st
->st_nlink
= remote_fileio_to_host_uint (fst
->fst_nlink
);
1252 st
->st_uid
= remote_fileio_to_host_uint (fst
->fst_uid
);
1253 st
->st_gid
= remote_fileio_to_host_uint (fst
->fst_gid
);
1254 st
->st_rdev
= remote_fileio_to_host_uint (fst
->fst_rdev
);
1255 st
->st_size
= remote_fileio_to_host_ulong (fst
->fst_size
);
1256 #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
1257 st
->st_blksize
= remote_fileio_to_host_ulong (fst
->fst_blksize
);
1259 #if HAVE_STRUCT_STAT_ST_BLOCKS
1260 st
->st_blocks
= remote_fileio_to_host_ulong (fst
->fst_blocks
);
1262 st
->st_atime
= remote_fileio_to_host_time (fst
->fst_atime
);
1263 st
->st_mtime
= remote_fileio_to_host_time (fst
->fst_mtime
);
1264 st
->st_ctime
= remote_fileio_to_host_time (fst
->fst_ctime
);
1269 set_system_call_allowed (const char *args
, int from_tty
)
1274 int val
= strtoul (args
, &arg_end
, 10);
1276 if (*args
&& *arg_end
== '\0')
1278 remote_fio_system_call_allowed
= !!val
;
1282 error (_("Illegal argument for \"set remote system-call-allowed\" command"));
1286 show_system_call_allowed (const char *args
, int from_tty
)
1289 error (_("Garbage after \"show remote "
1290 "system-call-allowed\" command: `%s'"), args
);
1291 printf_unfiltered ("Calling host system(3) call from target is %sallowed\n",
1292 remote_fio_system_call_allowed
? "" : "not ");
1296 initialize_remote_fileio (struct cmd_list_element
*remote_set_cmdlist
,
1297 struct cmd_list_element
*remote_show_cmdlist
)
1299 add_cmd ("system-call-allowed", no_class
,
1300 set_system_call_allowed
,
1301 _("Set if the host system(3) call is allowed for the target."),
1302 &remote_set_cmdlist
);
1303 add_cmd ("system-call-allowed", no_class
,
1304 show_system_call_allowed
,
1305 _("Show if the host system(3) call is allowed for the target."),
1306 &remote_show_cmdlist
);