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