implemented qse_fio_chmod() for win32 and unix
- on win32, it is a best effort implemention. - it gets the volume name from a handle and use SetFileAttributes(). fixed the problem of wrongly detecting objdump. - place AC_PROG_LIBTOOL after any AC_CHECK_TOOL. - otherwise, AC_PROG_LIBTOOL overrides the value of tools checked.
This commit is contained in:
@ -99,6 +99,7 @@ JAR = @JAR@
|
||||
JAR_PATH = @JAR_PATH@
|
||||
JAVAC = @JAVAC@
|
||||
JAVAC_PATH = @JAVAC_PATH@
|
||||
LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBM = @LIBM@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
@ -109,7 +110,9 @@ LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
|
@ -138,6 +138,7 @@ JAR = @JAR@
|
||||
JAR_PATH = @JAR_PATH@
|
||||
JAVAC = @JAVAC@
|
||||
JAVAC_PATH = @JAVAC_PATH@
|
||||
LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBM = @LIBM@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
@ -148,7 +149,9 @@ LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
|
@ -11,3 +11,7 @@ libqsecmn_la_SOURCES = mem.h chr.h \
|
||||
misc.c
|
||||
libqsecmn_la_LDFLAGS = -version-info 1:0:0 -no-undefined
|
||||
|
||||
if WIN32
|
||||
libqsecmn_la_LIBADD = -lpsapi
|
||||
endif
|
||||
|
||||
|
@ -50,7 +50,7 @@ am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
|
||||
am__installdirs = "$(DESTDIR)$(libdir)"
|
||||
libLTLIBRARIES_INSTALL = $(INSTALL)
|
||||
LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||
libqsecmn_la_LIBADD =
|
||||
libqsecmn_la_DEPENDENCIES =
|
||||
am_libqsecmn_la_OBJECTS = mem.lo chr.lo chr_cnv.lo rex.lo str_bas.lo \
|
||||
str_cnv.lo str_dyn.lo lda.lo map.lo sll.lo dll.lo opt.lo \
|
||||
fio.lo sio.lo tio.lo tio_get.lo tio_put.lo time.lo misc.lo
|
||||
@ -120,6 +120,7 @@ JAR = @JAR@
|
||||
JAR_PATH = @JAR_PATH@
|
||||
JAVAC = @JAVAC@
|
||||
JAVAC_PATH = @JAVAC_PATH@
|
||||
LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBM = @LIBM@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
@ -130,7 +131,9 @@ LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
@ -208,6 +211,7 @@ libqsecmn_la_SOURCES = mem.h chr.h \
|
||||
misc.c
|
||||
|
||||
libqsecmn_la_LDFLAGS = -version-info 1:0:0 -no-undefined
|
||||
@WIN32_TRUE@libqsecmn_la_LIBADD = -lpsapi
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
|
@ -7,6 +7,8 @@
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#include <psapi.h>
|
||||
#include <tchar.h>
|
||||
#else
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
@ -19,7 +21,7 @@
|
||||
#endif
|
||||
|
||||
qse_fio_t* qse_fio_open (
|
||||
qse_mmgr_t* mmgr, qse_size_t ext,
|
||||
qse_mmgr_t* mmgr, qse_size_t ext,
|
||||
const qse_char_t* path, int flags, int mode)
|
||||
{
|
||||
qse_fio_t* fio;
|
||||
@ -31,7 +33,7 @@ qse_fio_t* qse_fio_open (
|
||||
QSE_ASSERTX (mmgr != QSE_NULL,
|
||||
"Set the memory manager with QSE_MMGR_SETDFL()");
|
||||
|
||||
if (mmgr == QSE_NULL) return QSE_NULL;
|
||||
if (mmgr == QSE_NULL) return QSE_NULL;
|
||||
}
|
||||
|
||||
fio = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_fio_t) + ext);
|
||||
@ -71,11 +73,11 @@ qse_fio_t* qse_fio_init (
|
||||
DWORD desired_access = 0;
|
||||
DWORD share_mode = FILE_SHARE_READ | FILE_SHARE_WRITE;
|
||||
DWORD creation_disposition = 0;
|
||||
DWORD attributes = FILE_ATTRIBUTE_NORMAL;
|
||||
DWORD flag_and_attr = FILE_ATTRIBUTE_NORMAL;
|
||||
|
||||
if (flags & QSE_FIO_APPEND)
|
||||
if (flags & QSE_FIO_APPEND)
|
||||
{
|
||||
/* this is not officialy documented for CreateFile.
|
||||
/* this is not officially documented for CreateFile.
|
||||
* ZwCreateFile (kernel) seems to document it */
|
||||
desired_access |= FILE_APPEND_DATA;
|
||||
}
|
||||
@ -86,41 +88,52 @@ qse_fio_t* qse_fio_init (
|
||||
desired_access |= GENERIC_WRITE;
|
||||
}
|
||||
if (flags & QSE_FIO_READ) desired_access |= GENERIC_READ;
|
||||
|
||||
if (flags & QSE_FIO_CREATE)
|
||||
|
||||
if (flags & QSE_FIO_CREATE)
|
||||
{
|
||||
creation_disposition =
|
||||
creation_disposition =
|
||||
(flags & QSE_FIO_EXCLUSIVE)? CREATE_NEW:
|
||||
(flags & QSE_FIO_TRUNCATE)? CREATE_ALWAYS: OPEN_ALWAYS;
|
||||
}
|
||||
else if (flags & QSE_FIO_TRUNCATE)
|
||||
else if (flags & QSE_FIO_TRUNCATE)
|
||||
{
|
||||
creation_disposition = TRUNCATE_EXISTING;
|
||||
}
|
||||
else creation_disposition = OPEN_EXISTING;
|
||||
|
||||
if (flags & QSE_FIO_NOSHRD) share_mode &= ~FILE_SHARE_READ;
|
||||
if (flags & QSE_FIO_NOSHWR) share_mode &= ~FILE_SHARE_WRITE;
|
||||
|
||||
if (flags & QSE_FIO_SYNC) attributes |= FILE_FLAG_WRITE_THROUGH;
|
||||
/* TODO: handle mode... set attribuets */
|
||||
handle = CreateFile (path,
|
||||
desired_access, share_mode, QSE_NULL,
|
||||
creation_disposition, attributes, 0);
|
||||
if (flags & QSE_FIO_NOSHRD)
|
||||
share_mode &= ~FILE_SHARE_READ;
|
||||
if (flags & QSE_FIO_NOSHWR)
|
||||
share_mode &= ~FILE_SHARE_WRITE;
|
||||
|
||||
if (!(mode & QSE_FIO_WUSR))
|
||||
flag_and_attr = FILE_ATTRIBUTE_READONLY;
|
||||
if (flags & QSE_FIO_SYNC)
|
||||
flag_and_attr |= FILE_FLAG_WRITE_THROUGH;
|
||||
|
||||
/* these two are just hints to OS */
|
||||
if (flags & QSE_FIO_RANDOM)
|
||||
flag_and_attr |= FILE_FLAG_RANDOM_ACCESS;
|
||||
if (flags & QSE_FIO_SEQUENTIAL)
|
||||
flag_and_attr |= FILE_FLAG_SEQUENTIAL_SCAN;
|
||||
|
||||
handle = CreateFile (path,
|
||||
desired_access, share_mode, QSE_NULL,
|
||||
creation_disposition, flag_and_attr, 0);
|
||||
}
|
||||
|
||||
if (handle == INVALID_HANDLE_VALUE) return QSE_NULL;
|
||||
|
||||
{
|
||||
DWORD file_type = GetFileType(handle);
|
||||
if (file_type == FILE_TYPE_UNKNOWN)
|
||||
if (file_type == FILE_TYPE_UNKNOWN)
|
||||
{
|
||||
CloseHandle (handle);
|
||||
return QSE_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* TODO: a lot more */
|
||||
/* TODO: support more features on WIN32 - TEMPORARY, DELETE_ON_CLOSE */
|
||||
#else
|
||||
|
||||
if (flags & QSE_FIO_HANDLE)
|
||||
@ -134,7 +147,7 @@ qse_fio_t* qse_fio_init (
|
||||
const qse_mchar_t* path_mb = path;
|
||||
#else
|
||||
qse_mchar_t path_mb[PATH_MAX + 1];
|
||||
if (qse_wcstombs_strict (path,
|
||||
if (qse_wcstombs_strict (path,
|
||||
path_mb, QSE_COUNTOF(path_mb)) == -1) return QSE_NULL;
|
||||
#endif
|
||||
/*
|
||||
@ -143,7 +156,7 @@ qse_fio_t* qse_fio_init (
|
||||
* wa -> WRONLY | APPEND
|
||||
* a -> WRONLY | APPEND
|
||||
*/
|
||||
if (flags & QSE_FIO_APPEND)
|
||||
if (flags & QSE_FIO_APPEND)
|
||||
{
|
||||
if ((flags & QSE_FIO_READ)) desired_access |= O_RDWR;
|
||||
else desired_access |= O_WRONLY;
|
||||
@ -151,7 +164,7 @@ qse_fio_t* qse_fio_init (
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((flags & QSE_FIO_READ) &&
|
||||
if ((flags & QSE_FIO_READ) &&
|
||||
(flags & QSE_FIO_WRITE)) desired_access |= O_RDWR;
|
||||
else if (flags & QSE_FIO_READ) desired_access |= O_RDONLY;
|
||||
else if (flags & QSE_FIO_WRITE) desired_access |= O_WRONLY;
|
||||
@ -208,27 +221,28 @@ qse_fio_off_t qse_fio_seek (
|
||||
qse_fio_t* fio, qse_fio_off_t offset, qse_fio_ori_t origin)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
static int seek_map[] =
|
||||
static int seek_map[] =
|
||||
{
|
||||
FILE_BEGIN,
|
||||
FILE_CURRENT,
|
||||
FILE_END
|
||||
FILE_END
|
||||
};
|
||||
LARGE_INTEGER x, y;
|
||||
|
||||
QSE_ASSERT (AES_SIZEOF(offset) <= AES_SIZEOF(x.QuadPart));
|
||||
|
||||
x.QuadPart = offset;
|
||||
if (SetFilePointerEx (fio->handle, x, &y, seek_map[origin]) == FALSE)
|
||||
if (SetFilePointerEx (fio->handle, x, &y, seek_map[origin]) == FALSE)
|
||||
{
|
||||
return (qse_fio_off_t)-1;
|
||||
}
|
||||
|
||||
return (qse_fio_off_t)y.QuadPart;
|
||||
|
||||
|
||||
/*
|
||||
x.QuadPart = offset;
|
||||
x.LowPart = SetFilePointer (fio->handle, x.LowPart, &x.HighPart, seek_map[origin]);
|
||||
x.LowPart = SetFilePointer (
|
||||
fio->handle, x.LowPart, &x.HighPart, seek_map[origin]);
|
||||
if (x.LowPart == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR)
|
||||
{
|
||||
return (qse_fio_off_t)-1;
|
||||
@ -238,7 +252,7 @@ qse_fio_off_t qse_fio_seek (
|
||||
*/
|
||||
|
||||
#else
|
||||
static int seek_map[] =
|
||||
static int seek_map[] =
|
||||
{
|
||||
SEEK_SET,
|
||||
SEEK_CUR,
|
||||
@ -248,9 +262,9 @@ qse_fio_off_t qse_fio_seek (
|
||||
#if !defined(_LP64) && defined(SYS__llseek)
|
||||
loff_t tmp;
|
||||
|
||||
if (syscall (SYS__llseek, fio->handle,
|
||||
if (syscall (SYS__llseek, fio->handle,
|
||||
(unsigned long)(offset>>32),
|
||||
(unsigned long)(offset&0xFFFFFFFFlu),
|
||||
(unsigned long)(offset&0xFFFFFFFFlu),
|
||||
&tmp,
|
||||
seek_map[origin]) == -1)
|
||||
{
|
||||
@ -281,7 +295,6 @@ int qse_fio_truncate (qse_fio_t* fio, qse_fio_off_t size)
|
||||
|
||||
return 0;
|
||||
#else
|
||||
|
||||
#if !defined(_LP64) && defined(SYS_ftruncate64)
|
||||
return syscall (SYS_ftruncate64, fio->handle, size);
|
||||
#elif defined(SYS_ftruncate)
|
||||
@ -303,7 +316,7 @@ qse_ssize_t qse_fio_read (qse_fio_t* fio, void* buf, qse_size_t size)
|
||||
return (qse_ssize_t)count;
|
||||
#else
|
||||
if (size > QSE_TYPE_MAX(size_t)) size = QSE_TYPE_MAX(size_t);
|
||||
#ifdef SYS_read
|
||||
#ifdef SYS_read
|
||||
return syscall (SYS_read, fio->handle, buf, size);
|
||||
#else
|
||||
return read (fio->handle, buf, size);
|
||||
@ -327,3 +340,122 @@ qse_ssize_t qse_fio_write (qse_fio_t* fio, const void* data, qse_size_t size)
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
static int get_devname_from_handle (
|
||||
HANDLE handle, qse_char_t* buf, qse_size_t len)
|
||||
{
|
||||
BOOL bSuccess = FALSE;
|
||||
HANDLE map = NULL;
|
||||
void* mem = NULL;
|
||||
DWORD olen;
|
||||
|
||||
/* create a file mapping object */
|
||||
map = CreateFileMapping (
|
||||
handle,
|
||||
NULL,
|
||||
PAGE_READONLY,
|
||||
0,
|
||||
1,
|
||||
NULL
|
||||
);
|
||||
if (map == NULL) return -1;
|
||||
|
||||
/* create a file mapping to get the file name. */
|
||||
mem = MapViewOfFile (map, FILE_MAP_READ, 0, 0, 1);
|
||||
if (mem == NULL)
|
||||
{
|
||||
CloseHandle (map);
|
||||
return -1;
|
||||
}
|
||||
|
||||
olen = GetMappedFileName (GetCurrentProcess(), mem, buf, len);
|
||||
if (olen == 0)
|
||||
{
|
||||
UnmapViewOfFile (mem);
|
||||
CloseHandle (map);
|
||||
return -1;
|
||||
}
|
||||
|
||||
UnmapViewOfFile (mem);
|
||||
CloseHandle (map);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_volname_from_handle (
|
||||
HANDLE handle, qse_char_t* buf, qse_size_t len)
|
||||
{
|
||||
|
||||
if (get_devname_from_handle (handle, buf, len) == -1) return -1;
|
||||
|
||||
if (_tcsnicmp(QSE_T("\\Device\\LanmanRedirector\\"), buf, 25) == 0)
|
||||
{
|
||||
buf[0] = QSE_T('\\');
|
||||
_tcscpy (&buf[1], &buf[24]);
|
||||
}
|
||||
else
|
||||
{
|
||||
DWORD n;
|
||||
qse_char_t drives[128];
|
||||
|
||||
n = GetLogicalDriveStrings (QSE_COUNTOF(drives), drives);
|
||||
|
||||
if (n == 0 /* error */ ||
|
||||
n > QSE_COUNTOF(drives) /* buffer small */)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
while (n > 0)
|
||||
{
|
||||
qse_char_t drv[3];
|
||||
qse_char_t path[MAX_PATH];
|
||||
|
||||
drv[0] = drives[--n];
|
||||
drv[1] = QSE_T(':');
|
||||
drv[2] = QSE_T('\0');
|
||||
if (QueryDosDevice (drv, path, QSE_COUNTOF(path)))
|
||||
{
|
||||
qse_size_t pl = _tcslen(path);
|
||||
qse_size_t bl = _tcslen(buf);
|
||||
if (bl > pl && buf[pl] == QSE_T('\\') &&
|
||||
_tcsnicmp(path, buf, pl) == 0)
|
||||
{
|
||||
buf[0] = drv[0];
|
||||
buf[1] = QSE_T(':');
|
||||
_tcscpy (&buf[2], &buf[pl]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* if the match is not found, the device name is returned
|
||||
* without translation */
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
int qse_fio_chmod (qse_fio_t* fio, int mode)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
int flags = FILE_ATTRIBUTE_NORMAL;
|
||||
qse_char_t name[MAX_PATH];
|
||||
|
||||
/* it is a best effort implementation. if the file size is 0,
|
||||
* it can't even get the file name from the handle and thus fails. */
|
||||
|
||||
if (get_volname_from_handle (
|
||||
fio->handle, name, QSE_COUNTOF(name)) == -1) return -1;
|
||||
|
||||
if (!(mode & QSE_FIO_WUSR)) flags = FILE_ATTRIBUTE_READONLY;
|
||||
return (SetFileAttributes (name, flags) == FALSE)? -1: 0;
|
||||
#else
|
||||
#if defined(SYS_fchmod)
|
||||
return syscall (SYS_fchmod, fio->handle, mode);
|
||||
#else
|
||||
return fchmod (fio->handle, mode);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
@ -120,6 +120,7 @@ JAR = @JAR@
|
||||
JAR_PATH = @JAR_PATH@
|
||||
JAVAC = @JAVAC@
|
||||
JAVAC_PATH = @JAVAC_PATH@
|
||||
LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBM = @LIBM@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
@ -130,7 +131,9 @@ LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
|
@ -118,6 +118,7 @@ JAR = @JAR@
|
||||
JAR_PATH = @JAR_PATH@
|
||||
JAVAC = @JAVAC@
|
||||
JAVAC_PATH = @JAVAC_PATH@
|
||||
LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBM = @LIBM@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
@ -128,7 +129,9 @@ LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
|
@ -118,6 +118,7 @@ JAR = @JAR@
|
||||
JAR_PATH = @JAR_PATH@
|
||||
JAVAC = @JAVAC@
|
||||
JAVAC_PATH = @JAVAC_PATH@
|
||||
LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBM = @LIBM@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
@ -128,7 +129,9 @@ LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
|
Reference in New Issue
Block a user