1 /* Remote File-I/O communications
3 Copyright (C) 2003-2016 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. */
27 #include "remote-fileio.h"
28 #include "event-loop.h"
30 #include "filenames.h"
31 #include "filestuff.h"
34 #include "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 static int remote_fio_ctrl_c_flag
= 0;
303 #if defined (HAVE_SIGACTION) && defined (SA_RESTART)
304 static struct sigaction remote_fio_sa
;
305 static struct sigaction remote_fio_osa
;
307 static void (*remote_fio_ofunc
)(int);
311 remote_fileio_sig_init (void)
313 #if defined (HAVE_SIGACTION) && defined (SA_RESTART)
314 remote_fio_sa
.sa_handler
= SIG_IGN
;
315 sigemptyset (&remote_fio_sa
.sa_mask
);
316 remote_fio_sa
.sa_flags
= 0;
317 sigaction (SIGINT
, &remote_fio_sa
, &remote_fio_osa
);
319 remote_fio_ofunc
= signal (SIGINT
, SIG_IGN
);
324 remote_fileio_sig_set (void (*sigint_func
)(int))
326 #if defined (HAVE_SIGACTION) && defined (SA_RESTART)
327 remote_fio_sa
.sa_handler
= sigint_func
;
328 sigemptyset (&remote_fio_sa
.sa_mask
);
329 remote_fio_sa
.sa_flags
= 0;
330 sigaction (SIGINT
, &remote_fio_sa
, NULL
);
332 signal (SIGINT
, sigint_func
);
337 remote_fileio_sig_exit (void)
339 #if defined (HAVE_SIGACTION) && defined (SA_RESTART)
340 sigaction (SIGINT
, &remote_fio_osa
, NULL
);
342 signal (SIGINT
, remote_fio_ofunc
);
347 remote_fileio_ctrl_c_signal_handler (int signo
)
349 remote_fileio_sig_set (remote_fileio_ctrl_c_signal_handler
);
350 remote_fio_ctrl_c_flag
= 1;
351 /* Wake up interruptible_select. */
352 quit_serial_event_set ();
356 remote_fileio_reply (int retcode
, int error
)
360 remote_fileio_sig_set (SIG_IGN
);
367 sprintf (buf
+ strlen (buf
), "%x", retcode
);
368 if (error
|| remote_fio_ctrl_c_flag
)
370 if (error
&& remote_fio_ctrl_c_flag
)
371 error
= FILEIO_EINTR
;
377 sprintf (buf
+ strlen (buf
), ",%x", error
);
378 if (remote_fio_ctrl_c_flag
)
381 remote_fio_ctrl_c_flag
= 0;
382 remote_fileio_sig_set (remote_fileio_ctrl_c_signal_handler
);
387 remote_fileio_ioerror (void)
389 remote_fileio_reply (-1, FILEIO_EIO
);
393 remote_fileio_badfd (void)
395 remote_fileio_reply (-1, FILEIO_EBADF
);
399 remote_fileio_return_errno (int retcode
)
401 remote_fileio_reply (retcode
, retcode
< 0
402 ? host_to_fileio_error (errno
) : 0);
406 remote_fileio_return_success (int retcode
)
408 remote_fileio_reply (retcode
, 0);
412 remote_fileio_func_open (char *buf
)
422 /* 1. Parameter: Ptr to pathname / length incl. trailing zero. */
423 if (remote_fileio_extract_ptr_w_len (&buf
, &ptrval
, &length
))
425 remote_fileio_ioerror ();
428 /* 2. Parameter: open flags */
429 if (remote_fileio_extract_int (&buf
, &num
))
431 remote_fileio_ioerror ();
434 flags
= remote_fileio_oflags_to_host (num
);
435 /* 3. Parameter: open mode */
436 if (remote_fileio_extract_int (&buf
, &num
))
438 remote_fileio_ioerror ();
441 mode
= remote_fileio_mode_to_host (num
, 1);
443 /* Request pathname. */
444 pathname
= (char *) alloca (length
);
445 if (target_read_memory (ptrval
, (gdb_byte
*) pathname
, length
) != 0)
447 remote_fileio_ioerror ();
451 /* Check if pathname exists and is not a regular file or directory. If so,
452 return an appropriate error code. Same for trying to open directories
454 if (!stat (pathname
, &st
))
456 if (!S_ISREG (st
.st_mode
) && !S_ISDIR (st
.st_mode
))
458 remote_fileio_reply (-1, FILEIO_ENODEV
);
461 if (S_ISDIR (st
.st_mode
)
462 && ((flags
& O_WRONLY
) == O_WRONLY
|| (flags
& O_RDWR
) == O_RDWR
))
464 remote_fileio_reply (-1, FILEIO_EISDIR
);
469 fd
= gdb_open_cloexec (pathname
, flags
, mode
);
472 remote_fileio_return_errno (-1);
476 fd
= remote_fileio_fd_to_targetfd (fd
);
477 remote_fileio_return_success (fd
);
481 remote_fileio_func_close (char *buf
)
486 /* Parameter: file descriptor */
487 if (remote_fileio_extract_int (&buf
, &num
))
489 remote_fileio_ioerror ();
492 fd
= remote_fileio_map_fd ((int) num
);
493 if (fd
== FIO_FD_INVALID
)
495 remote_fileio_badfd ();
499 if (fd
!= FIO_FD_CONSOLE_IN
&& fd
!= FIO_FD_CONSOLE_OUT
&& close (fd
))
500 remote_fileio_return_errno (-1);
501 remote_fileio_close_target_fd ((int) num
);
502 remote_fileio_return_success (0);
506 remote_fileio_func_read (char *buf
)
514 off_t old_offset
, new_offset
;
516 /* 1. Parameter: file descriptor */
517 if (remote_fileio_extract_int (&buf
, &target_fd
))
519 remote_fileio_ioerror ();
522 fd
= remote_fileio_map_fd ((int) target_fd
);
523 if (fd
== FIO_FD_INVALID
)
525 remote_fileio_badfd ();
528 /* 2. Parameter: buffer pointer */
529 if (remote_fileio_extract_long (&buf
, &lnum
))
531 remote_fileio_ioerror ();
534 ptrval
= (CORE_ADDR
) lnum
;
535 /* 3. Parameter: buffer length */
536 if (remote_fileio_extract_int (&buf
, &num
))
538 remote_fileio_ioerror ();
541 length
= (size_t) num
;
545 case FIO_FD_CONSOLE_OUT
:
546 remote_fileio_badfd ();
548 case FIO_FD_CONSOLE_IN
:
550 static char *remaining_buf
= NULL
;
551 static int remaining_length
= 0;
553 buffer
= (gdb_byte
*) xmalloc (16384);
556 if (remaining_length
> length
)
558 memcpy (buffer
, remaining_buf
, length
);
559 memmove (remaining_buf
, remaining_buf
+ length
,
560 remaining_length
- length
);
561 remaining_length
-= length
;
566 memcpy (buffer
, remaining_buf
, remaining_length
);
567 xfree (remaining_buf
);
568 remaining_buf
= NULL
;
569 ret
= remaining_length
;
574 /* Windows (at least XP and Server 2003) has difficulty
575 with large reads from consoles. If a handle is
576 backed by a real console device, overly large reads
577 from the handle will fail and set errno == ENOMEM.
578 On a Windows Server 2003 system where I tested,
579 reading 26608 bytes from the console was OK, but
580 anything above 26609 bytes would fail. The limit has
581 been observed to vary on different systems. So, we
582 limit this read to something smaller than that - by a
583 safe margin, in case the limit depends on system
584 resources or version. */
585 ret
= ui_file_read (gdb_stdtargin
, (char *) buffer
, 16383);
586 if (ret
> 0 && (size_t)ret
> length
)
588 remaining_buf
= (char *) xmalloc (ret
- length
);
589 remaining_length
= ret
- length
;
590 memcpy (remaining_buf
, buffer
+ length
, remaining_length
);
597 buffer
= (gdb_byte
*) xmalloc (length
);
598 /* POSIX defines EINTR behaviour of read in a weird way. It's allowed
599 for read() to return -1 even if "some" bytes have been read. It
600 has been corrected in SUSv2 but that doesn't help us much...
601 Therefore a complete solution must check how many bytes have been
602 read on EINTR to return a more reliable value to the target */
603 old_offset
= lseek (fd
, 0, SEEK_CUR
);
604 ret
= read (fd
, buffer
, length
);
605 if (ret
< 0 && errno
== EINTR
)
607 new_offset
= lseek (fd
, 0, SEEK_CUR
);
608 /* If some data has been read, return the number of bytes read.
609 The Ctrl-C flag is set in remote_fileio_reply() anyway. */
610 if (old_offset
!= new_offset
)
611 ret
= new_offset
- old_offset
;
618 errno
= target_write_memory (ptrval
, buffer
, ret
);
624 remote_fileio_return_errno (-1);
626 remote_fileio_return_success (ret
);
632 remote_fileio_func_write (char *buf
)
641 /* 1. Parameter: file descriptor */
642 if (remote_fileio_extract_int (&buf
, &target_fd
))
644 remote_fileio_ioerror ();
647 fd
= remote_fileio_map_fd ((int) target_fd
);
648 if (fd
== FIO_FD_INVALID
)
650 remote_fileio_badfd ();
653 /* 2. Parameter: buffer pointer */
654 if (remote_fileio_extract_long (&buf
, &lnum
))
656 remote_fileio_ioerror ();
659 ptrval
= (CORE_ADDR
) lnum
;
660 /* 3. Parameter: buffer length */
661 if (remote_fileio_extract_int (&buf
, &num
))
663 remote_fileio_ioerror ();
666 length
= (size_t) num
;
668 buffer
= (gdb_byte
*) xmalloc (length
);
669 if (target_read_memory (ptrval
, buffer
, length
) != 0)
672 remote_fileio_ioerror ();
678 case FIO_FD_CONSOLE_IN
:
679 remote_fileio_badfd ();
682 case FIO_FD_CONSOLE_OUT
:
683 ui_file_write (target_fd
== 1 ? gdb_stdtarg
: gdb_stdtargerr
,
684 (char *) buffer
, length
);
685 gdb_flush (target_fd
== 1 ? gdb_stdtarg
: gdb_stdtargerr
);
689 ret
= write (fd
, buffer
, length
);
690 if (ret
< 0 && errno
== EACCES
)
691 errno
= EBADF
; /* Cygwin returns EACCESS when writing to a
697 remote_fileio_return_errno (-1);
699 remote_fileio_return_success (ret
);
705 remote_fileio_func_lseek (char *buf
)
712 /* 1. Parameter: file descriptor */
713 if (remote_fileio_extract_int (&buf
, &num
))
715 remote_fileio_ioerror ();
718 fd
= remote_fileio_map_fd ((int) num
);
719 if (fd
== FIO_FD_INVALID
)
721 remote_fileio_badfd ();
724 else if (fd
== FIO_FD_CONSOLE_IN
|| fd
== FIO_FD_CONSOLE_OUT
)
726 remote_fileio_reply (-1, FILEIO_ESPIPE
);
730 /* 2. Parameter: offset */
731 if (remote_fileio_extract_long (&buf
, &lnum
))
733 remote_fileio_ioerror ();
736 offset
= (off_t
) lnum
;
737 /* 3. Parameter: flag */
738 if (remote_fileio_extract_int (&buf
, &num
))
740 remote_fileio_ioerror ();
743 if (remote_fileio_seek_flag_to_host (num
, &flag
))
745 remote_fileio_reply (-1, FILEIO_EINVAL
);
749 ret
= lseek (fd
, offset
, flag
);
751 if (ret
== (off_t
) -1)
752 remote_fileio_return_errno (-1);
754 remote_fileio_return_success (ret
);
758 remote_fileio_func_rename (char *buf
)
760 CORE_ADDR old_ptr
, new_ptr
;
761 int old_len
, new_len
;
762 char *oldpath
, *newpath
;
764 struct stat ost
, nst
;
766 /* 1. Parameter: Ptr to oldpath / length incl. trailing zero */
767 if (remote_fileio_extract_ptr_w_len (&buf
, &old_ptr
, &old_len
))
769 remote_fileio_ioerror ();
773 /* 2. Parameter: Ptr to newpath / length incl. trailing zero */
774 if (remote_fileio_extract_ptr_w_len (&buf
, &new_ptr
, &new_len
))
776 remote_fileio_ioerror ();
780 /* Request oldpath using 'm' packet */
781 oldpath
= (char *) alloca (old_len
);
782 if (target_read_memory (old_ptr
, (gdb_byte
*) oldpath
, old_len
) != 0)
784 remote_fileio_ioerror ();
788 /* Request newpath using 'm' packet */
789 newpath
= (char *) alloca (new_len
);
790 if (target_read_memory (new_ptr
, (gdb_byte
*) newpath
, new_len
) != 0)
792 remote_fileio_ioerror ();
796 /* Only operate on regular files and directories. */
797 of
= stat (oldpath
, &ost
);
798 nf
= stat (newpath
, &nst
);
799 if ((!of
&& !S_ISREG (ost
.st_mode
) && !S_ISDIR (ost
.st_mode
))
800 || (!nf
&& !S_ISREG (nst
.st_mode
) && !S_ISDIR (nst
.st_mode
)))
802 remote_fileio_reply (-1, FILEIO_EACCES
);
806 ret
= rename (oldpath
, newpath
);
810 /* Special case: newpath is a non-empty directory. Some systems
811 return ENOTEMPTY, some return EEXIST. We coerce that to be
813 if (errno
== ENOTEMPTY
)
816 /* Workaround some Cygwin problems with correct errnos. */
819 if (!of
&& !nf
&& S_ISDIR (nst
.st_mode
))
821 if (S_ISREG (ost
.st_mode
))
825 char oldfullpath
[PATH_MAX
];
826 char newfullpath
[PATH_MAX
];
829 cygwin_conv_path (CCP_WIN_A_TO_POSIX
, oldpath
, oldfullpath
,
831 cygwin_conv_path (CCP_WIN_A_TO_POSIX
, newpath
, newfullpath
,
833 len
= strlen (oldfullpath
);
834 if (IS_DIR_SEPARATOR (newfullpath
[len
])
835 && !filename_ncmp (oldfullpath
, newfullpath
, len
))
844 remote_fileio_return_errno (-1);
847 remote_fileio_return_success (ret
);
851 remote_fileio_func_unlink (char *buf
)
859 /* Parameter: Ptr to pathname / length incl. trailing zero */
860 if (remote_fileio_extract_ptr_w_len (&buf
, &ptrval
, &length
))
862 remote_fileio_ioerror ();
865 /* Request pathname using 'm' packet */
866 pathname
= (char *) alloca (length
);
867 if (target_read_memory (ptrval
, (gdb_byte
*) pathname
, length
) != 0)
869 remote_fileio_ioerror ();
873 /* Only operate on regular files (and directories, which allows to return
874 the correct return code). */
875 if (!stat (pathname
, &st
) && !S_ISREG (st
.st_mode
) && !S_ISDIR (st
.st_mode
))
877 remote_fileio_reply (-1, FILEIO_ENODEV
);
881 ret
= unlink (pathname
);
884 remote_fileio_return_errno (-1);
886 remote_fileio_return_success (ret
);
890 remote_fileio_func_stat (char *buf
)
892 CORE_ADDR statptr
, nameptr
;
899 /* 1. Parameter: Ptr to pathname / length incl. trailing zero */
900 if (remote_fileio_extract_ptr_w_len (&buf
, &nameptr
, &namelength
))
902 remote_fileio_ioerror ();
906 /* 2. Parameter: Ptr to struct stat */
907 if (remote_fileio_extract_long (&buf
, &lnum
))
909 remote_fileio_ioerror ();
912 statptr
= (CORE_ADDR
) lnum
;
914 /* Request pathname using 'm' packet */
915 pathname
= (char *) alloca (namelength
);
916 if (target_read_memory (nameptr
, (gdb_byte
*) pathname
, namelength
) != 0)
918 remote_fileio_ioerror ();
922 ret
= stat (pathname
, &st
);
926 remote_fileio_return_errno (-1);
929 /* Only operate on regular files and directories. */
930 if (!ret
&& !S_ISREG (st
.st_mode
) && !S_ISDIR (st
.st_mode
))
932 remote_fileio_reply (-1, FILEIO_EACCES
);
937 host_to_fileio_stat (&st
, &fst
);
938 host_to_fileio_uint (0, fst
.fst_dev
);
940 errno
= target_write_memory (statptr
, (gdb_byte
*) &fst
, sizeof fst
);
943 remote_fileio_return_errno (-1);
947 remote_fileio_return_success (ret
);
951 remote_fileio_func_fstat (char *buf
)
961 /* 1. Parameter: file descriptor */
962 if (remote_fileio_extract_int (&buf
, &target_fd
))
964 remote_fileio_ioerror ();
967 fd
= remote_fileio_map_fd ((int) target_fd
);
968 if (fd
== FIO_FD_INVALID
)
970 remote_fileio_badfd ();
973 /* 2. Parameter: Ptr to struct stat */
974 if (remote_fileio_extract_long (&buf
, &lnum
))
976 remote_fileio_ioerror ();
979 ptrval
= (CORE_ADDR
) lnum
;
981 if (fd
== FIO_FD_CONSOLE_IN
|| fd
== FIO_FD_CONSOLE_OUT
)
983 host_to_fileio_uint (1, fst
.fst_dev
);
984 memset (&st
, 0, sizeof (st
));
985 st
.st_mode
= S_IFCHR
| (fd
== FIO_FD_CONSOLE_IN
? S_IRUSR
: S_IWUSR
);
988 st
.st_uid
= getuid ();
991 st
.st_gid
= getgid ();
993 #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
996 #if HAVE_STRUCT_STAT_ST_BLOCKS
999 if (!gettimeofday (&tv
, NULL
))
1000 st
.st_atime
= st
.st_mtime
= st
.st_ctime
= tv
.tv_sec
;
1002 st
.st_atime
= st
.st_mtime
= st
.st_ctime
= (time_t) 0;
1006 ret
= fstat (fd
, &st
);
1010 remote_fileio_return_errno (-1);
1015 host_to_fileio_stat (&st
, &fst
);
1017 errno
= target_write_memory (ptrval
, (gdb_byte
*) &fst
, sizeof fst
);
1020 remote_fileio_return_errno (-1);
1024 remote_fileio_return_success (ret
);
1028 remote_fileio_func_gettimeofday (char *buf
)
1034 struct fio_timeval ftv
;
1036 /* 1. Parameter: struct timeval pointer */
1037 if (remote_fileio_extract_long (&buf
, &lnum
))
1039 remote_fileio_ioerror ();
1042 ptrval
= (CORE_ADDR
) lnum
;
1043 /* 2. Parameter: some pointer value... */
1044 if (remote_fileio_extract_long (&buf
, &lnum
))
1046 remote_fileio_ioerror ();
1049 /* ...which has to be NULL. */
1052 remote_fileio_reply (-1, FILEIO_EINVAL
);
1056 ret
= gettimeofday (&tv
, NULL
);
1060 remote_fileio_return_errno (-1);
1066 remote_fileio_to_fio_timeval (&tv
, &ftv
);
1068 errno
= target_write_memory (ptrval
, (gdb_byte
*) &ftv
, sizeof ftv
);
1071 remote_fileio_return_errno (-1);
1075 remote_fileio_return_success (ret
);
1079 remote_fileio_func_isatty (char *buf
)
1084 /* Parameter: file descriptor */
1085 if (remote_fileio_extract_int (&buf
, &target_fd
))
1087 remote_fileio_ioerror ();
1090 fd
= remote_fileio_map_fd ((int) target_fd
);
1091 remote_fileio_return_success (fd
== FIO_FD_CONSOLE_IN
||
1092 fd
== FIO_FD_CONSOLE_OUT
? 1 : 0);
1096 remote_fileio_func_system (char *buf
)
1100 char *cmdline
= NULL
;
1102 /* Parameter: Ptr to commandline / length incl. trailing zero */
1103 if (remote_fileio_extract_ptr_w_len (&buf
, &ptrval
, &length
))
1105 remote_fileio_ioerror ();
1111 /* Request commandline using 'm' packet */
1112 cmdline
= (char *) alloca (length
);
1113 if (target_read_memory (ptrval
, (gdb_byte
*) cmdline
, length
) != 0)
1115 remote_fileio_ioerror ();
1120 /* Check if system(3) has been explicitely allowed using the
1121 `set remote system-call-allowed 1' command. If length is 0,
1122 indicating a NULL parameter to the system call, return zero to
1123 indicate a shell is not available. Otherwise fail with EPERM. */
1124 if (!remote_fio_system_call_allowed
)
1127 remote_fileio_return_success (0);
1129 remote_fileio_reply (-1, FILEIO_EPERM
);
1133 ret
= system (cmdline
);
1136 remote_fileio_return_success (ret
);
1138 remote_fileio_return_errno (-1);
1140 remote_fileio_return_success (WEXITSTATUS (ret
));
1145 void (*func
)(char *);
1146 } remote_fio_func_map
[] = {
1147 { "open", remote_fileio_func_open
},
1148 { "close", remote_fileio_func_close
},
1149 { "read", remote_fileio_func_read
},
1150 { "write", remote_fileio_func_write
},
1151 { "lseek", remote_fileio_func_lseek
},
1152 { "rename", remote_fileio_func_rename
},
1153 { "unlink", remote_fileio_func_unlink
},
1154 { "stat", remote_fileio_func_stat
},
1155 { "fstat", remote_fileio_func_fstat
},
1156 { "gettimeofday", remote_fileio_func_gettimeofday
},
1157 { "isatty", remote_fileio_func_isatty
},
1158 { "system", remote_fileio_func_system
},
1163 do_remote_fileio_request (struct ui_out
*uiout
, void *buf_arg
)
1165 char *buf
= (char *) buf_arg
;
1169 remote_fileio_sig_set (remote_fileio_ctrl_c_signal_handler
);
1171 c
= strchr (++buf
, ',');
1175 c
= strchr (buf
, '\0');
1176 for (idx
= 0; remote_fio_func_map
[idx
].name
; ++idx
)
1177 if (!strcmp (remote_fio_func_map
[idx
].name
, buf
))
1179 if (!remote_fio_func_map
[idx
].name
) /* ERROR: No such function. */
1180 return RETURN_ERROR
;
1181 remote_fio_func_map
[idx
].func (c
);
1185 /* Close any open descriptors, and reinitialize the file mapping. */
1188 remote_fileio_reset (void)
1192 for (ix
= 0; ix
!= remote_fio_data
.fd_map_size
; ix
++)
1194 int fd
= remote_fio_data
.fd_map
[ix
];
1199 if (remote_fio_data
.fd_map
)
1201 xfree (remote_fio_data
.fd_map
);
1202 remote_fio_data
.fd_map
= NULL
;
1203 remote_fio_data
.fd_map_size
= 0;
1207 /* Handle a file I/O request. BUF points to the packet containing the
1208 request. CTRLC_PENDING_P should be nonzero if the target has not
1209 acknowledged the Ctrl-C sent asynchronously earlier. */
1212 remote_fileio_request (char *buf
, int ctrlc_pending_p
)
1216 remote_fileio_sig_init ();
1218 if (ctrlc_pending_p
)
1220 /* If the target hasn't responded to the Ctrl-C sent
1221 asynchronously earlier, take this opportunity to send the
1222 Ctrl-C synchronously. */
1223 remote_fio_ctrl_c_flag
= 1;
1224 remote_fileio_reply (-1, FILEIO_EINTR
);
1228 remote_fio_ctrl_c_flag
= 0;
1230 ex
= catch_exceptions (current_uiout
,
1231 do_remote_fileio_request
, (void *)buf
,
1236 remote_fileio_reply (-1, FILEIO_ENOSYS
);
1239 remote_fileio_reply (-1, FILEIO_EINTR
);
1246 remote_fileio_sig_exit ();
1250 /* Unpack an fio_uint_t. */
1253 remote_fileio_to_host_uint (fio_uint_t fnum
)
1255 return extract_unsigned_integer ((gdb_byte
*) fnum
, 4,
1259 /* Unpack an fio_ulong_t. */
1262 remote_fileio_to_host_ulong (fio_ulong_t fnum
)
1264 return extract_unsigned_integer ((gdb_byte
*) fnum
, 8,
1268 /* Unpack an fio_mode_t. */
1271 remote_fileio_to_host_mode (fio_mode_t fnum
)
1273 return remote_fileio_mode_to_host (remote_fileio_to_host_uint (fnum
),
1277 /* Unpack an fio_time_t. */
1280 remote_fileio_to_host_time (fio_time_t fnum
)
1282 return remote_fileio_to_host_uint (fnum
);
1286 /* See remote-fileio.h. */
1289 remote_fileio_to_host_stat (struct fio_stat
*fst
, struct stat
*st
)
1291 memset (st
, 0, sizeof (struct stat
));
1293 st
->st_dev
= remote_fileio_to_host_uint (fst
->fst_dev
);
1294 st
->st_ino
= remote_fileio_to_host_uint (fst
->fst_ino
);
1295 st
->st_mode
= remote_fileio_to_host_mode (fst
->fst_mode
);
1296 st
->st_nlink
= remote_fileio_to_host_uint (fst
->fst_nlink
);
1297 st
->st_uid
= remote_fileio_to_host_uint (fst
->fst_uid
);
1298 st
->st_gid
= remote_fileio_to_host_uint (fst
->fst_gid
);
1299 st
->st_rdev
= remote_fileio_to_host_uint (fst
->fst_rdev
);
1300 st
->st_size
= remote_fileio_to_host_ulong (fst
->fst_size
);
1301 #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
1302 st
->st_blksize
= remote_fileio_to_host_ulong (fst
->fst_blksize
);
1304 #if HAVE_STRUCT_STAT_ST_BLOCKS
1305 st
->st_blocks
= remote_fileio_to_host_ulong (fst
->fst_blocks
);
1307 st
->st_atime
= remote_fileio_to_host_time (fst
->fst_atime
);
1308 st
->st_mtime
= remote_fileio_to_host_time (fst
->fst_mtime
);
1309 st
->st_ctime
= remote_fileio_to_host_time (fst
->fst_ctime
);
1314 set_system_call_allowed (char *args
, int from_tty
)
1319 int val
= strtoul (args
, &arg_end
, 10);
1321 if (*args
&& *arg_end
== '\0')
1323 remote_fio_system_call_allowed
= !!val
;
1327 error (_("Illegal argument for \"set remote system-call-allowed\" command"));
1331 show_system_call_allowed (char *args
, int from_tty
)
1334 error (_("Garbage after \"show remote "
1335 "system-call-allowed\" command: `%s'"), args
);
1336 printf_unfiltered ("Calling host system(3) call from target is %sallowed\n",
1337 remote_fio_system_call_allowed
? "" : "not ");
1341 initialize_remote_fileio (struct cmd_list_element
*remote_set_cmdlist
,
1342 struct cmd_list_element
*remote_show_cmdlist
)
1344 add_cmd ("system-call-allowed", no_class
,
1345 set_system_call_allowed
,
1346 _("Set if the host system(3) call is allowed for the target."),
1347 &remote_set_cmdlist
);
1348 add_cmd ("system-call-allowed", no_class
,
1349 show_system_call_allowed
,
1350 _("Show if the host system(3) call is allowed for the target."),
1351 &remote_show_cmdlist
);