summaryrefslogtreecommitdiffstats
path: root/Source/cmSystemTools.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmSystemTools.cxx')
-rw-r--r--Source/cmSystemTools.cxx74
1 files changed, 60 insertions, 14 deletions
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index f7ea1ef..7caafd0 100644
--- a/Source/cmSystemTools.cxx
+++ b/Source/cmSystemTools.cxx
@@ -1365,12 +1365,22 @@ bool cmSystemTools::IsPathToFramework(const char* path)
# include <fcntl.h>
# include <cmzlib/zlib.h>
-static int gzopen_frontend(char *pathname, int oflags, int mode)
+struct cmSystemToolsGZStruct
+{
+ gzFile GZFile;
+ static int Open(void* call_data, const char *pathname, int oflags, mode_t mode);
+ static int Close(void* call_data, int fd);
+ static ssize_t Read(void* call_data, int fd, void* buf, size_t count);
+ static ssize_t Write(void* call_data, int fd, const void* buf, size_t count);
+};
+
+int cmSystemToolsGZStruct::Open(void* call_data, const char *pathname, int oflags, mode_t mode)
{
char *gzoflags;
- gzFile gzf;
int fd;
+ cmSystemToolsGZStruct* gzf = static_cast<cmSystemToolsGZStruct*>(call_data);
+
switch (oflags & O_ACCMODE)
{
case O_WRONLY:
@@ -1398,14 +1408,35 @@ static int gzopen_frontend(char *pathname, int oflags, int mode)
}
#endif
- gzf = cm_zlib_gzdopen(fd, gzoflags);
- if (!gzf)
+ gzf->GZFile = cm_zlib_gzdopen(fd, gzoflags);
+ if (!gzf->GZFile)
{
errno = ENOMEM;
return -1;
}
- return (int)gzf;
+ return fd;
+}
+
+int cmSystemToolsGZStruct::Close(void* call_data, int fd)
+{
+ (void)fd;
+ cmSystemToolsGZStruct* gzf = static_cast<cmSystemToolsGZStruct*>(call_data);
+ return cm_zlib_gzclose(gzf->GZFile);
+}
+
+ssize_t cmSystemToolsGZStruct::Read(void* call_data, int fd, void* buf, size_t count)
+{
+ (void)fd;
+ cmSystemToolsGZStruct* gzf = static_cast<cmSystemToolsGZStruct*>(call_data);
+ return cm_zlib_gzread(gzf->GZFile, buf, count);
+}
+
+ssize_t cmSystemToolsGZStruct::Write(void* call_data, int fd, const void* buf, size_t count)
+{
+ (void)fd;
+ cmSystemToolsGZStruct* gzf = static_cast<cmSystemToolsGZStruct*>(call_data);
+ return cm_zlib_gzwrite(gzf->GZFile, (void*)buf, count);
}
#endif
@@ -1416,9 +1447,14 @@ bool cmSystemTools::CreateTar(const char* outFileName, const std::vector<cmStdSt
TAR *t;
char buf[TAR_MAXPATHLEN];
char pathname[TAR_MAXPATHLEN];
-
- tartype_t gztype = { (openfunc_t) gzopen_frontend, (closefunc_t) cm_zlib_gzclose,
- (readfunc_t) cm_zlib_gzread, (writefunc_t) cm_zlib_gzwrite
+ cmSystemToolsGZStruct gzs;
+
+ tartype_t gztype = {
+ cmSystemToolsGZStruct::Open,
+ cmSystemToolsGZStruct::Close,
+ cmSystemToolsGZStruct::Read,
+ cmSystemToolsGZStruct::Write,
+ &gzs
};
// Ok, this libtar is not const safe. for now use auto_ptr hack
@@ -1476,9 +1512,14 @@ bool cmSystemTools::ExtractTar(const char* outFileName, const std::vector<cmStdS
(void)files;
#if defined(CMAKE_BUILD_WITH_CMAKE)
TAR *t;
-
- tartype_t gztype = { (openfunc_t) gzopen_frontend, (closefunc_t) cm_zlib_gzclose,
- (readfunc_t) cm_zlib_gzread, (writefunc_t) cm_zlib_gzwrite
+ cmSystemToolsGZStruct gzs;
+
+ tartype_t gztype = {
+ cmSystemToolsGZStruct::Open,
+ cmSystemToolsGZStruct::Close,
+ cmSystemToolsGZStruct::Read,
+ cmSystemToolsGZStruct::Write,
+ &gzs
};
// Ok, this libtar is not const safe. for now use auto_ptr hack
@@ -1520,9 +1561,14 @@ bool cmSystemTools::ListTar(const char* outFileName, std::vector<cmStdString>& f
{
#if defined(CMAKE_BUILD_WITH_CMAKE)
TAR *t;
-
- tartype_t gztype = { (openfunc_t) gzopen_frontend, (closefunc_t) cm_zlib_gzclose,
- (readfunc_t) cm_zlib_gzread, (writefunc_t) cm_zlib_gzwrite
+ cmSystemToolsGZStruct gzs;
+
+ tartype_t gztype = {
+ cmSystemToolsGZStruct::Open,
+ cmSystemToolsGZStruct::Close,
+ cmSystemToolsGZStruct::Read,
+ cmSystemToolsGZStruct::Write,
+ &gzs
};
// Ok, this libtar is not const safe. for now use auto_ptr hack