poke-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Fix bug determining the mode of the io space.


From: John Darrington
Subject: Re: [PATCH] Fix bug determining the mode of the io space.
Date: Tue, 31 Dec 2019 09:09:22 +0100
User-agent: NeoMutt/20170113 (1.7.2)

PING!

On Sun, Dec 22, 2019 at 08:12:11PM +0100, John Darrington wrote:
     ---
      ChangeLog                       | 10 ++++++++++
      src/ios-dev-file.c              | 33 ++++++++++++++++++++++-----------
      src/ios-dev.h                   |  4 ++++
      src/ios.c                       |  3 +--
      src/ios.h                       |  1 +
      testsuite/poke.cmd/file-mode.pk |  8 ++++++++
      6 files changed, 46 insertions(+), 13 deletions(-)
      create mode 100644 testsuite/poke.cmd/file-mode.pk
     
     diff --git a/ChangeLog b/ChangeLog
     index ac2e02a..1cb70f5 100644
     --- a/ChangeLog
     +++ b/ChangeLog
     @@ -1,3 +1,13 @@
     +2019-12-22 John Darrington <address@hidden>
     +
     +  * src/ios-dev-file.c (ios_dev_file_open): Use a more reliable
     +  method to determine the file's mode.
     +  (ios_dev_file_get_mode): New function.
     +  * src/ios-dev.h (struct ios_dev_if) [get_mode]: New member.
     +  * src/ios.c (ios_mode): Use method from implementation.
     +  * src/ios.h (IOS_M_RDONLY): New macro.
     +  * testsuite/poke.cmd/file-mode.pk: New file.
     +
      2019-12-21 John Darrington <address@hidden>
      
        * src/pk-file.c (pk_cmd_file): Fix memory leaks and
     diff --git a/src/ios-dev-file.c b/src/ios-dev-file.c
     index fd8a206..8dc366c 100644
     --- a/src/ios-dev-file.c
     +++ b/src/ios-dev-file.c
     @@ -29,6 +29,7 @@
      #include <xalloc.h>
      #include <string.h>
      
     +#include "ios.h"
      #include "ios-dev.h"
      
      /* State associated with a file device.  */
     @@ -37,7 +38,7 @@ struct ios_dev_file
      {
        FILE *file;
        char *filename;
     -  char *mode;
     +  int   mode;
      };
      
      static int
     @@ -50,22 +51,23 @@ ios_dev_file_handler_p (const char *handler)
      static void *
      ios_dev_file_open (const char *handler)
      {
     -  const char *mode;
        struct ios_dev_file *fio;
        FILE *f;
     +  int mode = IOS_M_RDWR;
      
        /* Skip the file:// part in the handler, if needed.  */
        if (strlen (handler) >= 7
            && strncmp (handler, "file://", 7) == 0)
          handler += 7;
      
     -  /* Open the requested file.  The open mode is read-write if
     -     possible.  Otherwise read-only.  */
     -
     -  mode =
     -    access (handler, R_OK | W_OK) != 0 ? "rb" : "r+b";
     -
     -  f = fopen (handler, mode);
     +  /* Open the requested file.  Try read-write initially.
     +     If that fails, then try read-only. */
     +  f = fopen (handler, "r+b");
     +  if (!f)
     +    {
     +      f = fopen (handler, "rb");
     +      mode = IOS_M_RDONLY;
     +    }
        if (!f)
          {
            perror (handler);
     @@ -75,7 +77,7 @@ ios_dev_file_open (const char *handler)
        fio = xmalloc (sizeof (struct ios_dev_file));
        fio->file = f;
        fio->filename = xstrdup (handler);
     -  fio->mode = xstrdup (mode);
     +  fio->mode = mode;
      
        return fio;
      }
     @@ -88,12 +90,20 @@ ios_dev_file_close (void *iod)
        if (fclose (fio->file) != 0)
          perror (fio->filename);
        free (fio->filename);
     -  free (fio->mode);
      
        return 1;
      }
      
      static int
     +ios_dev_file_get_mode (void *iod)
     +{
     +  struct ios_dev_file *fio = iod;
     +
     +  return fio->mode;
     +}
     +
     +
     +static int
      ios_dev_file_getc (void *iod)
      {
        struct ios_dev_file *fio = iod;
     @@ -145,4 +155,5 @@ struct ios_dev_if ios_dev_file =
         .seek = ios_dev_file_seek,
         .get_c = ios_dev_file_getc,
         .put_c = ios_dev_file_putc,
     +   .get_mode = ios_dev_file_get_mode,
        };
     diff --git a/src/ios-dev.h b/src/ios-dev.h
     index 7f8579d..432a219 100644
     --- a/src/ios-dev.h
     +++ b/src/ios-dev.h
     @@ -81,4 +81,8 @@ struct ios_dev_if
           the character written as an int, or IOD_EOF on error.  */
      
        int (*put_c) (void *dev, int c);
     +
     +  /* Return the mode of the device, as it was opened.  */
     +
     +  int (*get_mode) (void *dev);
      };
     diff --git a/src/ios.c b/src/ios.c
     index 757ada3..c3dd1e1 100644
     --- a/src/ios.c
     +++ b/src/ios.c
     @@ -113,7 +113,6 @@ struct ios
        char *handler;
        void *dev;
        struct ios_dev_if *dev_if;
     -  int mode;
      
        struct ios *next;
      };
     @@ -230,7 +229,7 @@ ios_close (ios io)
      int
      ios_mode (ios io)
      {
     -  return io->mode;
     +  return io->dev_if->get_mode (io->dev);
      }
      
      ios_off
     diff --git a/src/ios.h b/src/ios.h
     index b0647f6..85055b7 100644
     --- a/src/ios.h
     +++ b/src/ios.h
     @@ -125,6 +125,7 @@ void ios_close (ios io);
         are summarized in the IOS_M_* constants, also defined below.  */
      
      #define IOS_M_RDWR 1
     +#define IOS_M_RDONLY 2
      
      int ios_mode (ios io);
      
     diff --git a/testsuite/poke.cmd/file-mode.pk 
b/testsuite/poke.cmd/file-mode.pk
     new file mode 100644
     index 0000000..bb5402c
     --- /dev/null
     +++ b/testsuite/poke.cmd/file-mode.pk
     @@ -0,0 +1,8 @@
     +/* { dg-do run } */
     +
     +/* { dg-command { .file /etc/passwd } } */
     +/* { dg-command { .file /dev/null } } */
     +/* { dg-command { .info files } } */
     +/* { dg-output "  Id    Mode    Position        Filename\n
     +* #0    rw      0x00000000#b    file:///dev/null\n
     +  #1    r       0x00000000#b    file:///etc/passwd\n" } */
     -- 
     2.11.0



reply via email to

[Prev in Thread] Current Thread [Next in Thread]