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;
354 remote_fileio_reply (int retcode, int error)
358 remote_fileio_sig_set (SIG_IGN);
365 sprintf (buf + strlen (buf), "%x", retcode);
366 if (error || remote_fio_ctrl_c_flag)
368 if (error && remote_fio_ctrl_c_flag)
369 error = FILEIO_EINTR;
375 sprintf (buf + strlen (buf), ",%x", error);
376 if (remote_fio_ctrl_c_flag)
379 remote_fio_ctrl_c_flag = 0;
380 remote_fileio_sig_set (remote_fileio_ctrl_c_signal_handler);
385 remote_fileio_ioerror (void)
387 remote_fileio_reply (-1, FILEIO_EIO);
391 remote_fileio_badfd (void)
393 remote_fileio_reply (-1, FILEIO_EBADF);
397 remote_fileio_return_errno (int retcode)
399 remote_fileio_reply (retcode, retcode < 0
400 ? host_to_fileio_error (errno) : 0);
404 remote_fileio_return_success (int retcode)
406 remote_fileio_reply (retcode, 0);
410 remote_fileio_func_open (char *buf)
420 /* 1. Parameter: Ptr to pathname / length incl. trailing zero. */
421 if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length))
423 remote_fileio_ioerror ();
426 /* 2. Parameter: open flags */
427 if (remote_fileio_extract_int (&buf, &num))
429 remote_fileio_ioerror ();
432 flags = remote_fileio_oflags_to_host (num);
433 /* 3. Parameter: open mode */
434 if (remote_fileio_extract_int (&buf, &num))
436 remote_fileio_ioerror ();
439 mode = remote_fileio_mode_to_host (num, 1);
441 /* Request pathname. */
442 pathname = (char *) alloca (length);
443 if (target_read_memory (ptrval, (gdb_byte *) pathname, length) != 0)
445 remote_fileio_ioerror ();
449 /* Check if pathname exists and is not a regular file or directory. If so,
450 return an appropriate error code. Same for trying to open directories
452 if (!stat (pathname, &st))
454 if (!S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode))
456 remote_fileio_reply (-1, FILEIO_ENODEV);
459 if (S_ISDIR (st.st_mode)
460 && ((flags & O_WRONLY) == O_WRONLY || (flags & O_RDWR) == O_RDWR))
462 remote_fileio_reply (-1, FILEIO_EISDIR);
467 fd = gdb_open_cloexec (pathname, flags, mode);
470 remote_fileio_return_errno (-1);
474 fd = remote_fileio_fd_to_targetfd (fd);
475 remote_fileio_return_success (fd);
479 remote_fileio_func_close (char *buf)
484 /* Parameter: file descriptor */
485 if (remote_fileio_extract_int (&buf, &num))
487 remote_fileio_ioerror ();
490 fd = remote_fileio_map_fd ((int) num);
491 if (fd == FIO_FD_INVALID)
493 remote_fileio_badfd ();
497 if (fd != FIO_FD_CONSOLE_IN && fd != FIO_FD_CONSOLE_OUT && close (fd))
498 remote_fileio_return_errno (-1);
499 remote_fileio_close_target_fd ((int) num);
500 remote_fileio_return_success (0);
504 remote_fileio_func_read (char *buf)
512 off_t old_offset, new_offset;
514 /* 1. Parameter: file descriptor */
515 if (remote_fileio_extract_int (&buf, &target_fd))
517 remote_fileio_ioerror ();
520 fd = remote_fileio_map_fd ((int) target_fd);
521 if (fd == FIO_FD_INVALID)
523 remote_fileio_badfd ();
526 /* 2. Parameter: buffer pointer */
527 if (remote_fileio_extract_long (&buf, &lnum))
529 remote_fileio_ioerror ();
532 ptrval = (CORE_ADDR) lnum;
533 /* 3. Parameter: buffer length */
534 if (remote_fileio_extract_int (&buf, &num))
536 remote_fileio_ioerror ();
539 length = (size_t) num;
543 case FIO_FD_CONSOLE_OUT:
544 remote_fileio_badfd ();
546 case FIO_FD_CONSOLE_IN:
548 static char *remaining_buf = NULL;
549 static int remaining_length = 0;
551 buffer = (gdb_byte *) xmalloc (16384);
554 if (remaining_length > length)
556 memcpy (buffer, remaining_buf, length);
557 memmove (remaining_buf, remaining_buf + length,
558 remaining_length - length);
559 remaining_length -= length;
564 memcpy (buffer, remaining_buf, remaining_length);
565 xfree (remaining_buf);
566 remaining_buf = NULL;
567 ret = remaining_length;
572 /* Windows (at least XP and Server 2003) has difficulty
573 with large reads from consoles. If a handle is
574 backed by a real console device, overly large reads
575 from the handle will fail and set errno == ENOMEM.
576 On a Windows Server 2003 system where I tested,
577 reading 26608 bytes from the console was OK, but
578 anything above 26609 bytes would fail. The limit has
579 been observed to vary on different systems. So, we
580 limit this read to something smaller than that - by a
581 safe margin, in case the limit depends on system
582 resources or version. */
583 ret = ui_file_read (gdb_stdtargin, (char *) buffer, 16383);
584 if (ret > 0 && (size_t)ret > length)
586 remaining_buf = (char *) xmalloc (ret - length);
587 remaining_length = ret - length;
588 memcpy (remaining_buf, buffer + length, remaining_length);
595 buffer = (gdb_byte *) xmalloc (length);
596 /* POSIX defines EINTR behaviour of read in a weird way. It's allowed
597 for read() to return -1 even if "some" bytes have been read. It
598 has been corrected in SUSv2 but that doesn't help us much...
599 Therefore a complete solution must check how many bytes have been
600 read on EINTR to return a more reliable value to the target */
601 old_offset = lseek (fd, 0, SEEK_CUR);
602 ret = read (fd, buffer, length);
603 if (ret < 0 && errno == EINTR)
605 new_offset = lseek (fd, 0, SEEK_CUR);
606 /* If some data has been read, return the number of bytes read.
607 The Ctrl-C flag is set in remote_fileio_reply() anyway. */
608 if (old_offset != new_offset)
609 ret = new_offset - old_offset;
616 errno = target_write_memory (ptrval, buffer, ret);
622 remote_fileio_return_errno (-1);
624 remote_fileio_return_success (ret);
630 remote_fileio_func_write (char *buf)
639 /* 1. Parameter: file descriptor */
640 if (remote_fileio_extract_int (&buf, &target_fd))
642 remote_fileio_ioerror ();
645 fd = remote_fileio_map_fd ((int) target_fd);
646 if (fd == FIO_FD_INVALID)
648 remote_fileio_badfd ();
651 /* 2. Parameter: buffer pointer */
652 if (remote_fileio_extract_long (&buf, &lnum))
654 remote_fileio_ioerror ();
657 ptrval = (CORE_ADDR) lnum;
658 /* 3. Parameter: buffer length */
659 if (remote_fileio_extract_int (&buf, &num))
661 remote_fileio_ioerror ();
664 length = (size_t) num;
666 buffer = (gdb_byte *) xmalloc (length);
667 if (target_read_memory (ptrval, buffer, length) != 0)
670 remote_fileio_ioerror ();
676 case FIO_FD_CONSOLE_IN:
677 remote_fileio_badfd ();
680 case FIO_FD_CONSOLE_OUT:
681 ui_file_write (target_fd == 1 ? gdb_stdtarg : gdb_stdtargerr,
682 (char *) buffer, length);
683 gdb_flush (target_fd == 1 ? gdb_stdtarg : gdb_stdtargerr);
687 ret = write (fd, buffer, length);
688 if (ret < 0 && errno == EACCES)
689 errno = EBADF; /* Cygwin returns EACCESS when writing to a
695 remote_fileio_return_errno (-1);
697 remote_fileio_return_success (ret);
703 remote_fileio_func_lseek (char *buf)
710 /* 1. Parameter: file descriptor */
711 if (remote_fileio_extract_int (&buf, &num))
713 remote_fileio_ioerror ();
716 fd = remote_fileio_map_fd ((int) num);
717 if (fd == FIO_FD_INVALID)
719 remote_fileio_badfd ();
722 else if (fd == FIO_FD_CONSOLE_IN || fd == FIO_FD_CONSOLE_OUT)
724 remote_fileio_reply (-1, FILEIO_ESPIPE);
728 /* 2. Parameter: offset */
729 if (remote_fileio_extract_long (&buf, &lnum))
731 remote_fileio_ioerror ();
734 offset = (off_t) lnum;
735 /* 3. Parameter: flag */
736 if (remote_fileio_extract_int (&buf, &num))
738 remote_fileio_ioerror ();
741 if (remote_fileio_seek_flag_to_host (num, &flag))
743 remote_fileio_reply (-1, FILEIO_EINVAL);
747 ret = lseek (fd, offset, flag);
749 if (ret == (off_t) -1)
750 remote_fileio_return_errno (-1);
752 remote_fileio_return_success (ret);
756 remote_fileio_func_rename (char *buf)
758 CORE_ADDR old_ptr, new_ptr;
759 int old_len, new_len;
760 char *oldpath, *newpath;
762 struct stat ost, nst;
764 /* 1. Parameter: Ptr to oldpath / length incl. trailing zero */
765 if (remote_fileio_extract_ptr_w_len (&buf, &old_ptr, &old_len))
767 remote_fileio_ioerror ();
771 /* 2. Parameter: Ptr to newpath / length incl. trailing zero */
772 if (remote_fileio_extract_ptr_w_len (&buf, &new_ptr, &new_len))
774 remote_fileio_ioerror ();
778 /* Request oldpath using 'm' packet */
779 oldpath = (char *) alloca (old_len);
780 if (target_read_memory (old_ptr, (gdb_byte *) oldpath, old_len) != 0)
782 remote_fileio_ioerror ();
786 /* Request newpath using 'm' packet */
787 newpath = (char *) alloca (new_len);
788 if (target_read_memory (new_ptr, (gdb_byte *) newpath, new_len) != 0)
790 remote_fileio_ioerror ();
794 /* Only operate on regular files and directories. */
795 of = stat (oldpath, &ost);
796 nf = stat (newpath, &nst);
797 if ((!of && !S_ISREG (ost.st_mode) && !S_ISDIR (ost.st_mode))
798 || (!nf && !S_ISREG (nst.st_mode) && !S_ISDIR (nst.st_mode)))
800 remote_fileio_reply (-1, FILEIO_EACCES);
804 ret = rename (oldpath, newpath);
808 /* Special case: newpath is a non-empty directory. Some systems
809 return ENOTEMPTY, some return EEXIST. We coerce that to be
811 if (errno == ENOTEMPTY)
814 /* Workaround some Cygwin problems with correct errnos. */
817 if (!of && !nf && S_ISDIR (nst.st_mode))
819 if (S_ISREG (ost.st_mode))
823 char oldfullpath[PATH_MAX];
824 char newfullpath[PATH_MAX];
827 cygwin_conv_path (CCP_WIN_A_TO_POSIX, oldpath, oldfullpath,
829 cygwin_conv_path (CCP_WIN_A_TO_POSIX, newpath, newfullpath,
831 len = strlen (oldfullpath);
832 if (IS_DIR_SEPARATOR (newfullpath[len])
833 && !filename_ncmp (oldfullpath, newfullpath, len))
842 remote_fileio_return_errno (-1);
845 remote_fileio_return_success (ret);
849 remote_fileio_func_unlink (char *buf)
857 /* Parameter: Ptr to pathname / length incl. trailing zero */
858 if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length))
860 remote_fileio_ioerror ();
863 /* Request pathname using 'm' packet */
864 pathname = (char *) alloca (length);
865 if (target_read_memory (ptrval, (gdb_byte *) pathname, length) != 0)
867 remote_fileio_ioerror ();
871 /* Only operate on regular files (and directories, which allows to return
872 the correct return code). */
873 if (!stat (pathname, &st) && !S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode))
875 remote_fileio_reply (-1, FILEIO_ENODEV);
879 ret = unlink (pathname);
882 remote_fileio_return_errno (-1);
884 remote_fileio_return_success (ret);
888 remote_fileio_func_stat (char *buf)
890 CORE_ADDR statptr, nameptr;
897 /* 1. Parameter: Ptr to pathname / length incl. trailing zero */
898 if (remote_fileio_extract_ptr_w_len (&buf, &nameptr, &namelength))
900 remote_fileio_ioerror ();
904 /* 2. Parameter: Ptr to struct stat */
905 if (remote_fileio_extract_long (&buf, &lnum))
907 remote_fileio_ioerror ();
910 statptr = (CORE_ADDR) lnum;
912 /* Request pathname using 'm' packet */
913 pathname = (char *) alloca (namelength);
914 if (target_read_memory (nameptr, (gdb_byte *) pathname, namelength) != 0)
916 remote_fileio_ioerror ();
920 ret = stat (pathname, &st);
924 remote_fileio_return_errno (-1);
927 /* Only operate on regular files and directories. */
928 if (!ret && !S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode))
930 remote_fileio_reply (-1, FILEIO_EACCES);
935 host_to_fileio_stat (&st, &fst);
936 host_to_fileio_uint (0, fst.fst_dev);
938 errno = target_write_memory (statptr, (gdb_byte *) &fst, sizeof fst);
941 remote_fileio_return_errno (-1);
945 remote_fileio_return_success (ret);
949 remote_fileio_func_fstat (char *buf)
959 /* 1. Parameter: file descriptor */
960 if (remote_fileio_extract_int (&buf, &target_fd))
962 remote_fileio_ioerror ();
965 fd = remote_fileio_map_fd ((int) target_fd);
966 if (fd == FIO_FD_INVALID)
968 remote_fileio_badfd ();
971 /* 2. Parameter: Ptr to struct stat */
972 if (remote_fileio_extract_long (&buf, &lnum))
974 remote_fileio_ioerror ();
977 ptrval = (CORE_ADDR) lnum;
979 if (fd == FIO_FD_CONSOLE_IN || fd == FIO_FD_CONSOLE_OUT)
981 host_to_fileio_uint (1, fst.fst_dev);
982 memset (&st, 0, sizeof (st));
983 st.st_mode = S_IFCHR | (fd == FIO_FD_CONSOLE_IN ? S_IRUSR : S_IWUSR);
986 st.st_uid = getuid ();
989 st.st_gid = getgid ();
991 #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
994 #if HAVE_STRUCT_STAT_ST_BLOCKS
997 if (!gettimeofday (&tv, NULL))
998 st.st_atime = st.st_mtime = st.st_ctime = tv.tv_sec;
1000 st.st_atime = st.st_mtime = st.st_ctime = (time_t) 0;
1004 ret = fstat (fd, &st);
1008 remote_fileio_return_errno (-1);
1013 host_to_fileio_stat (&st, &fst);
1015 errno = target_write_memory (ptrval, (gdb_byte *) &fst, sizeof fst);
1018 remote_fileio_return_errno (-1);
1022 remote_fileio_return_success (ret);
1026 remote_fileio_func_gettimeofday (char *buf)
1032 struct fio_timeval ftv;
1034 /* 1. Parameter: struct timeval pointer */
1035 if (remote_fileio_extract_long (&buf, &lnum))
1037 remote_fileio_ioerror ();
1040 ptrval = (CORE_ADDR) lnum;
1041 /* 2. Parameter: some pointer value... */
1042 if (remote_fileio_extract_long (&buf, &lnum))
1044 remote_fileio_ioerror ();
1047 /* ...which has to be NULL. */
1050 remote_fileio_reply (-1, FILEIO_EINVAL);
1054 ret = gettimeofday (&tv, NULL);
1058 remote_fileio_return_errno (-1);
1064 remote_fileio_to_fio_timeval (&tv, &ftv);
1066 errno = target_write_memory (ptrval, (gdb_byte *) &ftv, sizeof ftv);
1069 remote_fileio_return_errno (-1);
1073 remote_fileio_return_success (ret);
1077 remote_fileio_func_isatty (char *buf)
1082 /* Parameter: file descriptor */
1083 if (remote_fileio_extract_int (&buf, &target_fd))
1085 remote_fileio_ioerror ();
1088 fd = remote_fileio_map_fd ((int) target_fd);
1089 remote_fileio_return_success (fd == FIO_FD_CONSOLE_IN ||
1090 fd == FIO_FD_CONSOLE_OUT ? 1 : 0);
1094 remote_fileio_func_system (char *buf)
1098 char *cmdline = NULL;
1100 /* Parameter: Ptr to commandline / length incl. trailing zero */
1101 if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length))
1103 remote_fileio_ioerror ();
1109 /* Request commandline using 'm' packet */
1110 cmdline = (char *) alloca (length);
1111 if (target_read_memory (ptrval, (gdb_byte *) cmdline, length) != 0)
1113 remote_fileio_ioerror ();
1118 /* Check if system(3) has been explicitely allowed using the
1119 `set remote system-call-allowed 1' command. If length is 0,
1120 indicating a NULL parameter to the system call, return zero to
1121 indicate a shell is not available. Otherwise fail with EPERM. */
1122 if (!remote_fio_system_call_allowed)
1125 remote_fileio_return_success (0);
1127 remote_fileio_reply (-1, FILEIO_EPERM);
1131 ret = system (cmdline);
1134 remote_fileio_return_success (ret);
1136 remote_fileio_return_errno (-1);
1138 remote_fileio_return_success (WEXITSTATUS (ret));
1143 void (*func)(char *);
1144 } remote_fio_func_map[] = {
1145 { "open", remote_fileio_func_open },
1146 { "close", remote_fileio_func_close },
1147 { "read", remote_fileio_func_read },
1148 { "write", remote_fileio_func_write },
1149 { "lseek", remote_fileio_func_lseek },
1150 { "rename", remote_fileio_func_rename },
1151 { "unlink", remote_fileio_func_unlink },
1152 { "stat", remote_fileio_func_stat },
1153 { "fstat", remote_fileio_func_fstat },
1154 { "gettimeofday", remote_fileio_func_gettimeofday },
1155 { "isatty", remote_fileio_func_isatty },
1156 { "system", remote_fileio_func_system },
1161 do_remote_fileio_request (struct ui_out *uiout, void *buf_arg)
1163 char *buf = (char *) buf_arg;
1167 remote_fileio_sig_set (remote_fileio_ctrl_c_signal_handler);
1169 c = strchr (++buf, ',');
1173 c = strchr (buf, '\0');
1174 for (idx = 0; remote_fio_func_map[idx].name; ++idx)
1175 if (!strcmp (remote_fio_func_map[idx].name, buf))
1177 if (!remote_fio_func_map[idx].name) /* ERROR: No such function. */
1178 return RETURN_ERROR;
1179 remote_fio_func_map[idx].func (c);
1183 /* Close any open descriptors, and reinitialize the file mapping. */
1186 remote_fileio_reset (void)
1190 for (ix = 0; ix != remote_fio_data.fd_map_size; ix++)
1192 int fd = remote_fio_data.fd_map[ix];
1197 if (remote_fio_data.fd_map)
1199 xfree (remote_fio_data.fd_map);
1200 remote_fio_data.fd_map = NULL;
1201 remote_fio_data.fd_map_size = 0;
1205 /* Handle a file I/O request. BUF points to the packet containing the
1206 request. CTRLC_PENDING_P should be nonzero if the target has not
1207 acknowledged the Ctrl-C sent asynchronously earlier. */
1210 remote_fileio_request (char *buf, int ctrlc_pending_p)
1214 remote_fileio_sig_init ();
1216 if (ctrlc_pending_p)
1218 /* If the target hasn't responded to the Ctrl-C sent
1219 asynchronously earlier, take this opportunity to send the
1220 Ctrl-C synchronously. */
1221 remote_fio_ctrl_c_flag = 1;
1222 remote_fileio_reply (-1, FILEIO_EINTR);
1226 remote_fio_ctrl_c_flag = 0;
1228 ex = catch_exceptions (current_uiout,
1229 do_remote_fileio_request, (void *)buf,
1234 remote_fileio_reply (-1, FILEIO_ENOSYS);
1237 remote_fileio_reply (-1, FILEIO_EINTR);
1244 remote_fileio_sig_exit ();
1248 /* Unpack an fio_uint_t. */
1251 remote_fileio_to_host_uint (fio_uint_t fnum)
1253 return extract_unsigned_integer ((gdb_byte *) fnum, 4,
1257 /* Unpack an fio_ulong_t. */
1260 remote_fileio_to_host_ulong (fio_ulong_t fnum)
1262 return extract_unsigned_integer ((gdb_byte *) fnum, 8,
1266 /* Unpack an fio_mode_t. */
1269 remote_fileio_to_host_mode (fio_mode_t fnum)
1271 return remote_fileio_mode_to_host (remote_fileio_to_host_uint (fnum),
1275 /* Unpack an fio_time_t. */
1278 remote_fileio_to_host_time (fio_time_t fnum)
1280 return remote_fileio_to_host_uint (fnum);
1284 /* See remote-fileio.h. */
1287 remote_fileio_to_host_stat (struct fio_stat *fst, struct stat *st)
1289 memset (st, 0, sizeof (struct stat));
1291 st->st_dev = remote_fileio_to_host_uint (fst->fst_dev);
1292 st->st_ino = remote_fileio_to_host_uint (fst->fst_ino);
1293 st->st_mode = remote_fileio_to_host_mode (fst->fst_mode);
1294 st->st_nlink = remote_fileio_to_host_uint (fst->fst_nlink);
1295 st->st_uid = remote_fileio_to_host_uint (fst->fst_uid);
1296 st->st_gid = remote_fileio_to_host_uint (fst->fst_gid);
1297 st->st_rdev = remote_fileio_to_host_uint (fst->fst_rdev);
1298 st->st_size = remote_fileio_to_host_ulong (fst->fst_size);
1299 #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
1300 st->st_blksize = remote_fileio_to_host_ulong (fst->fst_blksize);
1302 #if HAVE_STRUCT_STAT_ST_BLOCKS
1303 st->st_blocks = remote_fileio_to_host_ulong (fst->fst_blocks);
1305 st->st_atime = remote_fileio_to_host_time (fst->fst_atime);
1306 st->st_mtime = remote_fileio_to_host_time (fst->fst_mtime);
1307 st->st_ctime = remote_fileio_to_host_time (fst->fst_ctime);
1312 set_system_call_allowed (char *args, int from_tty)
1317 int val = strtoul (args, &arg_end, 10);
1319 if (*args && *arg_end == '\0')
1321 remote_fio_system_call_allowed = !!val;
1325 error (_("Illegal argument for \"set remote system-call-allowed\" command"));
1329 show_system_call_allowed (char *args, int from_tty)
1332 error (_("Garbage after \"show remote "
1333 "system-call-allowed\" command: `%s'"), args);
1334 printf_unfiltered ("Calling host system(3) call from target is %sallowed\n",
1335 remote_fio_system_call_allowed ? "" : "not ");
1339 initialize_remote_fileio (struct cmd_list_element *remote_set_cmdlist,
1340 struct cmd_list_element *remote_show_cmdlist)
1342 add_cmd ("system-call-allowed", no_class,
1343 set_system_call_allowed,
1344 _("Set if the host system(3) call is allowed for the target."),
1345 &remote_set_cmdlist);
1346 add_cmd ("system-call-allowed", no_class,
1347 show_system_call_allowed,
1348 _("Show if the host system(3) call is allowed for the target."),
1349 &remote_show_cmdlist);