libzypp  17.25.1
GzStream.cc
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | |
3 | __ __ ____ _____ ____ |
4 | \ \ / /_ _/ ___|_ _|___ \ |
5 | \ V / _` \___ \ | | __) | |
6 | | | (_| |___) || | / __/ |
7 | |_|\__,_|____/ |_| |_____| |
8 | |
9 | core system |
10 | (C) SuSE Linux Products GmbH |
11 \----------------------------------------------------------------------/
12 
13  File: GzStream.cc
14 
15  Author: Michael Andres <ma@suse.de>
16  Maintainer: Michael Andres <ma@suse.de>
17 
18  Purpose: Streams reading and writing gzip files.
19 
20 /-*/
21 
22 #include <cerrno>
23 #include <iostream>
24 #include <zypp/base/LogControl.h>
25 #include <zypp/base/LogTools.h>
26 using std::endl;
27 
28 #include <zypp/base/GzStream.h>
29 
30 #include <sys/types.h>
31 #include <sys/stat.h>
32 #include <fcntl.h>
33 
35 namespace zypp
36 {
37  namespace gzstream_detail
39  {
40 
41 
43  //
44  // CLASS NAME : ZlibError
45  //
47 
49  //
50  // METHOD NAME : ZlibError::strerror
51  // METHOD TYPE : std::string
52  //
53  std::string
55  {
56  std::string ret = ( _zError ? ::zError( _zError ) : "OK" );
57  if ( _zError == Z_ERRNO )
58  ret += std::string("(") + ::strerror( _errno ) + ")";
59  return ret;
60  }
61 
63  //
64  // CLASS NAME : fgzstreambuf
65  //
67 
69  //
70  // METHOD NAME : gzstreambufimpl::openImpl
71  // METHOD TYPE : bool
72  //
73  bool
74  gzstreambufimpl::openImpl(const char *name_r, std::ios_base::openmode mode_r)
75  {
76  bool ret = false;
77  if ( ! isOpen() )
78  {
79  // we expect gzdopen to handle errors of ::open
80  if ( mode_r == std::ios_base::in )
81  {
82  _fd = ::open( name_r, O_RDONLY | O_CLOEXEC );
83  _file = gzdopen( _fd, "rb" );
84  }
85  else if ( mode_r == std::ios_base::out )
86  {
87  _fd = ::open( name_r, O_WRONLY|O_CREAT|O_CLOEXEC, 0666 );
88  _file = gzdopen( _fd, "wb" );
89  }
90  // else: not supported
91 
92  if ( isOpen() )
93  {
94  // Store mode
95  _mode = mode_r;
96  ret = true;
97  }
98  else
99  setZError();
100  }
101  return ret;
102  }
103 
105  //
106  // METHOD NAME : gzstreambufimpl::closeImpl
107  // METHOD TYPE : bool
108  //
109  bool
111  {
112  bool ret = false;
113  if ( isOpen() )
114  {
115  bool failed = false;
116 
117  // it also closes _fd, fine
118  int r = gzclose( _file );
119  if ( r != Z_OK )
120  {
121  failed = true;
122  // DONT call setZError() here, as _file is no longer valid
123  _error._zError = r;
124  _error._errno = errno;
125  }
126 
127  // Reset everything
128  _fd = -1;
129  _file = NULL;
130  _mode = std::ios_base::openmode(0);
131  if ( ! failed )
132  ret = true;
133  }
134  return ret;
135  }
136 
138  //
139  // METHOD NAME : gzstreambufimpl::readData
140  // METHOD TYPE : std::streamsize
141  //
142  std::streamsize
143  gzstreambufimpl::readData( char * buffer_r, std::streamsize maxcount_r )
144  {
145  int read = gzread( _file, buffer_r, maxcount_r );
146  if ( read < 0 )
147  setZError();
148  return read;
149  }
150 
152  //
153  // METHOD NAME : gzstreambufimpl::writeData
154  // METHOD TYPE : bool
155  //
156  bool
157  gzstreambufimpl::writeData( const char * buffer_r, std::streamsize count_r )
158  {
159  int written = 0;
160  if ( count_r )
161  {
162  if ( (written = gzwrite( _file, buffer_r, count_r )) == 0 )
163  setZError();
164  }
165  return( written == count_r );
166  }
167 
169  //
170  // METHOD NAME : gzstreambufimpl::seekTo
171  // METHOD TYPE : off_t
172  //
173  off_t
174  gzstreambufimpl::seekTo( off_t off_r, std::ios_base::seekdir way_r, std::ios_base::openmode )
175  {
176  z_off_t ret = gzseek( _file, off_r, way_r );
177  if ( ret == -1 )
178  setZError();
179  return ret;
180  }
181 
183  //
184  // METHOD NAME : gzstreambufimpl::tell
185  // METHOD TYPE : off_t
186  //
187  off_t
189  {
190  z_off_t ret = gztell( _file );
191  if ( ret == -1 )
192  setZError();
193  return ret;
194  }
195 
196  off_t
198  {
199  off_t pos = lseek (_fd, 0, SEEK_CUR);
200  // hopefully the conversion is ok
201  return pos;
202  }
203 
205  } // namespace gzstream_detail
208 } // namespace zypp
210 
LogControl.h
zypp::base::sysconfig::read
std::map< std::string, std::string > read(const Pathname &_path)
Read sysconfig file path_r and return (key,valye) pairs.
Definition: Sysconfig.cc:34
zypp::gzstream_detail::gzstreambufimpl::isOpen
bool isOpen() const
Definition: GzStream.h:99
GzStream.h
zypp::gzstream_detail::ZlibError::_zError
int _zError
The zlib error code.
Definition: GzStream.h:51
zypp::gzstream_detail::gzstreambufimpl::_file
gzFile _file
Definition: GzStream.h:144
LogTools.h
zypp::gzstream_detail::gzstreambufimpl::_fd
int _fd
file descriptor of the compressed file
Definition: GzStream.h:142
zypp::gzstream_detail::ZlibError::_errno
int _errno
errno, valid if zError is Z_ERRNO
Definition: GzStream.h:56
zypp
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:1
zypp::gzstream_detail::gzstreambufimpl::compressed_tell
off_t compressed_tell() const
Tell the file position in the compressed file.
Definition: GzStream.cc:197
zypp::gzstream_detail::gzstreambufimpl::closeImpl
bool closeImpl()
Definition: GzStream.cc:110
zypp::gzstream_detail::gzstreambufimpl::_mode
std::ios_base::openmode _mode
Definition: GzStream.h:146
zypp::gzstream_detail::gzstreambufimpl::writeData
bool writeData(const char *buffer_r, std::streamsize count_r)
Definition: GzStream.cc:157
zypp::gzstream_detail::gzstreambufimpl::openImpl
bool openImpl(const char *name_r, std::ios_base::openmode mode_r)
Definition: GzStream.cc:74
zypp::gzstream_detail::gzstreambufimpl::seekTo
off_t seekTo(off_t off_r, std::ios_base::seekdir way_r, std::ios_base::openmode omode_r)
Definition: GzStream.cc:174
zypp::gzstream_detail::gzstreambufimpl::readData
std::streamsize readData(char *buffer_r, std::streamsize maxcount_r)
Definition: GzStream.cc:143
zypp::gzstream_detail::gzstreambufimpl::_error
ZlibError _error
Definition: GzStream.h:148
zypp::gzstream_detail::gzstreambufimpl::setZError
void setZError() const
Definition: GzStream.h:138
zypp::gzstream_detail::gzstreambufimpl::tell
off_t tell() const
Definition: GzStream.cc:188
zypp::gzstream_detail::ZlibError::strerror
std::string strerror() const
Return string describing the zlib error code.
Definition: GzStream.cc:54