* source.c (openp): Skip $cdir in PATH.
[deliverable/binutils-gdb.git] / gdb / remote-fileio.c
1 /* Remote File-I/O communications
2
3 Copyright (C) 2003, 2005, 2006, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20
21 /* See the GDB User Guide for details of the GDB remote protocol. */
22
23 #include "defs.h"
24 #include "gdb_string.h"
25 #include "gdbcmd.h"
26 #include "remote.h"
27 #include "gdb/fileio.h"
28 #include "gdb_wait.h"
29 #include "gdb_stat.h"
30 #include "exceptions.h"
31 #include "remote-fileio.h"
32 #include "event-loop.h"
33
34 #include <fcntl.h>
35 #include <sys/time.h>
36 #ifdef __CYGWIN__
37 #include <sys/cygwin.h> /* For cygwin_conv_to_full_posix_path. */
38 #include <cygwin/version.h>
39 #if CYGWIN_VERSION_DLL_MAKE_COMBINED(CYGWIN_VERSION_API_MAJOR,CYGWIN_VERSION_API_MINOR) < 181
40 # define CCP_POSIX_TO_WIN_A 0
41 # define CCP_WIN_A_TO_POSIX 2
42 # define cygwin_conv_path(op, from, to, size) \
43 (op == CCP_WIN_A_TO_POSIX) ? \
44 cygwin_conv_to_full_posix_path (from, to) : \
45 cygwin_conv_to_win32_path (from, to)
46 #endif
47 #endif
48 #include <signal.h>
49
50 static struct {
51 int *fd_map;
52 int fd_map_size;
53 } remote_fio_data;
54
55 #define FIO_FD_INVALID -1
56 #define FIO_FD_CONSOLE_IN -2
57 #define FIO_FD_CONSOLE_OUT -3
58
59 static int remote_fio_system_call_allowed = 0;
60
61 static struct async_signal_handler *sigint_fileio_token;
62
63 static int
64 remote_fileio_init_fd_map (void)
65 {
66 int i;
67
68 if (!remote_fio_data.fd_map)
69 {
70 remote_fio_data.fd_map = (int *) xmalloc (10 * sizeof (int));
71 remote_fio_data.fd_map_size = 10;
72 remote_fio_data.fd_map[0] = FIO_FD_CONSOLE_IN;
73 remote_fio_data.fd_map[1] = FIO_FD_CONSOLE_OUT;
74 remote_fio_data.fd_map[2] = FIO_FD_CONSOLE_OUT;
75 for (i = 3; i < 10; ++i)
76 remote_fio_data.fd_map[i] = FIO_FD_INVALID;
77 }
78 return 3;
79 }
80
81 static int
82 remote_fileio_resize_fd_map (void)
83 {
84 int i = remote_fio_data.fd_map_size;
85
86 if (!remote_fio_data.fd_map)
87 return remote_fileio_init_fd_map ();
88 remote_fio_data.fd_map_size += 10;
89 remote_fio_data.fd_map =
90 (int *) xrealloc (remote_fio_data.fd_map,
91 remote_fio_data.fd_map_size * sizeof (int));
92 for (; i < remote_fio_data.fd_map_size; i++)
93 remote_fio_data.fd_map[i] = FIO_FD_INVALID;
94 return remote_fio_data.fd_map_size - 10;
95 }
96
97 static int
98 remote_fileio_next_free_fd (void)
99 {
100 int i;
101
102 for (i = 0; i < remote_fio_data.fd_map_size; ++i)
103 if (remote_fio_data.fd_map[i] == FIO_FD_INVALID)
104 return i;
105 return remote_fileio_resize_fd_map ();
106 }
107
108 static int
109 remote_fileio_fd_to_targetfd (int fd)
110 {
111 int target_fd = remote_fileio_next_free_fd ();
112 remote_fio_data.fd_map[target_fd] = fd;
113 return target_fd;
114 }
115
116 static int
117 remote_fileio_map_fd (int target_fd)
118 {
119 remote_fileio_init_fd_map ();
120 if (target_fd < 0 || target_fd >= remote_fio_data.fd_map_size)
121 return FIO_FD_INVALID;
122 return remote_fio_data.fd_map[target_fd];
123 }
124
125 static void
126 remote_fileio_close_target_fd (int target_fd)
127 {
128 remote_fileio_init_fd_map ();
129 if (target_fd >= 0 && target_fd < remote_fio_data.fd_map_size)
130 remote_fio_data.fd_map[target_fd] = FIO_FD_INVALID;
131 }
132
133 static int
134 remote_fileio_oflags_to_host (long flags)
135 {
136 int hflags = 0;
137
138 if (flags & FILEIO_O_CREAT)
139 hflags |= O_CREAT;
140 if (flags & FILEIO_O_EXCL)
141 hflags |= O_EXCL;
142 if (flags & FILEIO_O_TRUNC)
143 hflags |= O_TRUNC;
144 if (flags & FILEIO_O_APPEND)
145 hflags |= O_APPEND;
146 if (flags & FILEIO_O_RDONLY)
147 hflags |= O_RDONLY;
148 if (flags & FILEIO_O_WRONLY)
149 hflags |= O_WRONLY;
150 if (flags & FILEIO_O_RDWR)
151 hflags |= O_RDWR;
152 /* On systems supporting binary and text mode, always open files in
153 binary mode. */
154 #ifdef O_BINARY
155 hflags |= O_BINARY;
156 #endif
157 return hflags;
158 }
159
160 static mode_t
161 remote_fileio_mode_to_host (long mode, int open_call)
162 {
163 mode_t hmode = 0;
164
165 if (!open_call)
166 {
167 if (mode & FILEIO_S_IFREG)
168 hmode |= S_IFREG;
169 if (mode & FILEIO_S_IFDIR)
170 hmode |= S_IFDIR;
171 if (mode & FILEIO_S_IFCHR)
172 hmode |= S_IFCHR;
173 }
174 if (mode & FILEIO_S_IRUSR)
175 hmode |= S_IRUSR;
176 if (mode & FILEIO_S_IWUSR)
177 hmode |= S_IWUSR;
178 if (mode & FILEIO_S_IXUSR)
179 hmode |= S_IXUSR;
180 #ifdef S_IRGRP
181 if (mode & FILEIO_S_IRGRP)
182 hmode |= S_IRGRP;
183 #endif
184 #ifdef S_IWGRP
185 if (mode & FILEIO_S_IWGRP)
186 hmode |= S_IWGRP;
187 #endif
188 #ifdef S_IXGRP
189 if (mode & FILEIO_S_IXGRP)
190 hmode |= S_IXGRP;
191 #endif
192 if (mode & FILEIO_S_IROTH)
193 hmode |= S_IROTH;
194 #ifdef S_IWOTH
195 if (mode & FILEIO_S_IWOTH)
196 hmode |= S_IWOTH;
197 #endif
198 #ifdef S_IXOTH
199 if (mode & FILEIO_S_IXOTH)
200 hmode |= S_IXOTH;
201 #endif
202 return hmode;
203 }
204
205 static LONGEST
206 remote_fileio_mode_to_target (mode_t mode)
207 {
208 mode_t tmode = 0;
209
210 if (S_ISREG(mode))
211 tmode |= FILEIO_S_IFREG;
212 if (S_ISDIR(mode))
213 tmode |= FILEIO_S_IFDIR;
214 if (S_ISCHR(mode))
215 tmode |= FILEIO_S_IFCHR;
216 if (mode & S_IRUSR)
217 tmode |= FILEIO_S_IRUSR;
218 if (mode & S_IWUSR)
219 tmode |= FILEIO_S_IWUSR;
220 if (mode & S_IXUSR)
221 tmode |= FILEIO_S_IXUSR;
222 #ifdef S_IRGRP
223 if (mode & S_IRGRP)
224 tmode |= FILEIO_S_IRGRP;
225 #endif
226 #ifdef S_IWRGRP
227 if (mode & S_IWGRP)
228 tmode |= FILEIO_S_IWGRP;
229 #endif
230 #ifdef S_IXGRP
231 if (mode & S_IXGRP)
232 tmode |= FILEIO_S_IXGRP;
233 #endif
234 if (mode & S_IROTH)
235 tmode |= FILEIO_S_IROTH;
236 #ifdef S_IWOTH
237 if (mode & S_IWOTH)
238 tmode |= FILEIO_S_IWOTH;
239 #endif
240 #ifdef S_IXOTH
241 if (mode & S_IXOTH)
242 tmode |= FILEIO_S_IXOTH;
243 #endif
244 return tmode;
245 }
246
247 static int
248 remote_fileio_errno_to_target (int error)
249 {
250 switch (error)
251 {
252 case EPERM:
253 return FILEIO_EPERM;
254 case ENOENT:
255 return FILEIO_ENOENT;
256 case EINTR:
257 return FILEIO_EINTR;
258 case EIO:
259 return FILEIO_EIO;
260 case EBADF:
261 return FILEIO_EBADF;
262 case EACCES:
263 return FILEIO_EACCES;
264 case EFAULT:
265 return FILEIO_EFAULT;
266 case EBUSY:
267 return FILEIO_EBUSY;
268 case EEXIST:
269 return FILEIO_EEXIST;
270 case ENODEV:
271 return FILEIO_ENODEV;
272 case ENOTDIR:
273 return FILEIO_ENOTDIR;
274 case EISDIR:
275 return FILEIO_EISDIR;
276 case EINVAL:
277 return FILEIO_EINVAL;
278 case ENFILE:
279 return FILEIO_ENFILE;
280 case EMFILE:
281 return FILEIO_EMFILE;
282 case EFBIG:
283 return FILEIO_EFBIG;
284 case ENOSPC:
285 return FILEIO_ENOSPC;
286 case ESPIPE:
287 return FILEIO_ESPIPE;
288 case EROFS:
289 return FILEIO_EROFS;
290 case ENOSYS:
291 return FILEIO_ENOSYS;
292 case ENAMETOOLONG:
293 return FILEIO_ENAMETOOLONG;
294 }
295 return FILEIO_EUNKNOWN;
296 }
297
298 static int
299 remote_fileio_seek_flag_to_host (long num, int *flag)
300 {
301 if (!flag)
302 return 0;
303 switch (num)
304 {
305 case FILEIO_SEEK_SET:
306 *flag = SEEK_SET;
307 break;
308 case FILEIO_SEEK_CUR:
309 *flag = SEEK_CUR;
310 break;
311 case FILEIO_SEEK_END:
312 *flag = SEEK_END;
313 break;
314 default:
315 return -1;
316 }
317 return 0;
318 }
319
320 static int
321 remote_fileio_extract_long (char **buf, LONGEST *retlong)
322 {
323 char *c;
324 int sign = 1;
325
326 if (!buf || !*buf || !**buf || !retlong)
327 return -1;
328 c = strchr (*buf, ',');
329 if (c)
330 *c++ = '\0';
331 else
332 c = strchr (*buf, '\0');
333 while (strchr ("+-", **buf))
334 {
335 if (**buf == '-')
336 sign = -sign;
337 ++*buf;
338 }
339 for (*retlong = 0; **buf; ++*buf)
340 {
341 *retlong <<= 4;
342 if (**buf >= '0' && **buf <= '9')
343 *retlong += **buf - '0';
344 else if (**buf >= 'a' && **buf <= 'f')
345 *retlong += **buf - 'a' + 10;
346 else if (**buf >= 'A' && **buf <= 'F')
347 *retlong += **buf - 'A' + 10;
348 else
349 return -1;
350 }
351 *retlong *= sign;
352 *buf = c;
353 return 0;
354 }
355
356 static int
357 remote_fileio_extract_int (char **buf, long *retint)
358 {
359 int ret;
360 LONGEST retlong;
361
362 if (!retint)
363 return -1;
364 ret = remote_fileio_extract_long (buf, &retlong);
365 if (!ret)
366 *retint = (long) retlong;
367 return ret;
368 }
369
370 static int
371 remote_fileio_extract_ptr_w_len (char **buf, CORE_ADDR *ptrval, int *length)
372 {
373 char *c;
374 LONGEST retlong;
375
376 if (!buf || !*buf || !**buf || !ptrval || !length)
377 return -1;
378 c = strchr (*buf, '/');
379 if (!c)
380 return -1;
381 *c++ = '\0';
382 if (remote_fileio_extract_long (buf, &retlong))
383 return -1;
384 *ptrval = (CORE_ADDR) retlong;
385 *buf = c;
386 if (remote_fileio_extract_long (buf, &retlong))
387 return -1;
388 *length = (int) retlong;
389 return 0;
390 }
391
392 /* Convert to big endian */
393 static void
394 remote_fileio_to_be (LONGEST num, char *buf, int bytes)
395 {
396 int i;
397
398 for (i = 0; i < bytes; ++i)
399 buf[i] = (num >> (8 * (bytes - i - 1))) & 0xff;
400 }
401
402 static void
403 remote_fileio_to_fio_uint (long num, fio_uint_t fnum)
404 {
405 remote_fileio_to_be ((LONGEST) num, (char *) fnum, 4);
406 }
407
408 static void
409 remote_fileio_to_fio_mode (mode_t num, fio_mode_t fnum)
410 {
411 remote_fileio_to_be (remote_fileio_mode_to_target(num), (char *) fnum, 4);
412 }
413
414 static void
415 remote_fileio_to_fio_time (time_t num, fio_time_t fnum)
416 {
417 remote_fileio_to_be ((LONGEST) num, (char *) fnum, 4);
418 }
419
420 static void
421 remote_fileio_to_fio_long (LONGEST num, fio_long_t fnum)
422 {
423 remote_fileio_to_be (num, (char *) fnum, 8);
424 }
425
426 static void
427 remote_fileio_to_fio_ulong (LONGEST num, fio_ulong_t fnum)
428 {
429 remote_fileio_to_be (num, (char *) fnum, 8);
430 }
431
432 static void
433 remote_fileio_to_fio_stat (struct stat *st, struct fio_stat *fst)
434 {
435 LONGEST blksize;
436
437 /* `st_dev' is set in the calling function */
438 remote_fileio_to_fio_uint ((long) st->st_ino, fst->fst_ino);
439 remote_fileio_to_fio_mode (st->st_mode, fst->fst_mode);
440 remote_fileio_to_fio_uint ((long) st->st_nlink, fst->fst_nlink);
441 remote_fileio_to_fio_uint ((long) st->st_uid, fst->fst_uid);
442 remote_fileio_to_fio_uint ((long) st->st_gid, fst->fst_gid);
443 remote_fileio_to_fio_uint ((long) st->st_rdev, fst->fst_rdev);
444 remote_fileio_to_fio_ulong ((LONGEST) st->st_size, fst->fst_size);
445 #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
446 blksize = st->st_blksize;
447 #else
448 blksize = 512;
449 #endif
450 remote_fileio_to_fio_ulong (blksize, fst->fst_blksize);
451 #if HAVE_STRUCT_STAT_ST_BLOCKS
452 remote_fileio_to_fio_ulong ((LONGEST) st->st_blocks, fst->fst_blocks);
453 #else
454 /* FIXME: This is correct for DJGPP, but other systems that don't
455 have st_blocks, if any, might prefer 512 instead of st_blksize.
456 (eliz, 30-12-2003) */
457 remote_fileio_to_fio_ulong (((LONGEST) st->st_size + blksize - 1)
458 / blksize,
459 fst->fst_blocks);
460 #endif
461 remote_fileio_to_fio_time (st->st_atime, fst->fst_atime);
462 remote_fileio_to_fio_time (st->st_mtime, fst->fst_mtime);
463 remote_fileio_to_fio_time (st->st_ctime, fst->fst_ctime);
464 }
465
466 static void
467 remote_fileio_to_fio_timeval (struct timeval *tv, struct fio_timeval *ftv)
468 {
469 remote_fileio_to_fio_time (tv->tv_sec, ftv->ftv_sec);
470 remote_fileio_to_fio_long (tv->tv_usec, ftv->ftv_usec);
471 }
472
473 static int remote_fio_ctrl_c_flag = 0;
474 static int remote_fio_no_longjmp = 0;
475
476 #if defined (HAVE_SIGACTION) && defined (SA_RESTART)
477 static struct sigaction remote_fio_sa;
478 static struct sigaction remote_fio_osa;
479 #else
480 static void (*remote_fio_ofunc)(int);
481 #endif
482
483 static void
484 remote_fileio_sig_init (void)
485 {
486 #if defined (HAVE_SIGACTION) && defined (SA_RESTART)
487 remote_fio_sa.sa_handler = SIG_IGN;
488 sigemptyset (&remote_fio_sa.sa_mask);
489 remote_fio_sa.sa_flags = 0;
490 sigaction (SIGINT, &remote_fio_sa, &remote_fio_osa);
491 #else
492 remote_fio_ofunc = signal (SIGINT, SIG_IGN);
493 #endif
494 }
495
496 static void
497 remote_fileio_sig_set (void (*sigint_func)(int))
498 {
499 #if defined (HAVE_SIGACTION) && defined (SA_RESTART)
500 remote_fio_sa.sa_handler = sigint_func;
501 sigemptyset (&remote_fio_sa.sa_mask);
502 remote_fio_sa.sa_flags = 0;
503 sigaction (SIGINT, &remote_fio_sa, NULL);
504 #else
505 signal (SIGINT, sigint_func);
506 #endif
507 }
508
509 static void
510 remote_fileio_sig_exit (void)
511 {
512 #if defined (HAVE_SIGACTION) && defined (SA_RESTART)
513 sigaction (SIGINT, &remote_fio_osa, NULL);
514 #else
515 signal (SIGINT, remote_fio_ofunc);
516 #endif
517 }
518
519 static void
520 async_remote_fileio_interrupt (gdb_client_data arg)
521 {
522 deprecated_throw_reason (RETURN_QUIT);
523 }
524
525 static void
526 remote_fileio_ctrl_c_signal_handler (int signo)
527 {
528 remote_fileio_sig_set (SIG_IGN);
529 remote_fio_ctrl_c_flag = 1;
530 if (!remote_fio_no_longjmp)
531 gdb_call_async_signal_handler (sigint_fileio_token, 1);
532 remote_fileio_sig_set (remote_fileio_ctrl_c_signal_handler);
533 }
534
535 static void
536 remote_fileio_reply (int retcode, int error)
537 {
538 char buf[32];
539
540 remote_fileio_sig_set (SIG_IGN);
541 strcpy (buf, "F");
542 if (retcode < 0)
543 {
544 strcat (buf, "-");
545 retcode = -retcode;
546 }
547 sprintf (buf + strlen (buf), "%x", retcode);
548 if (error || remote_fio_ctrl_c_flag)
549 {
550 if (error && remote_fio_ctrl_c_flag)
551 error = FILEIO_EINTR;
552 if (error < 0)
553 {
554 strcat (buf, "-");
555 error = -error;
556 }
557 sprintf (buf + strlen (buf), ",%x", error);
558 if (remote_fio_ctrl_c_flag)
559 strcat (buf, ",C");
560 }
561 remote_fileio_sig_set (remote_fileio_ctrl_c_signal_handler);
562 putpkt (buf);
563 }
564
565 static void
566 remote_fileio_ioerror (void)
567 {
568 remote_fileio_reply (-1, FILEIO_EIO);
569 }
570
571 static void
572 remote_fileio_badfd (void)
573 {
574 remote_fileio_reply (-1, FILEIO_EBADF);
575 }
576
577 static void
578 remote_fileio_return_errno (int retcode)
579 {
580 remote_fileio_reply (retcode,
581 retcode < 0 ? remote_fileio_errno_to_target (errno) : 0);
582 }
583
584 static void
585 remote_fileio_return_success (int retcode)
586 {
587 remote_fileio_reply (retcode, 0);
588 }
589
590 /* Wrapper function for remote_write_bytes() which has the disadvantage to
591 write only one packet, regardless of the requested number of bytes to
592 transfer. This wrapper calls remote_write_bytes() as often as needed. */
593 static int
594 remote_fileio_write_bytes (CORE_ADDR memaddr, gdb_byte *myaddr, int len)
595 {
596 int ret = 0, written;
597
598 while (len > 0 && (written = remote_write_bytes (memaddr, myaddr, len)) > 0)
599 {
600 len -= written;
601 memaddr += written;
602 myaddr += written;
603 ret += written;
604 }
605 return ret;
606 }
607
608 static void
609 remote_fileio_func_open (char *buf)
610 {
611 CORE_ADDR ptrval;
612 int length, retlength;
613 long num;
614 int flags, fd;
615 mode_t mode;
616 char *pathname;
617 struct stat st;
618
619 /* 1. Parameter: Ptr to pathname / length incl. trailing zero */
620 if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length))
621 {
622 remote_fileio_ioerror ();
623 return;
624 }
625 /* 2. Parameter: open flags */
626 if (remote_fileio_extract_int (&buf, &num))
627 {
628 remote_fileio_ioerror ();
629 return;
630 }
631 flags = remote_fileio_oflags_to_host (num);
632 /* 3. Parameter: open mode */
633 if (remote_fileio_extract_int (&buf, &num))
634 {
635 remote_fileio_ioerror ();
636 return;
637 }
638 mode = remote_fileio_mode_to_host (num, 1);
639
640 /* Request pathname using 'm' packet */
641 pathname = alloca (length);
642 retlength = remote_read_bytes (ptrval, (gdb_byte *) pathname, length);
643 if (retlength != length)
644 {
645 remote_fileio_ioerror ();
646 return;
647 }
648
649 /* Check if pathname exists and is not a regular file or directory. If so,
650 return an appropriate error code. Same for trying to open directories
651 for writing. */
652 if (!stat (pathname, &st))
653 {
654 if (!S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode))
655 {
656 remote_fileio_reply (-1, FILEIO_ENODEV);
657 return;
658 }
659 if (S_ISDIR (st.st_mode)
660 && ((flags & O_WRONLY) == O_WRONLY || (flags & O_RDWR) == O_RDWR))
661 {
662 remote_fileio_reply (-1, FILEIO_EISDIR);
663 return;
664 }
665 }
666
667 remote_fio_no_longjmp = 1;
668 fd = open (pathname, flags, mode);
669 if (fd < 0)
670 {
671 remote_fileio_return_errno (-1);
672 return;
673 }
674
675 fd = remote_fileio_fd_to_targetfd (fd);
676 remote_fileio_return_success (fd);
677 }
678
679 static void
680 remote_fileio_func_close (char *buf)
681 {
682 long num;
683 int fd;
684
685 /* Parameter: file descriptor */
686 if (remote_fileio_extract_int (&buf, &num))
687 {
688 remote_fileio_ioerror ();
689 return;
690 }
691 fd = remote_fileio_map_fd ((int) num);
692 if (fd == FIO_FD_INVALID)
693 {
694 remote_fileio_badfd ();
695 return;
696 }
697
698 remote_fio_no_longjmp = 1;
699 if (fd != FIO_FD_CONSOLE_IN && fd != FIO_FD_CONSOLE_OUT && close (fd))
700 remote_fileio_return_errno (-1);
701 remote_fileio_close_target_fd ((int) num);
702 remote_fileio_return_success (0);
703 }
704
705 static void
706 remote_fileio_func_read (char *buf)
707 {
708 long target_fd, num;
709 LONGEST lnum;
710 CORE_ADDR ptrval;
711 int fd, ret, retlength;
712 gdb_byte *buffer;
713 size_t length;
714 off_t old_offset, new_offset;
715
716 /* 1. Parameter: file descriptor */
717 if (remote_fileio_extract_int (&buf, &target_fd))
718 {
719 remote_fileio_ioerror ();
720 return;
721 }
722 fd = remote_fileio_map_fd ((int) target_fd);
723 if (fd == FIO_FD_INVALID)
724 {
725 remote_fileio_badfd ();
726 return;
727 }
728 /* 2. Parameter: buffer pointer */
729 if (remote_fileio_extract_long (&buf, &lnum))
730 {
731 remote_fileio_ioerror ();
732 return;
733 }
734 ptrval = (CORE_ADDR) lnum;
735 /* 3. Parameter: buffer length */
736 if (remote_fileio_extract_int (&buf, &num))
737 {
738 remote_fileio_ioerror ();
739 return;
740 }
741 length = (size_t) num;
742
743 switch (fd)
744 {
745 case FIO_FD_CONSOLE_OUT:
746 remote_fileio_badfd ();
747 return;
748 case FIO_FD_CONSOLE_IN:
749 {
750 static char *remaining_buf = NULL;
751 static int remaining_length = 0;
752
753 buffer = (gdb_byte *) xmalloc (16384);
754 if (remaining_buf)
755 {
756 remote_fio_no_longjmp = 1;
757 if (remaining_length > length)
758 {
759 memcpy (buffer, remaining_buf, length);
760 memmove (remaining_buf, remaining_buf + length,
761 remaining_length - length);
762 remaining_length -= length;
763 ret = length;
764 }
765 else
766 {
767 memcpy (buffer, remaining_buf, remaining_length);
768 xfree (remaining_buf);
769 remaining_buf = NULL;
770 ret = remaining_length;
771 }
772 }
773 else
774 {
775 /* Windows (at least XP and Server 2003) has difficulty
776 with large reads from consoles. If a handle is
777 backed by a real console device, overly large reads
778 from the handle will fail and set errno == ENOMEM.
779 On a Windows Server 2003 system where I tested,
780 reading 26608 bytes from the console was OK, but
781 anything above 26609 bytes would fail. The limit has
782 been observed to vary on different systems. So, we
783 limit this read to something smaller than that - by a
784 safe margin, in case the limit depends on system
785 resources or version. */
786 ret = ui_file_read (gdb_stdtargin, (char *) buffer, 16383);
787 remote_fio_no_longjmp = 1;
788 if (ret > 0 && (size_t)ret > length)
789 {
790 remaining_buf = (char *) xmalloc (ret - length);
791 remaining_length = ret - length;
792 memcpy (remaining_buf, buffer + length, remaining_length);
793 ret = length;
794 }
795 }
796 }
797 break;
798 default:
799 buffer = (gdb_byte *) xmalloc (length);
800 /* POSIX defines EINTR behaviour of read in a weird way. It's allowed
801 for read() to return -1 even if "some" bytes have been read. It
802 has been corrected in SUSv2 but that doesn't help us much...
803 Therefore a complete solution must check how many bytes have been
804 read on EINTR to return a more reliable value to the target */
805 old_offset = lseek (fd, 0, SEEK_CUR);
806 remote_fio_no_longjmp = 1;
807 ret = read (fd, buffer, length);
808 if (ret < 0 && errno == EINTR)
809 {
810 new_offset = lseek (fd, 0, SEEK_CUR);
811 /* If some data has been read, return the number of bytes read.
812 The Ctrl-C flag is set in remote_fileio_reply() anyway */
813 if (old_offset != new_offset)
814 ret = new_offset - old_offset;
815 }
816 break;
817 }
818
819 if (ret > 0)
820 {
821 retlength = remote_fileio_write_bytes (ptrval, buffer, ret);
822 if (retlength != ret)
823 ret = -1; /* errno has been set to EIO in remote_fileio_write_bytes() */
824 }
825
826 if (ret < 0)
827 remote_fileio_return_errno (-1);
828 else
829 remote_fileio_return_success (ret);
830
831 xfree (buffer);
832 }
833
834 static void
835 remote_fileio_func_write (char *buf)
836 {
837 long target_fd, num;
838 LONGEST lnum;
839 CORE_ADDR ptrval;
840 int fd, ret, retlength;
841 gdb_byte *buffer;
842 size_t length;
843
844 /* 1. Parameter: file descriptor */
845 if (remote_fileio_extract_int (&buf, &target_fd))
846 {
847 remote_fileio_ioerror ();
848 return;
849 }
850 fd = remote_fileio_map_fd ((int) target_fd);
851 if (fd == FIO_FD_INVALID)
852 {
853 remote_fileio_badfd ();
854 return;
855 }
856 /* 2. Parameter: buffer pointer */
857 if (remote_fileio_extract_long (&buf, &lnum))
858 {
859 remote_fileio_ioerror ();
860 return;
861 }
862 ptrval = (CORE_ADDR) lnum;
863 /* 3. Parameter: buffer length */
864 if (remote_fileio_extract_int (&buf, &num))
865 {
866 remote_fileio_ioerror ();
867 return;
868 }
869 length = (size_t) num;
870
871 buffer = (gdb_byte *) xmalloc (length);
872 retlength = remote_read_bytes (ptrval, buffer, length);
873 if (retlength != length)
874 {
875 xfree (buffer);
876 remote_fileio_ioerror ();
877 return;
878 }
879
880 remote_fio_no_longjmp = 1;
881 switch (fd)
882 {
883 case FIO_FD_CONSOLE_IN:
884 remote_fileio_badfd ();
885 xfree (buffer);
886 return;
887 case FIO_FD_CONSOLE_OUT:
888 ui_file_write (target_fd == 1 ? gdb_stdtarg : gdb_stdtargerr,
889 (char *) buffer, length);
890 gdb_flush (target_fd == 1 ? gdb_stdtarg : gdb_stdtargerr);
891 ret = length;
892 break;
893 default:
894 ret = write (fd, buffer, length);
895 if (ret < 0 && errno == EACCES)
896 errno = EBADF; /* Cygwin returns EACCESS when writing to a R/O file.*/
897 break;
898 }
899
900 if (ret < 0)
901 remote_fileio_return_errno (-1);
902 else
903 remote_fileio_return_success (ret);
904
905 xfree (buffer);
906 }
907
908 static void
909 remote_fileio_func_lseek (char *buf)
910 {
911 long num;
912 LONGEST lnum;
913 int fd, flag;
914 off_t offset, ret;
915
916 /* 1. Parameter: file descriptor */
917 if (remote_fileio_extract_int (&buf, &num))
918 {
919 remote_fileio_ioerror ();
920 return;
921 }
922 fd = remote_fileio_map_fd ((int) num);
923 if (fd == FIO_FD_INVALID)
924 {
925 remote_fileio_badfd ();
926 return;
927 }
928 else if (fd == FIO_FD_CONSOLE_IN || fd == FIO_FD_CONSOLE_OUT)
929 {
930 remote_fileio_reply (-1, FILEIO_ESPIPE);
931 return;
932 }
933
934 /* 2. Parameter: offset */
935 if (remote_fileio_extract_long (&buf, &lnum))
936 {
937 remote_fileio_ioerror ();
938 return;
939 }
940 offset = (off_t) lnum;
941 /* 3. Parameter: flag */
942 if (remote_fileio_extract_int (&buf, &num))
943 {
944 remote_fileio_ioerror ();
945 return;
946 }
947 if (remote_fileio_seek_flag_to_host (num, &flag))
948 {
949 remote_fileio_reply (-1, FILEIO_EINVAL);
950 return;
951 }
952
953 remote_fio_no_longjmp = 1;
954 ret = lseek (fd, offset, flag);
955
956 if (ret == (off_t) -1)
957 remote_fileio_return_errno (-1);
958 else
959 remote_fileio_return_success (ret);
960 }
961
962 static void
963 remote_fileio_func_rename (char *buf)
964 {
965 CORE_ADDR old_ptr, new_ptr;
966 int old_len, new_len, retlength;
967 char *oldpath, *newpath;
968 int ret, of, nf;
969 struct stat ost, nst;
970
971 /* 1. Parameter: Ptr to oldpath / length incl. trailing zero */
972 if (remote_fileio_extract_ptr_w_len (&buf, &old_ptr, &old_len))
973 {
974 remote_fileio_ioerror ();
975 return;
976 }
977
978 /* 2. Parameter: Ptr to newpath / length incl. trailing zero */
979 if (remote_fileio_extract_ptr_w_len (&buf, &new_ptr, &new_len))
980 {
981 remote_fileio_ioerror ();
982 return;
983 }
984
985 /* Request oldpath using 'm' packet */
986 oldpath = alloca (old_len);
987 retlength = remote_read_bytes (old_ptr, (gdb_byte *) oldpath, old_len);
988 if (retlength != old_len)
989 {
990 remote_fileio_ioerror ();
991 return;
992 }
993
994 /* Request newpath using 'm' packet */
995 newpath = alloca (new_len);
996 retlength = remote_read_bytes (new_ptr, (gdb_byte *) newpath, new_len);
997 if (retlength != new_len)
998 {
999 remote_fileio_ioerror ();
1000 return;
1001 }
1002
1003 /* Only operate on regular files and directories */
1004 of = stat (oldpath, &ost);
1005 nf = stat (newpath, &nst);
1006 if ((!of && !S_ISREG (ost.st_mode) && !S_ISDIR (ost.st_mode))
1007 || (!nf && !S_ISREG (nst.st_mode) && !S_ISDIR (nst.st_mode)))
1008 {
1009 remote_fileio_reply (-1, FILEIO_EACCES);
1010 return;
1011 }
1012
1013 remote_fio_no_longjmp = 1;
1014 ret = rename (oldpath, newpath);
1015
1016 if (ret == -1)
1017 {
1018 /* Special case: newpath is a non-empty directory. Some systems
1019 return ENOTEMPTY, some return EEXIST. We coerce that to be
1020 always EEXIST. */
1021 if (errno == ENOTEMPTY)
1022 errno = EEXIST;
1023 #ifdef __CYGWIN__
1024 /* Workaround some Cygwin problems with correct errnos. */
1025 if (errno == EACCES)
1026 {
1027 if (!of && !nf && S_ISDIR (nst.st_mode))
1028 {
1029 if (S_ISREG (ost.st_mode))
1030 errno = EISDIR;
1031 else
1032 {
1033 char oldfullpath[PATH_MAX];
1034 char newfullpath[PATH_MAX];
1035 int len;
1036
1037 cygwin_conv_path (CCP_WIN_A_TO_POSIX, oldpath, oldfullpath,
1038 PATH_MAX);
1039 cygwin_conv_path (CCP_WIN_A_TO_POSIX, newpath, newfullpath,
1040 PATH_MAX);
1041 len = strlen (oldfullpath);
1042 if (newfullpath[len] == '/'
1043 && !strncmp (oldfullpath, newfullpath, len))
1044 errno = EINVAL;
1045 else
1046 errno = EEXIST;
1047 }
1048 }
1049 }
1050 #endif
1051
1052 remote_fileio_return_errno (-1);
1053 }
1054 else
1055 remote_fileio_return_success (ret);
1056 }
1057
1058 static void
1059 remote_fileio_func_unlink (char *buf)
1060 {
1061 CORE_ADDR ptrval;
1062 int length, retlength;
1063 char *pathname;
1064 int ret;
1065 struct stat st;
1066
1067 /* Parameter: Ptr to pathname / length incl. trailing zero */
1068 if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length))
1069 {
1070 remote_fileio_ioerror ();
1071 return;
1072 }
1073 /* Request pathname using 'm' packet */
1074 pathname = alloca (length);
1075 retlength = remote_read_bytes (ptrval, (gdb_byte *) pathname, length);
1076 if (retlength != length)
1077 {
1078 remote_fileio_ioerror ();
1079 return;
1080 }
1081
1082 /* Only operate on regular files (and directories, which allows to return
1083 the correct return code) */
1084 if (!stat (pathname, &st) && !S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode))
1085 {
1086 remote_fileio_reply (-1, FILEIO_ENODEV);
1087 return;
1088 }
1089
1090 remote_fio_no_longjmp = 1;
1091 ret = unlink (pathname);
1092
1093 if (ret == -1)
1094 remote_fileio_return_errno (-1);
1095 else
1096 remote_fileio_return_success (ret);
1097 }
1098
1099 static void
1100 remote_fileio_func_stat (char *buf)
1101 {
1102 CORE_ADDR statptr, nameptr;
1103 int ret, namelength, retlength;
1104 char *pathname;
1105 LONGEST lnum;
1106 struct stat st;
1107 struct fio_stat fst;
1108
1109 /* 1. Parameter: Ptr to pathname / length incl. trailing zero */
1110 if (remote_fileio_extract_ptr_w_len (&buf, &nameptr, &namelength))
1111 {
1112 remote_fileio_ioerror ();
1113 return;
1114 }
1115
1116 /* 2. Parameter: Ptr to struct stat */
1117 if (remote_fileio_extract_long (&buf, &lnum))
1118 {
1119 remote_fileio_ioerror ();
1120 return;
1121 }
1122 statptr = (CORE_ADDR) lnum;
1123
1124 /* Request pathname using 'm' packet */
1125 pathname = alloca (namelength);
1126 retlength = remote_read_bytes (nameptr, (gdb_byte *) pathname, namelength);
1127 if (retlength != namelength)
1128 {
1129 remote_fileio_ioerror ();
1130 return;
1131 }
1132
1133 remote_fio_no_longjmp = 1;
1134 ret = stat (pathname, &st);
1135
1136 if (ret == -1)
1137 {
1138 remote_fileio_return_errno (-1);
1139 return;
1140 }
1141 /* Only operate on regular files and directories */
1142 if (!ret && !S_ISREG (st.st_mode) && !S_ISDIR (st.st_mode))
1143 {
1144 remote_fileio_reply (-1, FILEIO_EACCES);
1145 return;
1146 }
1147 if (statptr)
1148 {
1149 remote_fileio_to_fio_stat (&st, &fst);
1150 remote_fileio_to_fio_uint (0, fst.fst_dev);
1151
1152 retlength = remote_fileio_write_bytes (statptr,
1153 (gdb_byte *) &fst, sizeof fst);
1154 if (retlength != sizeof fst)
1155 {
1156 remote_fileio_return_errno (-1);
1157 return;
1158 }
1159 }
1160 remote_fileio_return_success (ret);
1161 }
1162
1163 static void
1164 remote_fileio_func_fstat (char *buf)
1165 {
1166 CORE_ADDR ptrval;
1167 int fd, ret, retlength;
1168 long target_fd;
1169 LONGEST lnum;
1170 struct stat st;
1171 struct fio_stat fst;
1172 struct timeval tv;
1173
1174 /* 1. Parameter: file descriptor */
1175 if (remote_fileio_extract_int (&buf, &target_fd))
1176 {
1177 remote_fileio_ioerror ();
1178 return;
1179 }
1180 fd = remote_fileio_map_fd ((int) target_fd);
1181 if (fd == FIO_FD_INVALID)
1182 {
1183 remote_fileio_badfd ();
1184 return;
1185 }
1186 /* 2. Parameter: Ptr to struct stat */
1187 if (remote_fileio_extract_long (&buf, &lnum))
1188 {
1189 remote_fileio_ioerror ();
1190 return;
1191 }
1192 ptrval = (CORE_ADDR) lnum;
1193
1194 remote_fio_no_longjmp = 1;
1195 if (fd == FIO_FD_CONSOLE_IN || fd == FIO_FD_CONSOLE_OUT)
1196 {
1197 remote_fileio_to_fio_uint (1, fst.fst_dev);
1198 st.st_mode = S_IFCHR | (fd == FIO_FD_CONSOLE_IN ? S_IRUSR : S_IWUSR);
1199 st.st_nlink = 1;
1200 #ifdef HAVE_GETUID
1201 st.st_uid = getuid ();
1202 #else
1203 st.st_uid = 0;
1204 #endif
1205 #ifdef HAVE_GETGID
1206 st.st_gid = getgid ();
1207 #else
1208 st.st_gid = 0;
1209 #endif
1210 st.st_rdev = 0;
1211 st.st_size = 0;
1212 #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
1213 st.st_blksize = 512;
1214 #endif
1215 #if HAVE_STRUCT_STAT_ST_BLOCKS
1216 st.st_blocks = 0;
1217 #endif
1218 if (!gettimeofday (&tv, NULL))
1219 st.st_atime = st.st_mtime = st.st_ctime = tv.tv_sec;
1220 else
1221 st.st_atime = st.st_mtime = st.st_ctime = (time_t) 0;
1222 ret = 0;
1223 }
1224 else
1225 ret = fstat (fd, &st);
1226
1227 if (ret == -1)
1228 {
1229 remote_fileio_return_errno (-1);
1230 return;
1231 }
1232 if (ptrval)
1233 {
1234 remote_fileio_to_fio_stat (&st, &fst);
1235
1236 retlength = remote_fileio_write_bytes (ptrval, (gdb_byte *) &fst, sizeof fst);
1237 if (retlength != sizeof fst)
1238 {
1239 remote_fileio_return_errno (-1);
1240 return;
1241 }
1242 }
1243 remote_fileio_return_success (ret);
1244 }
1245
1246 static void
1247 remote_fileio_func_gettimeofday (char *buf)
1248 {
1249 LONGEST lnum;
1250 CORE_ADDR ptrval;
1251 int ret, retlength;
1252 struct timeval tv;
1253 struct fio_timeval ftv;
1254
1255 /* 1. Parameter: struct timeval pointer */
1256 if (remote_fileio_extract_long (&buf, &lnum))
1257 {
1258 remote_fileio_ioerror ();
1259 return;
1260 }
1261 ptrval = (CORE_ADDR) lnum;
1262 /* 2. Parameter: some pointer value... */
1263 if (remote_fileio_extract_long (&buf, &lnum))
1264 {
1265 remote_fileio_ioerror ();
1266 return;
1267 }
1268 /* ...which has to be NULL */
1269 if (lnum)
1270 {
1271 remote_fileio_reply (-1, FILEIO_EINVAL);
1272 return;
1273 }
1274
1275 remote_fio_no_longjmp = 1;
1276 ret = gettimeofday (&tv, NULL);
1277
1278 if (ret == -1)
1279 {
1280 remote_fileio_return_errno (-1);
1281 return;
1282 }
1283
1284 if (ptrval)
1285 {
1286 remote_fileio_to_fio_timeval (&tv, &ftv);
1287
1288 retlength = remote_fileio_write_bytes (ptrval, (gdb_byte *) &ftv, sizeof ftv);
1289 if (retlength != sizeof ftv)
1290 {
1291 remote_fileio_return_errno (-1);
1292 return;
1293 }
1294 }
1295 remote_fileio_return_success (ret);
1296 }
1297
1298 static void
1299 remote_fileio_func_isatty (char *buf)
1300 {
1301 long target_fd;
1302 int fd;
1303
1304 /* Parameter: file descriptor */
1305 if (remote_fileio_extract_int (&buf, &target_fd))
1306 {
1307 remote_fileio_ioerror ();
1308 return;
1309 }
1310 remote_fio_no_longjmp = 1;
1311 fd = remote_fileio_map_fd ((int) target_fd);
1312 remote_fileio_return_success (fd == FIO_FD_CONSOLE_IN ||
1313 fd == FIO_FD_CONSOLE_OUT ? 1 : 0);
1314 }
1315
1316 static void
1317 remote_fileio_func_system (char *buf)
1318 {
1319 CORE_ADDR ptrval;
1320 int ret, length, retlength;
1321 char *cmdline = NULL;
1322
1323 /* Parameter: Ptr to commandline / length incl. trailing zero */
1324 if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length))
1325 {
1326 remote_fileio_ioerror ();
1327 return;
1328 }
1329
1330 if (length)
1331 {
1332 /* Request commandline using 'm' packet */
1333 cmdline = alloca (length);
1334 retlength = remote_read_bytes (ptrval, (gdb_byte *) cmdline, length);
1335 if (retlength != length)
1336 {
1337 remote_fileio_ioerror ();
1338 return;
1339 }
1340 }
1341
1342 /* Check if system(3) has been explicitely allowed using the
1343 `set remote system-call-allowed 1' command. If length is 0,
1344 indicating a NULL parameter to the system call, return zero to
1345 indicate a shell is not available. Otherwise fail with EPERM. */
1346 if (!remote_fio_system_call_allowed)
1347 {
1348 if (!length)
1349 remote_fileio_return_success (0);
1350 else
1351 remote_fileio_reply (-1, FILEIO_EPERM);
1352 return;
1353 }
1354
1355 remote_fio_no_longjmp = 1;
1356 ret = system (cmdline);
1357
1358 if (!length)
1359 remote_fileio_return_success (ret);
1360 else if (ret == -1)
1361 remote_fileio_return_errno (-1);
1362 else
1363 remote_fileio_return_success (WEXITSTATUS (ret));
1364 }
1365
1366 static struct {
1367 char *name;
1368 void (*func)(char *);
1369 } remote_fio_func_map[] = {
1370 { "open", remote_fileio_func_open },
1371 { "close", remote_fileio_func_close },
1372 { "read", remote_fileio_func_read },
1373 { "write", remote_fileio_func_write },
1374 { "lseek", remote_fileio_func_lseek },
1375 { "rename", remote_fileio_func_rename },
1376 { "unlink", remote_fileio_func_unlink },
1377 { "stat", remote_fileio_func_stat },
1378 { "fstat", remote_fileio_func_fstat },
1379 { "gettimeofday", remote_fileio_func_gettimeofday },
1380 { "isatty", remote_fileio_func_isatty },
1381 { "system", remote_fileio_func_system },
1382 { NULL, NULL }
1383 };
1384
1385 static int
1386 do_remote_fileio_request (struct ui_out *uiout, void *buf_arg)
1387 {
1388 char *buf = buf_arg;
1389 char *c;
1390 int idx;
1391
1392 remote_fileio_sig_set (remote_fileio_ctrl_c_signal_handler);
1393
1394 c = strchr (++buf, ',');
1395 if (c)
1396 *c++ = '\0';
1397 else
1398 c = strchr (buf, '\0');
1399 for (idx = 0; remote_fio_func_map[idx].name; ++idx)
1400 if (!strcmp (remote_fio_func_map[idx].name, buf))
1401 break;
1402 if (!remote_fio_func_map[idx].name) /* ERROR: No such function. */
1403 return RETURN_ERROR;
1404 remote_fio_func_map[idx].func (c);
1405 return 0;
1406 }
1407
1408 /* Close any open descriptors, and reinitialize the file mapping. */
1409
1410 void
1411 remote_fileio_reset (void)
1412 {
1413 int ix;
1414
1415 for (ix = 0; ix != remote_fio_data.fd_map_size; ix++)
1416 {
1417 int fd = remote_fio_data.fd_map[ix];
1418
1419 if (fd >= 0)
1420 close (fd);
1421 }
1422 if (remote_fio_data.fd_map)
1423 {
1424 xfree (remote_fio_data.fd_map);
1425 remote_fio_data.fd_map = NULL;
1426 remote_fio_data.fd_map_size = 0;
1427 }
1428 }
1429
1430 /* Handle a file I/O request. BUF points to the packet containing the
1431 request. CTRLC_PENDING_P should be nonzero if the target has not
1432 acknowledged the Ctrl-C sent asynchronously earlier. */
1433
1434 void
1435 remote_fileio_request (char *buf, int ctrlc_pending_p)
1436 {
1437 int ex;
1438
1439 remote_fileio_sig_init ();
1440
1441 if (ctrlc_pending_p)
1442 {
1443 /* If the target hasn't responded to the Ctrl-C sent
1444 asynchronously earlier, take this opportunity to send the
1445 Ctrl-C synchronously. */
1446 remote_fio_ctrl_c_flag = 1;
1447 remote_fio_no_longjmp = 0;
1448 remote_fileio_reply (-1, FILEIO_EINTR);
1449 }
1450 else
1451 {
1452 remote_fio_ctrl_c_flag = 0;
1453 remote_fio_no_longjmp = 0;
1454
1455 ex = catch_exceptions (uiout, do_remote_fileio_request, (void *)buf,
1456 RETURN_MASK_ALL);
1457 switch (ex)
1458 {
1459 case RETURN_ERROR:
1460 remote_fileio_reply (-1, FILEIO_ENOSYS);
1461 break;
1462 case RETURN_QUIT:
1463 remote_fileio_reply (-1, FILEIO_EINTR);
1464 break;
1465 default:
1466 break;
1467 }
1468 }
1469
1470 remote_fileio_sig_exit ();
1471 }
1472
1473 static void
1474 set_system_call_allowed (char *args, int from_tty)
1475 {
1476 if (args)
1477 {
1478 char *arg_end;
1479 int val = strtoul (args, &arg_end, 10);
1480 if (*args && *arg_end == '\0')
1481 {
1482 remote_fio_system_call_allowed = !!val;
1483 return;
1484 }
1485 }
1486 error (_("Illegal argument for \"set remote system-call-allowed\" command"));
1487 }
1488
1489 static void
1490 show_system_call_allowed (char *args, int from_tty)
1491 {
1492 if (args)
1493 error (_("Garbage after \"show remote system-call-allowed\" command: `%s'"), args);
1494 printf_unfiltered ("Calling host system(3) call from target is %sallowed\n",
1495 remote_fio_system_call_allowed ? "" : "not ");
1496 }
1497
1498 void
1499 initialize_remote_fileio (struct cmd_list_element *remote_set_cmdlist,
1500 struct cmd_list_element *remote_show_cmdlist)
1501 {
1502 sigint_fileio_token =
1503 create_async_signal_handler (async_remote_fileio_interrupt, NULL);
1504
1505 add_cmd ("system-call-allowed", no_class,
1506 set_system_call_allowed,
1507 _("Set if the host system(3) call is allowed for the target."),
1508 &remote_set_cmdlist);
1509 add_cmd ("system-call-allowed", no_class,
1510 show_system_call_allowed,
1511 _("Show if the host system(3) call is allowed for the target."),
1512 &remote_show_cmdlist);
1513 }
This page took 0.062918 seconds and 4 git commands to generate.