* elf32-bfin.c (bfin_howto_table): Set src_mask to 0 for all relocs.
[deliverable/binutils-gdb.git] / gdb / remote-fileio.c
index 5fa387f79deabd1b8cf8e9c0953f5925ba8b9e22..9c2e43006268a6bd10b91c63315d4ebda057a07c 100644 (file)
@@ -1,6 +1,6 @@
 /* Remote File-I/O communications
 
-   Copyright 2003 Free Software Foundation, Inc.
+   Copyright 2003, 2005 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "gdbcmd.h"
 #include "remote.h"
 #include "gdb/fileio.h"
+#include "gdb_wait.h"
+#include "gdb_stat.h"
+#include "exceptions.h"
+#include "remote-fileio.h"
 
-#include <ctype.h>
 #include <fcntl.h>
 #include <sys/time.h>
-#ifdef USG
-#include <sys/types.h>
-#endif
-#include <sys/stat.h>
 #ifdef __CYGWIN__
-#include <sys/cygwin.h>
+#include <sys/cygwin.h>                /* For cygwin_conv_to_full_posix_path.  */
 #endif
-#include <setjmp.h>
 #include <signal.h>
 
 static struct {
@@ -52,7 +50,7 @@ static struct {
 static int remote_fio_system_call_allowed = 0;
 
 static int
-remote_fileio_init_fd_map ()
+remote_fileio_init_fd_map (void)
 {
   int i;
 
@@ -70,7 +68,7 @@ remote_fileio_init_fd_map ()
 }
 
 static int
-remote_fileio_resize_fd_map ()
+remote_fileio_resize_fd_map (void)
 {
   if (!remote_fio_data.fd_map)
     return remote_fileio_init_fd_map ();
@@ -82,7 +80,7 @@ remote_fileio_resize_fd_map ()
 }
 
 static int
-remote_fileio_next_free_fd ()
+remote_fileio_next_free_fd (void)
 {
   int i;
 
@@ -164,22 +162,32 @@ remote_fileio_mode_to_host (long mode, int open_call)
     hmode |= S_IWUSR;
   if (mode & FILEIO_S_IXUSR)
     hmode |= S_IXUSR;
+#ifdef S_IRGRP
   if (mode & FILEIO_S_IRGRP)
     hmode |= S_IRGRP;
+#endif
+#ifdef S_IWGRP
   if (mode & FILEIO_S_IWGRP)
     hmode |= S_IWGRP;
+#endif
+#ifdef S_IXGRP
   if (mode & FILEIO_S_IXGRP)
     hmode |= S_IXGRP;
+#endif
   if (mode & FILEIO_S_IROTH)
     hmode |= S_IROTH;
+#ifdef S_IWOTH
   if (mode & FILEIO_S_IWOTH)
     hmode |= S_IWOTH;
+#endif
+#ifdef S_IXOTH
   if (mode & FILEIO_S_IXOTH)
     hmode |= S_IXOTH;
+#endif
   return hmode;
 }
 
-static long long
+static LONGEST
 remote_fileio_mode_to_target (mode_t mode)
 {
   mode_t tmode = 0;
@@ -196,18 +204,28 @@ remote_fileio_mode_to_target (mode_t mode)
     tmode |= FILEIO_S_IWUSR;
   if (mode & S_IXUSR)
     tmode |= FILEIO_S_IXUSR;
+#ifdef S_IRGRP
   if (mode & S_IRGRP)
     tmode |= FILEIO_S_IRGRP;
+#endif
+#ifdef S_IWRGRP
   if (mode & S_IWGRP)
     tmode |= FILEIO_S_IWGRP;
+#endif
+#ifdef S_IXGRP
   if (mode & S_IXGRP)
     tmode |= FILEIO_S_IXGRP;
+#endif
   if (mode & S_IROTH)
     tmode |= FILEIO_S_IROTH;
+#ifdef S_IWOTH
   if (mode & S_IWOTH)
     tmode |= FILEIO_S_IWOTH;
+#endif
+#ifdef S_IXOTH
   if (mode & S_IXOTH)
     tmode |= FILEIO_S_IXOTH;
+#endif
   return tmode;
 }
 
@@ -285,7 +303,7 @@ remote_fileio_seek_flag_to_host (long num, int *flag)
 }
 
 static int
-remote_fileio_extract_long (char **buf, long long *retlong)
+remote_fileio_extract_long (char **buf, LONGEST *retlong)
 {
   char *c;
   int sign = 1;
@@ -324,11 +342,12 @@ static int
 remote_fileio_extract_int (char **buf, long *retint)
 {
   int ret;
-  long long retlong;
+  LONGEST retlong;
 
   if (!retint)
     return -1;
-  if (!(ret = remote_fileio_extract_long (buf, &retlong)))
+  ret = remote_fileio_extract_long (buf, &retlong);
+  if (!ret)
     *retint = (long) retlong;
   return ret;
 }
@@ -337,7 +356,7 @@ static int
 remote_fileio_extract_ptr_w_len (char **buf, CORE_ADDR *ptrval, int *length)
 {
   char *c;
-  long long retlong;
+  LONGEST retlong;
 
   if (!buf || !*buf || !**buf || !ptrval || !length)
     return -1;
@@ -357,7 +376,7 @@ remote_fileio_extract_ptr_w_len (char **buf, CORE_ADDR *ptrval, int *length)
 
 /* Convert to big endian */
 static void
-remote_fileio_to_be (long long num, char *buf, int bytes)
+remote_fileio_to_be (LONGEST num, char *buf, int bytes)
 {
   int i;
 
@@ -365,16 +384,10 @@ remote_fileio_to_be (long long num, char *buf, int bytes)
     buf[i] = (num >> (8 * (bytes - i - 1))) & 0xff;
 }
 
-static void
-remote_fileio_to_fio_int (long num, fio_int_t fnum)
-{
-  remote_fileio_to_be ((long long) num, (char *) fnum, 4);
-}
-
 static void
 remote_fileio_to_fio_uint (long num, fio_uint_t fnum)
 {
-  remote_fileio_to_be ((long long) num, (char *) fnum, 4);
+  remote_fileio_to_be ((LONGEST) num, (char *) fnum, 4);
 }
 
 static void
@@ -386,17 +399,17 @@ remote_fileio_to_fio_mode (mode_t num, fio_mode_t fnum)
 static void
 remote_fileio_to_fio_time (time_t num, fio_time_t fnum)
 {
-  remote_fileio_to_be ((long long) num, (char *) fnum, 4);
+  remote_fileio_to_be ((LONGEST) num, (char *) fnum, 4);
 }
 
 static void
-remote_fileio_to_fio_long (long long num, fio_long_t fnum)
+remote_fileio_to_fio_long (LONGEST num, fio_long_t fnum)
 {
   remote_fileio_to_be (num, (char *) fnum, 8);
 }
 
 static void
-remote_fileio_to_fio_ulong (long long num, fio_ulong_t fnum)
+remote_fileio_to_fio_ulong (LONGEST num, fio_ulong_t fnum)
 {
   remote_fileio_to_be (num, (char *) fnum, 8);
 }
@@ -404,6 +417,8 @@ remote_fileio_to_fio_ulong (long long num, fio_ulong_t fnum)
 static void
 remote_fileio_to_fio_stat (struct stat *st, struct fio_stat *fst)
 {
+  LONGEST blksize;
+
   /* `st_dev' is set in the calling function */
   remote_fileio_to_fio_uint ((long) st->st_ino, fst->fst_ino);
   remote_fileio_to_fio_mode (st->st_mode, fst->fst_mode);
@@ -411,9 +426,23 @@ remote_fileio_to_fio_stat (struct stat *st, struct fio_stat *fst)
   remote_fileio_to_fio_uint ((long) st->st_uid, fst->fst_uid);
   remote_fileio_to_fio_uint ((long) st->st_gid, fst->fst_gid);
   remote_fileio_to_fio_uint ((long) st->st_rdev, fst->fst_rdev);
-  remote_fileio_to_fio_ulong ((long long) st->st_size, fst->fst_size);
-  remote_fileio_to_fio_ulong ((long long) st->st_blksize, fst->fst_blksize);
-  remote_fileio_to_fio_ulong ((long long) st->st_blocks, fst->fst_blocks);
+  remote_fileio_to_fio_ulong ((LONGEST) st->st_size, fst->fst_size);
+#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
+  blksize = st->st_blksize;
+#else
+  blksize = 512;
+#endif
+  remote_fileio_to_fio_ulong (blksize, fst->fst_blksize);
+#if HAVE_STRUCT_STAT_ST_BLOCKS
+  remote_fileio_to_fio_ulong ((LONGEST) st->st_blocks, fst->fst_blocks);
+#else
+  /* FIXME: This is correct for DJGPP, but other systems that don't
+     have st_blocks, if any, might prefer 512 instead of st_blksize.
+     (eliz, 30-12-2003)  */
+  remote_fileio_to_fio_ulong (((LONGEST) st->st_size + blksize - 1)
+                             / blksize,
+                             fst->fst_blocks);
+#endif
   remote_fileio_to_fio_time (st->st_atime, fst->fst_atime);
   remote_fileio_to_fio_time (st->st_mtime, fst->fst_mtime);
   remote_fileio_to_fio_time (st->st_ctime, fst->fst_ctime);
@@ -428,7 +457,6 @@ remote_fileio_to_fio_timeval (struct timeval *tv, struct fio_timeval *ftv)
 
 static int remote_fio_ctrl_c_flag = 0;
 static int remote_fio_no_longjmp = 0;
-jmp_buf remote_fio_jmp_buf;
 
 #if defined (HAVE_SIGACTION) && defined (SA_RESTART)
 static struct sigaction remote_fio_sa;
@@ -438,7 +466,7 @@ static void (*remote_fio_ofunc)(int);
 #endif
 
 static void
-remote_fileio_sig_init ()
+remote_fileio_sig_init (void)
 {
 #if defined (HAVE_SIGACTION) && defined (SA_RESTART)
   remote_fio_sa.sa_handler = SIG_IGN;
@@ -464,7 +492,7 @@ remote_fileio_sig_set (void (*sigint_func)(int))
 }
 
 static void
-remote_fileio_sig_exit ()
+remote_fileio_sig_exit (void)
 {
 #if defined (HAVE_SIGACTION) && defined (SA_RESTART)
   sigaction (SIGINT, &remote_fio_osa, NULL);
@@ -479,7 +507,7 @@ remote_fileio_ctrl_c_signal_handler (int signo)
   remote_fileio_sig_set (SIG_IGN);
   remote_fio_ctrl_c_flag = 1;
   if (!remote_fio_no_longjmp)
-    throw_exception (RETURN_QUIT);
+    deprecated_throw_reason (RETURN_QUIT);
   remote_fileio_sig_set (remote_fileio_ctrl_c_signal_handler);
 }
 
@@ -514,13 +542,13 @@ remote_fileio_reply (int retcode, int error)
 }
 
 static void
-remote_fileio_ioerror ()
+remote_fileio_ioerror (void)
 {
   remote_fileio_reply (-1, FILEIO_EIO);
 }
 
 static void
-remote_fileio_badfd ()
+remote_fileio_badfd (void)
 {
   remote_fileio_reply (-1, FILEIO_EBADF);
 }
@@ -639,7 +667,8 @@ remote_fileio_func_close (char *buf)
       remote_fileio_ioerror ();
       return;
     }
-  if ((fd = remote_fileio_map_fd ((int) num)) == FIO_FD_INVALID)
+  fd = remote_fileio_map_fd ((int) num);
+  if (fd == FIO_FD_INVALID)
     {
       remote_fileio_badfd ();
       return;
@@ -656,7 +685,7 @@ static void
 remote_fileio_func_read (char *buf)
 {
   long target_fd, num;
-  long long lnum;
+  LONGEST lnum;
   CORE_ADDR ptrval;
   int fd, ret, retlength;
   char *buffer;
@@ -669,7 +698,8 @@ remote_fileio_func_read (char *buf)
       remote_fileio_ioerror ();
       return;
     }
-  if ((fd = remote_fileio_map_fd ((int) target_fd)) == FIO_FD_INVALID)
+  fd = remote_fileio_map_fd ((int) target_fd);
+  if (fd == FIO_FD_INVALID)
     {
       remote_fileio_badfd ();
       return;
@@ -773,7 +803,7 @@ static void
 remote_fileio_func_write (char *buf)
 {
   long target_fd, num;
-  long long lnum;
+  LONGEST lnum;
   CORE_ADDR ptrval;
   int fd, ret, retlength;
   char *buffer;
@@ -785,7 +815,8 @@ remote_fileio_func_write (char *buf)
       remote_fileio_ioerror ();
       return;
     }
-  if ((fd = remote_fileio_map_fd ((int) target_fd)) == FIO_FD_INVALID)
+  fd = remote_fileio_map_fd ((int) target_fd);
+  if (fd == FIO_FD_INVALID)
     {
       remote_fileio_badfd ();
       return;
@@ -845,7 +876,7 @@ static void
 remote_fileio_func_lseek (char *buf)
 {
   long num;
-  long long lnum;
+  LONGEST lnum;
   int fd, flag;
   off_t offset, ret;
 
@@ -855,7 +886,8 @@ remote_fileio_func_lseek (char *buf)
       remote_fileio_ioerror ();
       return;
     }
-  if ((fd = remote_fileio_map_fd ((int) num)) == FIO_FD_INVALID)
+  fd = remote_fileio_map_fd ((int) num);
+  if (fd == FIO_FD_INVALID)
     {
       remote_fileio_badfd ();
       return;
@@ -933,10 +965,10 @@ remote_fileio_func_rename (char *buf)
     }
   
   /* Only operate on regular files and directories */
-  if ((!(of = stat (oldpath, &ost))
-       && !S_ISREG (ost.st_mode) && !S_ISDIR (ost.st_mode))
-      || (!(nf = stat (newpath, &nst))
-          && !S_ISREG (nst.st_mode) && !S_ISDIR (nst.st_mode)))
+  of = stat (oldpath, &ost);
+  nf = stat (newpath, &nst);
+  if ((!of && !S_ISREG (ost.st_mode) && !S_ISDIR (ost.st_mode))
+      || (!nf && !S_ISREG (nst.st_mode) && !S_ISDIR (nst.st_mode)))
     {
       remote_fileio_reply (-1, FILEIO_EACCES);
       return;
@@ -1032,7 +1064,7 @@ remote_fileio_func_stat (char *buf)
   CORE_ADDR ptrval;
   int ret, length, retlength;
   char *pathname;
-  long long lnum;
+  LONGEST lnum;
   struct stat st;
   struct fio_stat fst;
 
@@ -1094,7 +1126,7 @@ remote_fileio_func_fstat (char *buf)
   CORE_ADDR ptrval;
   int fd, ret, retlength;
   long target_fd;
-  long long lnum;
+  LONGEST lnum;
   struct stat st;
   struct fio_stat fst;
   struct timeval tv;
@@ -1105,7 +1137,8 @@ remote_fileio_func_fstat (char *buf)
       remote_fileio_ioerror ();
       return;
     }
-  if ((fd = remote_fileio_map_fd ((int) target_fd)) == FIO_FD_INVALID)
+  fd = remote_fileio_map_fd ((int) target_fd);
+  if (fd == FIO_FD_INVALID)
     {
       remote_fileio_badfd ();
       return;
@@ -1124,12 +1157,24 @@ remote_fileio_func_fstat (char *buf)
       remote_fileio_to_fio_uint (1, fst.fst_dev);
       st.st_mode = S_IFCHR | (fd == FIO_FD_CONSOLE_IN ? S_IRUSR : S_IWUSR);
       st.st_nlink = 1;
+#ifdef HAVE_GETUID
       st.st_uid = getuid ();
+#else
+      st.st_uid = 0;
+#endif
+#ifdef HAVE_GETGID
       st.st_gid = getgid ();
+#else
+      st.st_gid = 0;
+#endif
       st.st_rdev = 0;
       st.st_size = 0;
+#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
       st.st_blksize = 512;
+#endif
+#if HAVE_STRUCT_STAT_ST_BLOCKS
       st.st_blocks = 0;
+#endif
       if (!gettimeofday (&tv, NULL))
        st.st_atime = st.st_mtime = st.st_ctime = tv.tv_sec;
       else
@@ -1161,7 +1206,7 @@ remote_fileio_func_fstat (char *buf)
 static void
 remote_fileio_func_gettimeofday (char *buf)
 {
-  long long lnum;
+  LONGEST lnum;
   CORE_ADDR ptrval;
   int ret, retlength;
   struct timeval tv;
@@ -1321,7 +1366,7 @@ remote_fileio_request (char *buf)
   remote_fio_no_longjmp = 0;
 
   ex = catch_exceptions (uiout, do_remote_fileio_request, (void *)buf,
-                        NULL, RETURN_MASK_ALL);
+                        RETURN_MASK_ALL);
   switch (ex)
     {
       case RETURN_ERROR:
@@ -1350,14 +1395,14 @@ set_system_call_allowed (char *args, int from_tty)
          return;
        }
     }
-  error ("Illegal argument for \"set remote system-call-allowed\" command");
+  error (_("Illegal argument for \"set remote system-call-allowed\" command"));
 }
 
 static void
 show_system_call_allowed (char *args, int from_tty)
 {
   if (args)
-    error ("Garbage after \"show remote system-call-allowed\" command: `%s'", args);
+    error (_("Garbage after \"show remote system-call-allowed\" command: `%s'"), args);
   printf_unfiltered ("Calling host system(3) call from target is %sallowed\n",
                     remote_fio_system_call_allowed ? "" : "not ");
 }
@@ -1368,10 +1413,10 @@ initialize_remote_fileio (struct cmd_list_element *remote_set_cmdlist,
 {
   add_cmd ("system-call-allowed", no_class,
           set_system_call_allowed,
-          "Set if the host system(3) call is allowed for the target.\n",
+          _("Set if the host system(3) call is allowed for the target."),
           &remote_set_cmdlist);
   add_cmd ("system-call-allowed", no_class,
           show_system_call_allowed,
-          "Show if the host system(3) call is allowed for the target.\n",
+          _("Show if the host system(3) call is allowed for the target."),
           &remote_show_cmdlist);
 }
This page took 0.030132 seconds and 4 git commands to generate.