Home | History | Annotate | Line # | Download | only in libarchive
      1 /*-
      2  * Copyright (c) 2009-2011 Michihiro NAKAJIMA
      3  * Copyright (c) 2003-2006 Tim Kientzle
      4  * All rights reserved.
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions
      8  * are met:
      9  * 1. Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer
     11  *    in this position and unchanged.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
     17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     19  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26  */
     27 
     28 /*
     29  * TODO: A lot of stuff in here isn't actually used by libarchive and
     30  * can be trimmed out.  Note that this file is used by libarchive and
     31  * libarchive_test but nowhere else.  (But note that it gets compiled
     32  * with many different Windows environments, including MinGW, Visual
     33  * Studio, and Cygwin.  Significant changes should be tested in all three.)
     34  */
     35 
     36 /*
     37  * TODO: Don't use off_t in here.  Use __int64 instead.  Note that
     38  * Visual Studio and the Windows SDK define off_t as 32 bits; Win32's
     39  * more modern file handling APIs all use __int64 instead of off_t.
     40  */
     41 
     42 #ifndef LIBARCHIVE_ARCHIVE_WINDOWS_H_INCLUDED
     43 #define	LIBARCHIVE_ARCHIVE_WINDOWS_H_INCLUDED
     44 
     45 #ifndef __LIBARCHIVE_BUILD
     46 #error This header is only to be used internally to libarchive.
     47 #endif
     48 
     49 /* Start of configuration for native Win32  */
     50 #ifndef MINGW_HAS_SECURE_API
     51 #define MINGW_HAS_SECURE_API 1
     52 #endif
     53 
     54 #include <errno.h>
     55 #define	set_errno(val)	((errno)=val)
     56 #include <io.h>
     57 #include <stdlib.h>   //brings in NULL
     58 #if defined(HAVE_STDINT_H)
     59 #include <stdint.h>
     60 #endif
     61 #include <stdio.h>
     62 #include <fcntl.h>
     63 #include <sys/stat.h>
     64 #include <process.h>
     65 #include <direct.h>
     66 #if defined(__MINGW32__) && defined(HAVE_UNISTD_H)
     67 /* Prevent build error from a type mismatch of ftruncate().
     68  * This unistd.h defines it as ftruncate(int, off_t). */
     69 #include <unistd.h>
     70 #endif
     71 #define NOCRYPT
     72 #include <windows.h>
     73 //#define	EFTYPE 7
     74 
     75 #include "archive_platform_stat.h"
     76 
     77 #if defined(__BORLANDC__)
     78 #pragma warn -8068	/* Constant out of range in comparison. */
     79 #pragma warn -8072	/* Suspicious pointer arithmetic. */
     80 #endif
     81 
     82 #ifndef NULL
     83 #ifdef  __cplusplus
     84 #define	NULL    0
     85 #else
     86 #define	NULL    ((void *)0)
     87 #endif
     88 #endif
     89 
     90 /* Alias the Windows _function to the POSIX equivalent. */
     91 #define	close		_close
     92 #define	fcntl(fd, cmd, flg)	/* No operation. */
     93 #ifndef fileno
     94 #define	fileno		_fileno
     95 #endif
     96 #ifdef fstat
     97 #undef fstat
     98 #endif
     99 #define	fstat		__la_fstat
    100 #if !defined(__BORLANDC__)
    101 #ifdef lseek
    102 #undef lseek
    103 #endif
    104 #define	lseek		_lseeki64
    105 #else
    106 #define	lseek		__la_lseek
    107 #define __LA_LSEEK_NEEDED
    108 #endif
    109 #define	lstat		__la_stat
    110 #define	open		__la_open
    111 #define	_wopen		__la_wopen
    112 #define	read		__la_read
    113 #if !defined(__BORLANDC__) && !defined(__WATCOMC__)
    114 #define setmode		_setmode
    115 #endif
    116 #define	la_stat(path,stref)		__la_stat(path,stref)
    117 #if !defined(__WATCOMC__)
    118 #if !defined(__BORLANDC__)
    119 #define	strdup		_strdup
    120 #endif
    121 #define	tzset		_tzset
    122 #if !defined(__BORLANDC__)
    123 #define	umask		_umask
    124 #endif
    125 #endif
    126 #define	waitpid		__la_waitpid
    127 #define	write		__la_write
    128 
    129 #if !defined(__WATCOMC__)
    130 
    131 #ifndef O_RDONLY
    132 #define	O_RDONLY	_O_RDONLY
    133 #define	O_WRONLY	_O_WRONLY
    134 #define	O_TRUNC		_O_TRUNC
    135 #define	O_CREAT		_O_CREAT
    136 #define	O_EXCL		_O_EXCL
    137 #define	O_BINARY	_O_BINARY
    138 #endif
    139 
    140 #ifndef _S_IFIFO
    141   #define	_S_IFIFO        0010000   /* pipe */
    142 #endif
    143 #ifndef _S_IFCHR
    144   #define	_S_IFCHR        0020000   /* character special */
    145 #endif
    146 #ifndef _S_IFDIR
    147   #define	_S_IFDIR        0040000   /* directory */
    148 #endif
    149 #ifndef _S_IFBLK
    150   #define	_S_IFBLK        0060000   /* block special */
    151 #endif
    152 #ifndef _S_IFLNK
    153   #define	_S_IFLNK        0120000   /* symbolic link */
    154 #endif
    155 #ifndef _S_IFSOCK
    156   #define	_S_IFSOCK       0140000   /* socket */
    157 #endif
    158 #ifndef	_S_IFREG
    159   #define	_S_IFREG        0100000   /* regular */
    160 #endif
    161 #ifndef	_S_IFMT
    162   #define	_S_IFMT         0170000   /* file type mask */
    163 #endif
    164 
    165 #ifndef S_IFIFO
    166 #define	S_IFIFO     _S_IFIFO
    167 #endif
    168 //#define	S_IFCHR  _S_IFCHR
    169 //#define	S_IFDIR  _S_IFDIR
    170 #ifndef S_IFBLK
    171 #define	S_IFBLK     _S_IFBLK
    172 #endif
    173 #ifndef S_IFLNK
    174 #define	S_IFLNK     _S_IFLNK
    175 #endif
    176 #ifndef S_IFSOCK
    177 #define	S_IFSOCK    _S_IFSOCK
    178 #endif
    179 //#define	S_IFREG  _S_IFREG
    180 //#define	S_IFMT   _S_IFMT
    181 
    182 #ifndef S_ISBLK
    183 #define	S_ISBLK(m)	(((m) & S_IFMT) == S_IFBLK)	/* block special */
    184 #define	S_ISFIFO(m)	(((m) & S_IFMT) == S_IFIFO)	/* fifo or socket */
    185 #define	S_ISCHR(m)	(((m) & S_IFMT) == S_IFCHR)	/* char special */
    186 #define	S_ISDIR(m)	(((m) & S_IFMT) == S_IFDIR)	/* directory */
    187 #define	S_ISREG(m)	(((m) & S_IFMT) == S_IFREG)	/* regular file */
    188 #endif
    189 #define	S_ISLNK(m)  (((m) & S_IFMT) == S_IFLNK) /* Symbolic link */
    190 #define	S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) /* Socket */
    191 
    192 #define	_S_ISUID        0004000   /* set user id on execution */
    193 #define	_S_ISGID        0002000   /* set group id on execution */
    194 #define	_S_ISVTX        0001000   /* save swapped text even after use */
    195 
    196 #define	S_ISUID        _S_ISUID
    197 #define	S_ISGID        _S_ISGID
    198 #define	S_ISVTX        _S_ISVTX
    199 
    200 #define	_S_IRWXU	     (_S_IREAD | _S_IWRITE | _S_IEXEC)
    201 #define	_S_IXUSR	     _S_IEXEC  /* read permission, user */
    202 #define	_S_IWUSR	     _S_IWRITE /* write permission, user */
    203 #define	_S_IRUSR	     _S_IREAD  /* execute/search permission, user */
    204 #define	_S_IRWXG        (_S_IRWXU >> 3)
    205 #define	_S_IXGRP        (_S_IXUSR >> 3) /* read permission, group */
    206 #define	_S_IWGRP        (_S_IWUSR >> 3) /* write permission, group */
    207 #define	_S_IRGRP        (_S_IRUSR >> 3) /* execute/search permission, group */
    208 #define	_S_IRWXO        (_S_IRWXG >> 3)
    209 #define	_S_IXOTH        (_S_IXGRP >> 3) /* read permission, other */
    210 #define	_S_IWOTH        (_S_IWGRP >> 3) /* write permission, other */
    211 #define	_S_IROTH        (_S_IRGRP  >> 3) /* execute/search permission, other */
    212 
    213 #ifndef S_IRWXU
    214 #define	S_IRWXU	     _S_IRWXU
    215 #define	S_IXUSR	     _S_IXUSR
    216 #define	S_IWUSR	     _S_IWUSR
    217 #define	S_IRUSR	     _S_IRUSR
    218 #endif
    219 #ifndef S_IRWXG
    220 #define	S_IRWXG        _S_IRWXG
    221 #define	S_IXGRP        _S_IXGRP
    222 #define	S_IWGRP        _S_IWGRP
    223 #endif
    224 #ifndef S_IRGRP
    225 #define	S_IRGRP        _S_IRGRP
    226 #endif
    227 #ifndef S_IRWXO
    228 #define	S_IRWXO        _S_IRWXO
    229 #define	S_IXOTH        _S_IXOTH
    230 #define	S_IWOTH        _S_IWOTH
    231 #define	S_IROTH        _S_IROTH
    232 #endif
    233 
    234 #endif
    235 
    236 #define	F_DUPFD	  	0	/* Duplicate file descriptor.  */
    237 #define	F_GETFD		1	/* Get file descriptor flags.  */
    238 #define	F_SETFD		2	/* Set file descriptor flags.  */
    239 #define	F_GETFL		3	/* Get file status flags.  */
    240 #define	F_SETFL		4	/* Set file status flags.  */
    241 #define	F_GETOWN		5	/* Get owner (receiver of SIGIO).  */
    242 #define	F_SETOWN		6	/* Set owner (receiver of SIGIO).  */
    243 #define	F_GETLK		7	/* Get record locking info.  */
    244 #define	F_SETLK		8	/* Set record locking info (non-blocking).  */
    245 #define	F_SETLKW		9	/* Set record locking info (blocking).  */
    246 
    247 /* XXX missing */
    248 #define	F_GETLK64	7	/* Get record locking info.  */
    249 #define	F_SETLK64	8	/* Set record locking info (non-blocking).  */
    250 #define	F_SETLKW64	9	/* Set record locking info (blocking).  */
    251 
    252 /* File descriptor flags used with F_GETFD and F_SETFD.  */
    253 #define	FD_CLOEXEC	1	/* Close on exec.  */
    254 
    255 //NOT SURE IF O_NONBLOCK is OK here but at least the 0x0004 flag is not used by anything else...
    256 #define	O_NONBLOCK 0x0004 /* Non-blocking I/O.  */
    257 //#define	O_NDELAY   O_NONBLOCK
    258 
    259 /* Symbolic constants for the access() function */
    260 #if !defined(F_OK)
    261     #define	R_OK    4       /*  Test for read permission    */
    262     #define	W_OK    2       /*  Test for write permission   */
    263     #define	X_OK    1       /*  Test for execute permission */
    264     #define	F_OK    0       /*  Test for existence of file  */
    265 #endif
    266 
    267 /* Functions to circumvent off_t limitations */
    268 int __la_seek_fstat(int fd, la_seek_stat_t *st);
    269 int __la_seek_stat(const char *path, la_seek_stat_t *st);
    270 
    271 /* Replacement POSIX function */
    272 extern int	 __la_fstat(int fd, struct stat *st);
    273 extern int	 __la_lstat(const char *path, struct stat *st);
    274 #if defined(__LA_LSEEK_NEEDED)
    275 extern __int64	 __la_lseek(int fd, __int64 offset, int whence);
    276 #endif
    277 extern int	 __la_open(const char *path, int flags, ...);
    278 extern int	 __la_wopen(const wchar_t *path, int flags, ...);
    279 extern ssize_t	 __la_read(int fd, void *buf, size_t nbytes);
    280 extern int	 __la_stat(const char *path, struct stat *st);
    281 extern pid_t	 __la_waitpid(HANDLE child, int *status, int option);
    282 extern ssize_t	 __la_write(int fd, const void *buf, size_t nbytes);
    283 
    284 #define _stat64i32(path, st)	__la_stat(path, st)
    285 #define _stat64(path, st)	__la_stat(path, st)
    286 /* for status returned by la_waitpid */
    287 #define WIFEXITED(sts)		((sts & 0x100) == 0)
    288 #define WEXITSTATUS(sts)	(sts & 0x0FF)
    289 
    290 extern wchar_t *__la_win_permissive_name(const char *name);
    291 extern wchar_t *__la_win_permissive_name_w(const wchar_t *wname);
    292 extern void __la_dosmaperr(unsigned long e);
    293 #define la_dosmaperr(e) __la_dosmaperr(e)
    294 extern struct archive_entry *__la_win_entry_in_posix_pathseparator(
    295     struct archive_entry *);
    296 
    297 #if defined(HAVE_WCRTOMB) && defined(__BORLANDC__)
    298 typedef int mbstate_t;
    299 size_t wcrtomb(char *, wchar_t, mbstate_t *);
    300 #endif
    301 
    302 #if !WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP) && NTDDI_VERSION < NTDDI_WIN10_VB
    303 // not supported in UWP SDK before 20H1
    304 #define GetVolumePathNameW(f, v, c)   (0)
    305 #elif defined(_MSC_VER) && _MSC_VER < 1300
    306 WINBASEAPI BOOL WINAPI GetVolumePathNameW(
    307        LPCWSTR lpszFileName,
    308        LPWSTR lpszVolumePathName,
    309        DWORD cchBufferLength
    310        );
    311 #endif
    312 #if defined(_MSC_VER) && _MSC_VER < 1300
    313 # if _WIN32_WINNT < 0x0500 /* windows.h not providing 0x500 API */
    314 typedef struct _FILE_ALLOCATED_RANGE_BUFFER {
    315        LARGE_INTEGER FileOffset;
    316        LARGE_INTEGER Length;
    317 } FILE_ALLOCATED_RANGE_BUFFER, *PFILE_ALLOCATED_RANGE_BUFFER;
    318 #  define FSCTL_SET_SPARSE \
    319      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_WRITE_DATA)
    320 #  define FSCTL_QUERY_ALLOCATED_RANGES \
    321      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 51,  METHOD_NEITHER, FILE_READ_DATA)
    322 # endif
    323 #endif
    324 
    325 #endif /* !LIBARCHIVE_ARCHIVE_WINDOWS_H_INCLUDED */
    326