From 16f738ecee689c6feb2acb7e4ef4d9bb4144ae7d Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sun, 8 Jun 2008 11:04:43 +0200 Subject: Initial commit --- zip/ZipArchive/ZipPlatform_lnx.cpp | 269 +++++++++++++++++++++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 zip/ZipArchive/ZipPlatform_lnx.cpp (limited to 'zip/ZipArchive/ZipPlatform_lnx.cpp') diff --git a/zip/ZipArchive/ZipPlatform_lnx.cpp b/zip/ZipArchive/ZipPlatform_lnx.cpp new file mode 100644 index 0000000..7d9b152 --- /dev/null +++ b/zip/ZipArchive/ZipPlatform_lnx.cpp @@ -0,0 +1,269 @@ +//////////////////////////////////////////////////////////////////////////////// +// This source file is part of the ZipArchive library source distribution and +// is Copyrighted 2000 - 2007 by Artpol Software - Tadeusz Dracz +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// For the licensing details refer to the License.txt file. +// +// Web Site: http://www.artpol-software.com +//////////////////////////////////////////////////////////////////////////////// + +#include "_platform.h" + +#ifdef ZIP_ARCHIVE_LNX + +#if defined __APPLE__ || defined __CYGWIN__ + #define FILE_FUNCTIONS_64B_BY_DEFAULT +#else + #undef FILE_FUNCTIONS_64B_BY_DEFAULT +#endif + +#include "stdafx.h" +#include "ZipPlatform.h" +#include "ZipFileHeader.h" +#include "ZipException.h" +#include "ZipAutoBuffer.h" + +#include + +#include "ZipPathComponent.h" +#include "ZipCompatibility.h" + +#include + +#if defined (__FreeBSD__) || defined (__APPLE__) + #include + #include +#else + #include +#endif +#include + +#include +#include + +#include + +const TCHAR CZipPathComponent::m_cSeparator = _T('/'); + +#ifndef _UTIMBUF_DEFINED +#define _utimbuf utimbuf +#endif + +#define ZIP_DEFAULT_DIR_ATTRIBUTES (S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// +ULONGLONG ZipPlatform::GetDeviceFreeSpace(LPCTSTR lpszPath) +{ + struct statfs sStats; + + #if defined (__SVR4) && defined (__sun) + if (statvfs(lpszPath, &sStats) == -1) // Solaris + #else + if (statfs(lpszPath, &sStats) == -1) + #endif + return 0; + + return sStats.f_bsize * sStats.f_bavail; +} + + +CZipString ZipPlatform::GetTmpFileName(LPCTSTR lpszPath, ZIP_SIZE_TYPE uSizeNeeded) +{ + TCHAR empty[] = _T(""), prefix [] = _T("zar"); + CZipString tempPath = lpszPath; + if (tempPath.IsEmpty()) + tempPath = "/tmp"; + if (ZipPlatform::GetDeviceFreeSpace(tempPath) < uSizeNeeded) + return empty; + CZipPathComponent::AppendSeparator(tempPath); + tempPath += prefix; + tempPath += _T("XXXXXX"); + int handle = mkstemp(tempPath.GetBuffer(tempPath.GetLength())); + tempPath.ReleaseBuffer(); + if (handle != -1) + { + close(handle); // we just create the file and open it later + return tempPath; + } + else + return empty; +} + +bool ZipPlatform::GetCurrentDirectory(CZipString& sz) +{ + char* pBuf = getcwd(NULL, 0); + if (!pBuf) + return false; + sz = pBuf; + free(pBuf); + return true; +} + +bool ZipPlatform::SetFileAttr(LPCTSTR lpFileName, DWORD uAttr) +{ + return chmod(lpFileName, uAttr) == 0; +} + +bool ZipPlatform::GetFileAttr(LPCTSTR lpFileName, DWORD& uAttr) +{ + struct stat sStats; + if (stat(lpFileName, &sStats) == -1) + return false; + uAttr = (sStats.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO | S_IFMT)); + return true; +} + +bool ZipPlatform::SetExeAttr(LPCTSTR lpFileName) +{ + DWORD uAttr; + if (!GetFileAttr(lpFileName, uAttr)) + return false; + uAttr |= S_IXUSR; + return ZipPlatform::SetFileAttr(lpFileName, uAttr); +} + + +bool ZipPlatform::GetFileModTime(LPCTSTR lpFileName, time_t & ttime) +{ + struct stat st; + if (stat(lpFileName, &st) != 0) + return false; + + ttime = st.st_mtime; + if (ttime == (time_t)-1) + { + ttime = time(NULL); + return false; + } + else + return true; +} + +bool ZipPlatform::SetFileModTime(LPCTSTR lpFileName, time_t ttime) +{ + struct utimbuf ub; + ub.actime = time(NULL); + ub.modtime = ttime == -1 ? time(NULL) : ttime; // if wrong file time, set it to the current + return utime(lpFileName, &ub) == 0; +} + + +bool ZipPlatform::ChangeDirectory(LPCTSTR lpDirectory) +{ + return chdir(lpDirectory) == 0; +} +int ZipPlatform::FileExists(LPCTSTR lpszName) +{ + struct stat st; + if (stat(lpszName, &st) != 0) + return 0; + else + { + if (S_ISDIR(st.st_mode)) + return -1; + else + return 1; + } +} + +ZIPINLINE bool ZipPlatform::IsDriveRemovable(LPCTSTR lpszFilePath) +{ + // not implemmented + return true; +} + +ZIPINLINE bool ZipPlatform::SetVolLabel(LPCTSTR lpszPath, LPCTSTR lpszLabel) +{ + // not implemmented + return true; +} + +ZIPINLINE void ZipPlatform::AnsiOem(CZipAutoBuffer& buffer, bool bAnsiToOem) +{ + // not implemmented +} + +ZIPINLINE bool ZipPlatform::RemoveFile(LPCTSTR lpszFileName, bool bThrow) +{ + if (unlink(lpszFileName) != 0) + if (bThrow) + CZipException::Throw(CZipException::notRemoved, lpszFileName); + else + return false; + return true; + + +} +ZIPINLINE bool ZipPlatform::RenameFile( LPCTSTR lpszOldName, LPCTSTR lpszNewName , bool bThrow) +{ + + if (rename(lpszOldName, lpszNewName) != 0) + if (bThrow) + CZipException::Throw(CZipException::notRenamed, lpszOldName); + else + return false; + return true; + +} +ZIPINLINE bool ZipPlatform::IsDirectory(DWORD uAttr) +{ + return S_ISDIR(uAttr) != 0; +} + +ZIPINLINE bool ZipPlatform::CreateDirectory(LPCTSTR lpDirectory) +{ + return mkdir(lpDirectory, ZIP_DEFAULT_DIR_ATTRIBUTES) == 0; +} + +ZIPINLINE DWORD ZipPlatform::GetDefaultAttributes() +{ + return S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; +} + +ZIPINLINE DWORD ZipPlatform::GetDefaultDirAttributes() +{ + return S_IFDIR | ZIP_DEFAULT_DIR_ATTRIBUTES; +} + + +ZIPINLINE int ZipPlatform::GetSystemID() +{ + return ZipCompatibility::zcUnix; +} + +ZIPINLINE bool ZipPlatform::GetSystemCaseSensitivity() +{ + return true; +} + + +bool ZipPlatform::TruncateFile(int iDes, ULONGLONG uSize) +{ + return ftruncate(iDes, uSize) == 0; + +} + +int ZipPlatform::OpenFile(LPCTSTR lpszFileName, UINT iMode, int iShareMode) +{ + return open(lpszFileName, iMode, S_IRUSR | S_IWUSR | S_IRGRP |S_IROTH ); +} + +bool ZipPlatform::FlushFile(int iDes) +{ + return fsync(iDes) == 0; +} + +intptr_t ZipPlatform::GetFileSystemHandle(int iDes) +{ + return iDes; +} + + +#endif // ZIP_ARCHIVE_LNX -- cgit v1.2.3