public inbox for cygwin-apps-cvs@sourceware.org
help / color / mirror / Atom feed
* [setup - the official Cygwin setup program] branch master, updated. release_2.925-4-g64a12e7e9021
@ 2023-02-05 21:43 Corinna Vinschen
  0 siblings, 0 replies; only message in thread
From: Corinna Vinschen @ 2023-02-05 21:43 UTC (permalink / raw)
  To: cygwin-apps-cvs




https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=64a12e7e9021e50cb935bc8fc973cee4d673f108

commit 64a12e7e9021e50cb935bc8fc973cee4d673f108
Author: Corinna Vinschen <corinna@vinschen.de>
Date:   Sun Feb 5 20:30:57 2023 +0100

    io_stream: peek: call own read method rather than fread
    
    This fixes the caller's expectation that peek returns a negative value
    on error.

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=44d31ea07407104d2317e31800704538d0c3093a

commit 44d31ea07407104d2317e31800704538d0c3093a
Author: Corinna Vinschen <corinna@vinschen.de>
Date:   Sat Feb 4 22:12:34 2023 +0100

    Use off_t more consistently for file offsets and file size
    
    - Change the seek and tell methods to off_t in the first place,
      and use fseeko/ftello throughout.
    - Change class members holding file sizes and offsets to off_t,
      use matching casts.
    - Use strtoll rather than sscanf to read octal file length
      in tar archives.  It's faster and typesafe.
    - Use off_t as argument types for progress bar functions.
    
    Additionally:
    
    - Reformat io_stream_memory.h, which was next to unreadable
      due to bad formatting.

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=4e30c4f6248fefa439a5b4e34dae260d01b25408

commit 4e30c4f6248fefa439a5b4e34dae260d01b25408
Author: Corinna Vinschen <corinna@vinschen.de>
Date:   Sat Feb 4 21:06:10 2023 +0100

    io_stream: read/write: always return -1 on error
    
    io_stream::read and io_stream::write are defined as ssize_t, and most
    of the callers expect -1 in case of an error.
    
    However, io_stream_file and io_stream_cygfile both use fread/fwrite and
    return their return value unchanged.  Both functions return a size_t and
    return 0 in both cases, EOF and error.
    
    Fix this by checking the return value of fread and fwrite and return -1
    in case of an error.
    
    Change the two callers calling read and expecting 0 to indicate EOF and
    error accordingly.


Diff:
---
 UserSettings.cc      |  2 +-
 archive.h            |  2 +-
 archive_tar.cc       | 10 ++++-----
 archive_tar.h        | 12 +++++-----
 archive_tar_file.cc  | 10 ++++-----
 compress.h           |  2 +-
 compress_bz.cc       |  8 +++----
 compress_bz.h        |  4 ++--
 compress_gz.cc       | 14 +++++++-----
 compress_gz.h        |  6 ++---
 compress_xz.cc       | 11 +++++----
 compress_xz.h        |  4 ++--
 compress_zstd.cc     |  8 +++----
 compress_zstd.h      |  4 ++--
 gpg-packet.cc        |  2 +-
 install.cc           | 10 ++++-----
 io_stream.h          |  4 ++--
 io_stream_cygfile.cc | 55 ++++++++++++++++++++++++++++++++-------------
 io_stream_cygfile.h  |  4 ++--
 io_stream_file.cc    | 58 ++++++++++++++++++++++++++++++++---------------
 io_stream_file.h     |  4 ++--
 io_stream_memory.cc  |  2 +-
 io_stream_memory.h   | 63 +++++++++++++++++++++++++++++++++++++++++-----------
 threebar.cc          |  6 ++---
 threebar.h           |  6 ++---
 25 files changed, 199 insertions(+), 112 deletions(-)

diff --git a/UserSettings.cc b/UserSettings.cc
index d0bb4ef497dc..514972556ebf 100644
--- a/UserSettings.cc
+++ b/UserSettings.cc
@@ -33,7 +33,7 @@ public:
   ssize_t write (const void *buffer, size_t len) {return 0;}
   ssize_t peek (void *buffer, size_t len) {return 0;}
   long tell () {return 0;}
-  int seek (long, io_stream_seek_t) {return 0;}
+  off_t seek (off_t, io_stream_seek_t) {return 0;}
   int error () {return 0;}
   void operator << (std::string);
   void operator << (const char *);
diff --git a/archive.h b/archive.h
index adab9f0f2da9..1299eb12c647 100644
--- a/archive.h
+++ b/archive.h
@@ -70,7 +70,7 @@ public:
    * Could be made valid via the read-child-directly model 
    */
 
-  virtual int seek (long offset, io_stream_seek_t whence) = 0;
+  virtual off_t seek (off_t offset, io_stream_seek_t whence) = 0;
 
   /* Find out the next stream name -
    * ie for foo.tar.gz, at offset 0, next_file_name = foo.tar
diff --git a/archive_tar.cc b/archive_tar.cc
index 63269a61c2c6..ec7b003dd109 100644
--- a/archive_tar.cc
+++ b/archive_tar.cc
@@ -82,14 +82,14 @@ archive_tar::error ()
   return state.lasterr;
 }
 
-long
+off_t
 archive_tar::tell ()
 {
   return state.file_offset;
 }
 
-int
-archive_tar::seek (long where, io_stream_seek_t whence)
+off_t
+archive_tar::seek (off_t where, io_stream_seek_t whence)
 {
   /* Because the parent stream is compressed, we can only easily support
      seek()-ing to rewind to the start */
@@ -166,7 +166,7 @@ archive_tar::next_file_name ()
       state.have_longlink = 0;
     }
 
-  sscanf (state.tar_header.size, "%zo", &state.file_length);
+  state.file_length = strtoll (state.tar_header.size, NULL, 8);
   state.file_offset = 0;
 
   if (_tar_verbose)
@@ -190,7 +190,7 @@ archive_tar::next_file_name ()
                           CYG_PATH_MAX);
 	  err++;
 	  state.parent->read (&state.tar_header, 512);
-	  sscanf (state.tar_header.size, "%zo", &state.file_length);
+	  state.file_length = strtoll (state.tar_header.size, NULL, 8);
 	  state.file_offset = 0;
 	  skip_file ();
 	  return next_file_name ();
diff --git a/archive_tar.h b/archive_tar.h
index 3adc05606831..da8eaa667f80 100644
--- a/archive_tar.h
+++ b/archive_tar.h
@@ -68,8 +68,8 @@ public:
   char have_longname;
   bool have_longlink;
   /* where in the current file are we? */
-  size_t file_offset;
-  size_t file_length;
+  off_t file_offset;
+  off_t file_length;
   int header_read;
   tar_header_type tar_header;
   char filename[CYG_PATH_MAX + 512];
@@ -88,8 +88,8 @@ public:
   virtual ssize_t write (const void *buffer, size_t len);
   /* read data without removing it from the class's internal buffer */
   virtual ssize_t peek (void *buffer, size_t len);
-  virtual long tell ();
-  virtual int seek (long where, io_stream_seek_t whence);
+  virtual off_t tell ();
+  virtual off_t seek (off_t where, io_stream_seek_t whence);
   /* try guessing this one */
   virtual int error ();
   virtual time_t get_mtime ();
@@ -112,8 +112,8 @@ public:
   virtual ssize_t write (const void *buffer, size_t len);
   /* read data without removing it from the class's internal buffer */
   virtual ssize_t peek (void *buffer, size_t len);
-  virtual long tell ();
-  virtual int seek (long where, io_stream_seek_t whence);
+  virtual off_t tell ();
+  virtual off_t seek (off_t where, io_stream_seek_t whence);
   /* try guessing this one */
   virtual int error ();
   /* Find out the next stream name -
diff --git a/archive_tar_file.cc b/archive_tar_file.cc
index 87e54df0de9a..1b4367739394 100644
--- a/archive_tar_file.cc
+++ b/archive_tar_file.cc
@@ -38,7 +38,7 @@ ssize_t archive_tar_file::read (void *buffer, size_t len)
 {
   /* how many bytes do we want to give the user */
   int
-    want = std::min (len, state.file_length - state.file_offset);
+    want = std::min ((off_t) len, state.file_length - state.file_offset);
   /* how many do we need to read after that to line up the file pointer */
   int
     roundup = (512 - (want % 512)) % 512;
@@ -95,7 +95,7 @@ ssize_t archive_tar_file::write (const void *buffer, size_t len)
 ssize_t archive_tar_file::peek (void *buffer, size_t len)
 {
   int
-    want = std::min (len, state.file_length - state.file_offset);
+    want = std::min ((off_t) len, state.file_length - state.file_offset);
   if (want)
     {
       ssize_t
@@ -115,14 +115,14 @@ ssize_t archive_tar_file::peek (void *buffer, size_t len)
   return 0;
 }
 
-long
+off_t
 archive_tar_file::tell ()
 {
   return state.file_offset;
 }
 
-int
-archive_tar_file::seek (long where, io_stream_seek_t whence)
+off_t
+archive_tar_file::seek (off_t where, io_stream_seek_t whence)
 {
   /* nothing needs seeking here yet. Implement when needed 
    */
diff --git a/compress.h b/compress.h
index 691313382ac1..1692fa6ddc6e 100644
--- a/compress.h
+++ b/compress.h
@@ -37,7 +37,7 @@ public:
   virtual ssize_t write (const void *buffer, size_t len) = 0;
   /* read data without removing it from the class's internal buffer */
   virtual ssize_t peek (void *buffer, size_t len) = 0;
-  virtual long tell () = 0;
+  virtual off_t tell () = 0;
   /* try guessing this one */
   virtual int error () = 0;
   /* Find out the next stream name -
diff --git a/compress_bz.cc b/compress_bz.cc
index e4792d649123..d801de1e6bfc 100644
--- a/compress_bz.cc
+++ b/compress_bz.cc
@@ -187,7 +187,7 @@ ssize_t compress_bz::peek (void *buffer, size_t len)
   return 0;
 }
 
-long
+off_t
 compress_bz::tell ()
 {
   if (writing)
@@ -196,12 +196,12 @@ compress_bz::tell ()
   return position;
 }
 
-int
-compress_bz::seek (long where, io_stream_seek_t whence)
+off_t
+compress_bz::seek (off_t where, io_stream_seek_t whence)
 {
   if ((whence == IO_SEEK_SET) && (where == 0))
     {
-      int result = original->seek(where, whence);
+      off_t result = original->seek(where, whence);
       init_state();
       return result;
     }
diff --git a/compress_bz.h b/compress_bz.h
index a7e865a0d55b..9ab59d709be6 100644
--- a/compress_bz.h
+++ b/compress_bz.h
@@ -33,8 +33,8 @@ public:
   virtual ssize_t write (const void *buffer, size_t len);
   /* read data without removing it from the class's internal buffer */
   virtual ssize_t peek (void *buffer, size_t len);
-  virtual long tell ();
-  virtual int seek (long where, io_stream_seek_t whence);
+  virtual off_t tell ();
+  virtual off_t seek (off_t where, io_stream_seek_t whence);
   /* try guessing this one */
   virtual int error ();
   /* Find out the next stream name -
diff --git a/compress_gz.cc b/compress_gz.cc
index e73ccd331551..c7d6d1af1cf3 100644
--- a/compress_gz.cc
+++ b/compress_gz.cc
@@ -282,11 +282,12 @@ compress_gz::read (void *buffer, size_t len)
 
 	  errno = 0;
 	  stream.avail_in = original->read (inbuf, 16384);
-	  if (stream.avail_in == 0)
+	  if (stream.avail_in <= 0)
 	    {
 	      z_eof = 1;
 	      if (original->error ())
 		{
+		  stream.avail_in = 0;
 		  z_err = Z_ERRNO;
 		  break;
 		}
@@ -408,18 +409,18 @@ compress_gz::peek (void *buffer, size_t len)
     }
 }
 
-long
+off_t
 compress_gz::tell ()
 {
   throw new std::logic_error("compress_gz::tell is not implemented");
 }
 
-int
-compress_gz::seek (long where, io_stream_seek_t whence)
+off_t
+compress_gz::seek (off_t where, io_stream_seek_t whence)
 {
   if ((whence == IO_SEEK_SET) && (where == 0))
     {
-      int result = original->seek(where, whence);
+      off_t result = original->seek(where, whence);
       destroy();
       construct();
       return result;
@@ -566,11 +567,12 @@ compress_gz::get_byte ()
     {
       errno = 0;
       stream.avail_in = original->read (inbuf, 16384);
-      if (stream.avail_in == 0)
+      if (stream.avail_in <= 0)
 	{
 	  z_eof = 1;
 	  if (original->error ())
 	    z_err = Z_ERRNO;
+	  stream.avail_in = 0;
 	  return EOF;
 	}
       stream.next_in = inbuf;
diff --git a/compress_gz.h b/compress_gz.h
index 90073e5ddbbc..c7ae14b228e6 100644
--- a/compress_gz.h
+++ b/compress_gz.h
@@ -32,8 +32,8 @@ public:
   virtual ssize_t write (const void *buffer, size_t len);
   /* read data without removing it from the class's internal buffer */
   virtual ssize_t peek (void *buffer, size_t len);
-  virtual long tell ();
-  virtual int seek (long where, io_stream_seek_t whence);
+  virtual off_t tell ();
+  virtual off_t seek (off_t where, io_stream_seek_t whence);
   /* try guessing this one */
   virtual int error ();
   /* Find out the next stream name -
@@ -80,7 +80,7 @@ private:
   char *msg;			/* error message */
   int transparent;		/* 1 if input file is not a .gz file */
   char mode;			/* 'w' or 'r' */
-  long startpos;		/* start of compressed data in file (header skipped) */
+  off_t startpos;		/* start of compressed data in file (header skipped) */
 };
 
 #endif /* SETUP_COMPRESS_GZ_H */
diff --git a/compress_xz.cc b/compress_xz.cc
index d3f4886c3cd9..b91c8a44ab97 100644
--- a/compress_xz.cc
+++ b/compress_xz.cc
@@ -155,6 +155,9 @@ compress_xz::read (void *buffer, size_t len)
         {
 	  /* no compressed data ready; read some more */
           state->in_size = (size_t) this->original->read(state->in_block, state->in_block_size);
+	  /* We don't care for error vs EOF */
+	  if (state->in_size < 0)
+	    state->in_size = 0;
           state->in_pos = 0;
         }
 
@@ -263,18 +266,18 @@ compress_xz::peek (void *buffer, size_t len)
   return 0;
 }
 
-long
+off_t
 compress_xz::tell ()
 {
   throw new std::logic_error("compress_xz::tell is not implemented");
 }
 
-int
-compress_xz::seek (long where, io_stream_seek_t whence)
+off_t
+compress_xz::seek (off_t where, io_stream_seek_t whence)
 {
   if ((whence == IO_SEEK_SET) && (where == 0))
     {
-      int result = original->seek(where, whence);
+      off_t result = original->seek(where, whence);
       destroy ();
       peeklen = 0;
       lasterr = 0;
diff --git a/compress_xz.h b/compress_xz.h
index 31d499c372a4..9be78225fb79 100644
--- a/compress_xz.h
+++ b/compress_xz.h
@@ -26,8 +26,8 @@ public:
   virtual ssize_t read (void *buffer, size_t len);
   virtual ssize_t write (const void *buffer, size_t len); /* not implemented */
   virtual ssize_t peek (void *buffer, size_t len);
-  virtual long tell (); /* not implemented */
-  virtual int seek (long where, io_stream_seek_t whence);
+  virtual off_t tell (); /* not implemented */
+  virtual off_t seek (off_t where, io_stream_seek_t whence);
   virtual int error ();
   virtual const char *next_file_name () { return NULL; };
   virtual int set_mtime (time_t);
diff --git a/compress_zstd.cc b/compress_zstd.cc
index bb17785423a9..8d6e51f73a6c 100644
--- a/compress_zstd.cc
+++ b/compress_zstd.cc
@@ -175,18 +175,18 @@ compress_zstd::peek (void *buffer, size_t len)
   return got;
 }
 
-long
+off_t
 compress_zstd::tell ()
 {
   throw new std::logic_error("compress_zstd::tell is not implemented");
 }
 
-int
-compress_zstd::seek (long where, io_stream_seek_t whence)
+off_t
+compress_zstd::seek (off_t where, io_stream_seek_t whence)
 {
   if ((whence == IO_SEEK_SET) && (where == 0))
     {
-      int result = original->seek(where, whence);
+      off_t result = original->seek(where, whence);
       destroy();
       create();
       return result;
diff --git a/compress_zstd.h b/compress_zstd.h
index 3303daa4d02f..b9b541e8fb36 100644
--- a/compress_zstd.h
+++ b/compress_zstd.h
@@ -24,8 +24,8 @@ public:
   virtual ssize_t read (void *buffer, size_t len);
   virtual ssize_t write (const void *buffer, size_t len); /* not implemented */
   virtual ssize_t peek (void *buffer, size_t len);
-  virtual long tell (); /* not implemented */
-  virtual int seek (long where, io_stream_seek_t whence);
+  virtual off_t tell (); /* not implemented */
+  virtual off_t seek (off_t where, io_stream_seek_t whence);
   virtual int error ();
   virtual const char *next_file_name () { return NULL; };
   virtual int set_mtime (time_t);
diff --git a/gpg-packet.cc b/gpg-packet.cc
index 114d07dbe705..7949d756e47e 100644
--- a/gpg-packet.cc
+++ b/gpg-packet.cc
@@ -215,7 +215,7 @@ walk_packets_1 (struct packet_walker *wlk)
       char packet_type;
       long packet_len;
       enum pkt_cb_resp rv;
-      size_t newstartpos;
+      off_t newstartpos;
 
       wlk->pfile->seek (wlk->startpos, IO_SEEK_SET);
 
diff --git a/install.cc b/install.cc
index fbd28b1cf6ed..628dbd0cbf15 100644
--- a/install.cc
+++ b/install.cc
@@ -65,9 +65,9 @@
 
 extern ThreeBarProgressPage Progress;
 
-static long long int total_bytes = 0;
-static long long int total_bytes_sofar = 0;
-static int package_bytes = 0;
+static off_t total_bytes = 0;
+static off_t total_bytes_sofar = 0;
+static off_t package_bytes = 0;
 
 static BoolOption NoReplaceOnReboot (false, 'r', "no-replaceonreboot", IDS_HELPTEXT_NO_REPLACEONREBOOT);
 static BoolOption NoWriteRegistry (false, '\0', "no-write-registry", IDS_HELPTEXT_NO_WRITE_REGISTRY);
@@ -107,7 +107,7 @@ class Installer
     static std_dirs_t StandardDirs[];
     Installer();
     void initDialog();
-    void progress (int bytes);
+    void progress (off_t bytes);
     void preremovePerpetual (const std::string& stratum);
     void preremoveOne (packagemeta &);
     void uninstallOne (packagemeta &);
@@ -142,7 +142,7 @@ Installer::initDialog()
 }
 
 void
-Installer::progress (int bytes)
+Installer::progress (off_t bytes)
 {
   if (package_bytes > 0)
       Progress.SetBar1 (bytes, package_bytes);
diff --git a/io_stream.h b/io_stream.h
index 848251c438fd..f19e134fc927 100644
--- a/io_stream.h
+++ b/io_stream.h
@@ -137,8 +137,8 @@ public:
   /* read data without removing it from the class's internal buffer */
   virtual ssize_t peek (void *buffer, size_t len) = 0;
   /* ever read the f* functions from libc ? */
-  virtual long tell () = 0;
-  virtual int seek (long, io_stream_seek_t) = 0;
+  virtual off_t tell () = 0;
+  virtual off_t seek (off_t, io_stream_seek_t) = 0;
   /* try guessing this one */
   virtual int error () = 0;
   /* hmm, yet another for the guessing books */
diff --git a/io_stream_cygfile.cc b/io_stream_cygfile.cc
index 7fa661c67a12..1ee55f5af4dd 100644
--- a/io_stream_cygfile.cc
+++ b/io_stream_cygfile.cc
@@ -321,17 +321,41 @@ io_stream_cygfile::mklink (const std::string& _from, const std::string& _to,
 ssize_t
 io_stream_cygfile::read (void *buffer, size_t len)
 {
-  if (fp)
-    return fread (buffer, 1, len, fp);
-  return 0;
+  ssize_t ret = 0;
+
+  if (len && fp && !feof (fp))
+    {
+      clearerr (fp);
+      size_t fret = fread (buffer, 1, len, fp);
+      if (fret < len && ferror (fp))
+	{
+	  lasterr = errno;
+	  ret = -1;
+	}
+      else
+	ret = (ssize_t) fret;
+    }
+  return ret;
 }
 
 ssize_t
 io_stream_cygfile::write (const void *buffer, size_t len)
 {
-  if (fp)
-    return fwrite (buffer, 1, len, fp);
-  return 0;
+  ssize_t ret = 0;
+
+  if (len && fp)
+    {
+      clearerr (fp);
+      size_t fret = fwrite (buffer, 1, len, fp);
+      if (fret < len && ferror (fp))
+	{
+	  lasterr = errno;
+	  ret = -1;
+	}
+      else
+	ret = (ssize_t) fret;
+    }
+  return ret;
 }
 
 ssize_t
@@ -339,30 +363,29 @@ io_stream_cygfile::peek (void *buffer, size_t len)
 {
   if (fp)
     {
-      int pos = ftell (fp);
-      ssize_t rv = fread (buffer, 1, len, fp);
-      fseek (fp, pos, SEEK_SET);
+      off_t pos = ftello (fp);
+      ssize_t rv = read (buffer, len);
+      fseeko (fp, pos, SEEK_SET);
       return rv;
     }
   return 0;
 }
 
-long
+off_t
 io_stream_cygfile::tell ()
 {
   if (fp)
-    {
-      return ftell (fp);
-    }
+    return ftello (fp);
+
   return 0;
 }
 
-int
-io_stream_cygfile::seek (long where, io_stream_seek_t whence)
+off_t
+io_stream_cygfile::seek (off_t where, io_stream_seek_t whence)
 {
   if (fp)
     {
-      return fseek (fp, where, (int) whence);
+      return fseeko (fp, where, (int) whence);
     }
   lasterr = EBADF;
   return -1;
diff --git a/io_stream_cygfile.h b/io_stream_cygfile.h
index b9779094388a..2ffc56e2b86d 100644
--- a/io_stream_cygfile.h
+++ b/io_stream_cygfile.h
@@ -39,8 +39,8 @@ public:
   virtual ssize_t write (const void *buffer, size_t len);
   /* read data without removing it from the class's internal buffer */
   virtual ssize_t peek (void *buffer, size_t len);
-  virtual long tell ();
-  virtual int seek (long where, io_stream_seek_t whence);
+  virtual off_t tell ();
+  virtual off_t seek (off_t where, io_stream_seek_t whence);
   /* can't guess, oh well */
   virtual int error ();
   virtual int set_mtime (time_t);
diff --git a/io_stream_file.cc b/io_stream_file.cc
index 938d2d98061f..053229c66fe4 100644
--- a/io_stream_file.cc
+++ b/io_stream_file.cc
@@ -157,17 +157,41 @@ io_stream_file::mklink (const std::string& from, const std::string& to,
 ssize_t
 io_stream_file::read (void *buffer, size_t len)
 {
-  if (fp)
-    return fread (buffer, 1, len, fp);
-  return 0;
+  ssize_t ret = 0;
+
+  if (len && fp && !feof (fp))
+    {
+      clearerr (fp);
+      size_t fret = fread (buffer, 1, len, fp);
+      if (fret < len && ferror (fp))
+	{
+	  lasterr = errno;
+	  ret = -1;
+	}
+      else
+	ret = (ssize_t) fret;
+    }
+  return ret;
 }
 
 ssize_t
 io_stream_file::write (const void *buffer, size_t len)
 {
-  if (fp)
-    return fwrite (buffer, 1, len, fp);
-  return 0;
+  ssize_t ret = 0;
+
+  if (len && fp)
+    {
+      clearerr (fp);
+      size_t fret = fwrite (buffer, 1, len, fp);
+      if (fret < len && ferror (fp))
+	{
+	  lasterr = errno;
+	  ret = -1;
+	}
+      else
+	ret = (ssize_t) fret;
+    }
+  return ret;
 }
 
 ssize_t
@@ -175,31 +199,29 @@ io_stream_file::peek (void *buffer, size_t len)
 {
   if (fp)
     {
-      int pos = ftell (fp);
-      ssize_t rv = fread (buffer, 1, len, fp);
-      fseek (fp, pos, SEEK_SET);
+      off_t pos = ftello (fp);
+      ssize_t rv = read (buffer, len);
+      fseeko (fp, pos, SEEK_SET);
       return rv;
     }
   return 0;
 }
 
-long
+off_t
 io_stream_file::tell ()
 {
   if (fp)
-    {
-      return ftell (fp);
-    }
+    return ftello (fp);
+
   return 0;
 }
 
-int
-io_stream_file::seek (long where, io_stream_seek_t whence)
+off_t
+io_stream_file::seek (off_t where, io_stream_seek_t whence)
 {
   if (fp)
-    {
-      return fseek (fp, where, (int) whence);
-    }
+    return fseeko (fp, where, (int) whence);
+
   lasterr = EBADF;
   return -1;
 }
diff --git a/io_stream_file.h b/io_stream_file.h
index b1d7f2e98437..3060e843d03f 100644
--- a/io_stream_file.h
+++ b/io_stream_file.h
@@ -36,8 +36,8 @@ public:
   virtual ssize_t write (const void *buffer, size_t len);
   /* read data without removing it from the class's internal buffer */
   virtual ssize_t peek (void *buffer, size_t len);
-  virtual long tell ();
-  virtual int seek (long where, io_stream_seek_t whence);
+  virtual off_t tell ();
+  virtual off_t seek (off_t where, io_stream_seek_t whence);
   /* can't guess, oh well */
   virtual int error ();
   virtual int set_mtime (time_t);
diff --git a/io_stream_memory.cc b/io_stream_memory.cc
index cbdaf8372b11..2f876d742634 100644
--- a/io_stream_memory.cc
+++ b/io_stream_memory.cc
@@ -47,7 +47,7 @@ io_stream_memory::read (void *buffer, size_t len)
   unsigned char *to = (unsigned char *) buffer;
   unsigned char *end = to + len;
   ssize_t count = 0;
-  while (to < end && pos < length)
+  while (to < end && pos < (off_t) length)
     {
       *to++ = pos_block->data[pos_block_offset++];
       count++;
diff --git a/io_stream_memory.h b/io_stream_memory.h
index a1259f7d4e31..21d3e14fbf60 100644
--- a/io_stream_memory.h
+++ b/io_stream_memory.h
@@ -28,28 +28,39 @@
 class memblock
 {
 public:
-  memblock () : next (0), len (0), data (0) {};
-  memblock (size_t size) : next (0), len (size) {data = new unsigned char[size]; if (!data) len = 0;};
+  memblock ():next (0), len (0), data (0)
+  {}
+  memblock (size_t size):next (0), len (size)
+  {
+    data = new unsigned char[size];
+    if (!data)
+      len = 0;
+  }
   ~memblock ();
   memblock *next;
   size_t len;
   unsigned char *data;
 };
 
-class io_stream_memory :public io_stream
+class io_stream_memory:public io_stream
 {
 public:
-  io_stream_memory () : lasterr (0), mtime(0),length (0), head(), tail (&head), pos_block (head.next), pos_block_offset (0), pos (0) {};
+  io_stream_memory (): lasterr (0), mtime (0), length (0), head (),
+    tail (&head), pos_block (head.next), pos_block_offset (0), pos (0)
+  {}
   /* set the modification time of a file - returns 1 on failure
    * may distrupt internal state - use after all important io is complete
    */
   virtual int set_mtime (time_t newmtime)
-    {mtime = newmtime; return 0;};
+  {
+    mtime = newmtime;
+    return 0;
+  }
   /* get the mtime for a file TODO make this a stat(0 style call */
-  virtual time_t get_mtime () {return mtime;};
-  virtual mode_t get_mode () {return 0;};
+  virtual time_t get_mtime () { return mtime; }
+  virtual mode_t get_mode () { return 0; }
   /* returns the _current_ size. */
-  virtual size_t get_size () {return length;};
+  virtual size_t get_size () { return length; }
   /* read data (duh!) */
   virtual ssize_t read (void *buffer, size_t len);
   /* provide data to (double duh!) */
@@ -57,14 +68,40 @@ public:
   /* read data without removing it from the class's internal buffer */
   virtual ssize_t peek (void *buffer, size_t len);
   /* ever read the f* functions from libc ? */
-  virtual long tell () {return pos;};
-  virtual int seek (long where, io_stream_seek_t whence) { if (whence != IO_SEEK_SET) { lasterr = EINVAL; return -1;} ssize_t count=0; pos = 0; pos_block = head.next; pos_block_offset = 0; while (count < where && pos < length) {pos_block_offset++; if (pos_block_offset == pos_block->len) {pos_block = pos_block->next; pos_block_offset = 0;}pos++;count++;}return 0;};
-    
+  virtual off_t tell ()
+  {
+    return pos;
+  }
+  virtual off_t seek (off_t where, io_stream_seek_t whence)
+  {
+    if (whence != IO_SEEK_SET)
+      {
+	lasterr = EINVAL;
+	return -1;
+      }
+    ssize_t count = 0;
+    pos = 0;
+    pos_block = head.next;
+    pos_block_offset = 0;
+    while (count < where && pos < (off_t) length)
+      {
+	pos_block_offset++;
+	if (pos_block_offset == pos_block->len)
+	  {
+	    pos_block = pos_block->next;
+	    pos_block_offset = 0;
+	  }
+	pos++;
+	count++;
+      }
+    return 0;
+  }
+
   /* try guessing this one */
   virtual int error ();
 //  virtual const char* next_file_name() = NULL;
   /* if you are still needing these hints... give up now! */
-  virtual ~ io_stream_memory ();
+  virtual ~io_stream_memory ();
 private:
   int lasterr;
   time_t mtime;
@@ -73,7 +110,7 @@ private:
   memblock *tail;
   memblock *pos_block;
   size_t pos_block_offset;
-  size_t pos;
+  off_t pos;
 };
 
 #endif /* SETUP_IO_STREAM_MEMORY_H */
diff --git a/threebar.cc b/threebar.cc
index ff4c5cb356c1..bc356c0a2357 100644
--- a/threebar.cc
+++ b/threebar.cc
@@ -130,14 +130,14 @@ ThreeBarProgressPage::SetText4 (unsigned int id)
 }
 
 void
-ThreeBarProgressPage::SetBar1 (long progress, long max)
+ThreeBarProgressPage::SetBar1 (off_t progress, off_t max)
 {
   int percent = (int) (100.0 * ((double) progress) / (double) max);
   SendMessage (ins_pprogress, PBM_SETPOS, (WPARAM) percent, 0);
 }
 
 void
-ThreeBarProgressPage::SetBar2 (long long progress, long long max)
+ThreeBarProgressPage::SetBar2 (off_t progress, off_t max)
 {
   int percent = (int) (100.0 * ((double) progress) / (double) max);
   SendMessage (ins_iprogress, PBM_SETPOS, (WPARAM) percent, 0);
@@ -149,7 +149,7 @@ ThreeBarProgressPage::SetBar2 (long long progress, long long max)
 }
 
 void
-ThreeBarProgressPage::SetBar3 (long progress, long max)
+ThreeBarProgressPage::SetBar3 (off_t progress, off_t max)
 {
   int percent = (int) (100.0 * ((double) progress) / (double) max);
   SendMessage (ins_diskfull, PBM_SETPOS, (WPARAM) percent, 0);
diff --git a/threebar.h b/threebar.h
index c361eed8f9ff..d7944e5e7af3 100644
--- a/threebar.h
+++ b/threebar.h
@@ -80,9 +80,9 @@ public:
   void SetText3 (unsigned int id);
   void SetText4 (unsigned int id);
 
-  void SetBar1 (long progress, long max = 100);
-  void SetBar2 (long long progress, long long max = 100);
-  void SetBar3 (long progress, long max = 100);
+  void SetBar1 (off_t progress, off_t max = 100);
+  void SetBar2 (off_t progress, off_t max = 100);
+  void SetBar3 (off_t progress, off_t max = 100);
 
   void SetActivateTask (int t)
   {


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-02-05 21:43 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-05 21:43 [setup - the official Cygwin setup program] branch master, updated. release_2.925-4-g64a12e7e9021 Corinna Vinschen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).