enhanced qse_fs_move() for dos build

This commit is contained in:
2012-02-21 09:23:51 +00:00
parent a48c498dc8
commit f2d767064e
16 changed files with 643 additions and 373 deletions

View File

@ -57,28 +57,28 @@ static qse_fio_errnum_t syserr_to_errnum (DWORD e)
switch (e)
{
case ERROR_NOT_ENOUGH_MEMORY:
case ERROR_OUTOFMEMORY:
return QSE_FIO_ENOMEM;
case ERROR_INVALID_PARAMETER:
case ERROR_INVALID_HANDLE:
case ERROR_INVALID_NAME:
return QSE_FIO_EINVAL;
case ERROR_FILE_NOT_FOUND:
case ERROR_PATH_NOT_FOUND:
return QSE_FIO_ENOENT;
case ERROR_ACCESS_DENIED:
return QSE_FIO_EACCES;
case ERROR_NOT_ENOUGH_MEMORY:
case ERROR_OUTOFMEMORY:
return QSE_FIO_ENOMEM;
case ERROR_FILE_NOT_FOUND:
case ERROR_PATH_NOT_FOUND:
return QSE_FIO_ENOENT;
case ERROR_ALREADY_EXISTS:
case ERROR_FILE_EXISTS:
return QSE_FIO_EEXIST;
default:
return QSE_FIO_ESUBSYS;
return QSE_FIO_ESYSERR;
}
}
#elif defined(__OS2__)
@ -86,26 +86,26 @@ static qse_fio_errnum_t syserr_to_errnum (APIRET e)
{
switch (e)
{
case ERROR_NOT_ENOUGH_MEMORY:
return QSE_FIO_ENOMEM;
case ERROR_INVALID_PARAMETER:
case ERROR_INVALID_HANDLE:
case ERROR_INVALID_NAME:
return QSE_FIO_EINVAL;
case ERROR_FILE_NOT_FOUND:
case ERROR_PATH_NOT_FOUND:
return QSE_FIO_ENOENT;
case ERROR_ACCESS_DENIED:
return QSE_FIO_EACCES;
case ERROR_NOT_ENOUGH_MEMORY:
return QSE_FIO_ENOMEM;
case ERROR_FILE_NOT_FOUND:
case ERROR_PATH_NOT_FOUND:
return QSE_FIO_ENOENT;
case ERROR_ALREADY_EXISTS:
return QSE_FIO_EEXIST;
default:
return QSE_FIO_ESUBSYS;
return QSE_FIO_ESYSERR;
}
}
#elif defined(__DOS__)
@ -119,17 +119,17 @@ static qse_fio_errnum_t syserr_to_errnum (int e)
case EINVAL:
return QSE_FIO_EINVAL;
case ENOENT:
return QSE_FIO_ENOENT;
case EACCES:
return QSE_FIO_EACCES;
case ENOENT:
return QSE_FIO_ENOENT;
case EEXIST:
return QSE_FIO_EEXIST;
default:
return QSE_FIO_ESUBSYS;
return QSE_FIO_ESYSERR;
}
}
#else
@ -156,7 +156,7 @@ static qse_fio_errnum_t syserr_to_errnum (int e)
return QSE_FIO_EINTR;
default:
return QSE_FIO_ESUBSYS;
return QSE_FIO_ESYSERR;
}
}
#endif

View File

@ -25,34 +25,17 @@ qse_fs_errnum_t qse_fs_geterrnum (qse_fs_t* fs)
return fs->errnum;
}
const qse_char_t* qse_fs_geterrmsg (qse_fs_t* fs)
{
static const qse_char_t* errstr[] =
{
QSE_T("no error"),
QSE_T("internal error that should never have happened"),
QSE_T("insufficient memory"),
QSE_T("invalid parameter or data"),
QSE_T("access denied"),
QSE_T("operation not permitted"),
QSE_T("no such entry"),
QSE_T("no working directory set"),
QSE_T("operation not permitted on directory"),
QSE_T("entry already exists"),
QSE_T("cross-device operation not allowed"),
QSE_T("system error")
};
return (fs->errnum >= 0 && fs->errnum < QSE_COUNTOF(errstr))?
errstr[fs->errnum]: QSE_T("unknown error");
}
qse_fs_errnum_t qse_fs_syserrtoerrnum (qse_fs_t* fs, qse_fs_syserr_t e)
{
#if defined(_WIN32)
switch (e)
{
case ERROR_NOT_ENOUGH_MEMORY:
case ERROR_OUTOFMEMORY:
return QSE_FS_ENOMEM;
case ERROR_INVALID_PARAMETER:
case ERROR_INVALID_HANDLE:
case ERROR_INVALID_NAME:
case ERROR_DIRECTORY:
return QSE_FS_EINVAL;
@ -64,47 +47,104 @@ qse_fs_errnum_t qse_fs_syserrtoerrnum (qse_fs_t* fs, qse_fs_syserr_t e)
case ERROR_PATH_NOT_FOUND:
return QSE_FS_ENOENT;
case ERROR_NOT_ENOUGH_MEMORY:
case ERROR_OUTOFMEMORY:
return QSE_FS_ENOMEM;
case ERROR_ALREADY_EXISTS:
case ERROR_FILE_EXISTS:
return QSE_FS_EEXIST;
case ERROR_NOT_SAME_DEVICE:
return QSE_FS_EXDEV;
default:
return QSE_FS_ESYSTEM;
return QSE_FS_ESYSERR;
}
#else
#elif defined(__OS2__)
switch (e)
{
case EINVAL:
case ERROR_NOT_ENOUGH_MEMORY:
return QSE_FS_ENOMEM;
case ERROR_INVALID_PARAMETER:
case ERROR_INVALID_HANDLE:
case ERROR_INVALID_NAME:
return QSE_FS_EINVAL;
case ERROR_ACCESS_DENIED:
return QSE_FS_EACCES;
case ERROR_FILE_NOT_FOUND:
case ERROR_PATH_NOT_FOUND:
return QSE_FS_ENOENT;
case ERROR_ALREADY_EXISTS:
return QSE_FS_EEXIST;
case ERROR_NOT_SAME_DEVICE:
return QSE_FS_EXDEV;
default:
return QSE_FS_ESYSERR;
}
#elif defined(__DOS__)
switch (e)
{
case ENOMEM:
return QSE_FS_ENOMEM;
case EACCES:
return QSE_FS_EACCES;
case EINVAL:
return QSE_FS_EINVAL;
case EACCES:
case EPERM:
return QSE_FS_EPERM;
return QSE_FS_EACCES;
case ENOENT:
case ENOTDIR:
return QSE_FS_ENOENT;
case EEXIST:
return QSE_FS_EEXIST;
case EISDIR:
return QSE_FS_EISDIR;
default:
return QSE_FS_ESYSERR;
}
#else
switch (e)
{
case ENOMEM:
return QSE_FS_ENOMEM;
case EINVAL:
return QSE_FS_EINVAL;
case EACCES:
case EPERM:
return QSE_FS_EACCES;
case ENOENT:
case ENOTDIR:
return QSE_FS_ENOENT;
case EEXIST:
return QSE_FS_EEXIST;
case EINTR:
return QSE_FS_EINTR;
case EISDIR:
return QSE_FS_EISDIR;
case EXDEV:
return QSE_FS_EXDEV;
default:
return QSE_FS_ESYSTEM;
return QSE_FS_ESYSERR;
}
#endif
}

View File

@ -45,16 +45,20 @@ struct fop_t
#if defined(_WIN32)
qse_wchar_t* old_path;
qse_wchar_t* new_path;
qse_wchar_t* new_path2;
/* nothing yet */
#elif defined(__OS2__)
qse_mchar_t* old_path;
qse_mchar_t* new_path;
#elif defined(__DOS__)
qse_mchar_t* old_path;
qse_mchar_t* new_path;
#else
qse_lstat_t old_stat;
qse_lstat_t new_stat;
qse_mchar_t* old_path;
qse_mchar_t* new_path;
qse_mchar_t* new_path2;
qse_lstat_t old_stat;
qse_lstat_t new_stat;
#endif
};
@ -63,7 +67,9 @@ typedef struct fop_t fop_t;
int qse_fs_move (
qse_fs_t* fs, const qse_char_t* oldpath, const qse_char_t* newpath)
{
#if defined(_WIN32)
/* ------------------------------------------------------ */
/* TODO: improve it... */
/* TODO: support cross-volume move, move by copy/delete, etc ... */
@ -87,21 +93,116 @@ int qse_fs_move (
}
return 0;
/* ------------------------------------------------------ */
#elif defined(__OS2__)
# error NOT IMPLEMENTED
#elif defined(__DOS__)
# error NOT IMPLEMENTED
#else
/* ------------------------------------------------------ */
/* TODO: improve it */
int ret = 0;
fop_t fop;
QSE_MEMSET (&fop, 0, QSE_SIZEOF(fop));
#if defined(QSE_CHAR_IS_MCHAR)
#if defined(QSE_CHAR_IS_MCHAR)
fop.old_path = oldpath;
fop.new_path = newpath;
#else
fop.old_path = qse_wcstombsdup (oldpath, fs->mmgr);
fop.new_path = qse_wcstombsdup (newpath, fs->mmgr);
if (fop.old_path == QSE_NULL || fop.old_path == QSE_NULL)
{
fs->errnum = QSE_FS_ENOMEM;
ret = -1;
}
#endif
if (ret == 0)
{
APIRET rc;
rc = DosMove (fop.old_path, fop.new_path);
if (rc == ERROR_ALREADY_EXISTS)
{
DosDelete (fop.new_path);
rc = DosMove (fop.old_path, fop.new_path);
}
if (rc != NO_ERROR)
{
fs->errnum = qse_fs_syserrtoerrnum (fs, rc);
ret = -1;
}
}
#if defined(QSE_CHAR_IS_MCHAR)
/* nothing special */
#else
if (fop.old_path) QSE_MMGR_FREE (fs->mmgr, fop.old_path);
if (fop.new_path) QSE_MMGR_FREE (fs->mmgr, fop.new_path);
#endif
return ret;
/* ------------------------------------------------------ */
#elif defined(__DOS__)
/* ------------------------------------------------------ */
/* TODO: improve it */
fop_t fop;
int ret = 0;
QSE_MEMSET (&fop, 0, QSE_SIZEOF(fop));
#if defined(QSE_CHAR_IS_MCHAR)
fop.old_path = oldpath;
fop.new_path = newpath;
#else
fop.old_path = qse_wcstombsdup (oldpath, fs->mmgr);
fop.new_path = qse_wcstombsdup (newpath, fs->mmgr);
if (fop.old_path == QSE_NULL || fop.old_path == QSE_NULL)
{
fs->errnum = QSE_FS_ENOMEM;
ret = -1;
}
#endif
if (ret == 0)
{
if (rename (fop.old_path, fop.new_path) <= -1)
{
/* FYI, rename() on watcom seems to set
* errno to EACCES when the new path exists. */
unlink (fop.new_path);
if (rename (fop.old_path, fop.new_path) <= -1)
{
fs->errnum = qse_fs_syserrtoerrnum (fs, errno);
ret = -1;
}
}
}
#if defined(QSE_CHAR_IS_MCHAR)
/* nothing special */
#else
if (fop.old_path) QSE_MMGR_FREE (fs->mmgr, fop.old_path);
if (fop.new_path) QSE_MMGR_FREE (fs->mmgr, fop.new_path);
#endif
return ret;
/* ------------------------------------------------------ */
#else
/* ------------------------------------------------------ */
fop_t fop;
QSE_MEMSET (&fop, 0, QSE_SIZEOF(fop));
#if defined(QSE_CHAR_IS_MCHAR)
fop.old_path = oldpath;
fop.new_path = newpath;
#else
fop.old_path = qse_wcstombsdup (oldpath, fs->mmgr);
fop.new_path = qse_wcstombsdup (newpath, fs->mmgr);
if (fop.old_path == QSE_NULL || fop.old_path == QSE_NULL)
@ -109,7 +210,7 @@ int qse_fs_move (
fs->errnum = QSE_FS_ENOMEM;
goto oops;
}
#endif
#endif
/* TOOD: implement confirmatio
if (overwrite_callback is set)
@ -226,26 +327,27 @@ qse_printf (QSE_T("TODO: cross-device copy....\n"));
copy recursively...
#endif
done:
#if defined(QSE_CHAR_IS_MCHAR)
#if defined(QSE_CHAR_IS_MCHAR)
if (fop.new_path2) QSE_MMGR_FREE (fs->mmgr, fop.new_path2);
#else
#else
if (fop.new_path2) QSE_MMGR_FREE (fs->mmgr, fop.new_path2);
QSE_MMGR_FREE (fs->mmgr, fop.old_path);
QSE_MMGR_FREE (fs->mmgr, fop.new_path);
#endif
#endif
return 0;
oops:
#if defined(QSE_CHAR_IS_MCHAR)
#if defined(QSE_CHAR_IS_MCHAR)
if (fop.new_path2) QSE_MMGR_FREE (fs->mmgr, fop.new_path2);
#else
#else
if (fop.new_path2) QSE_MMGR_FREE (fs->mmgr, fop.new_path2);
if (fop.old_path) QSE_MMGR_FREE (fs->mmgr, fop.old_path);
if (fop.new_path) QSE_MMGR_FREE (fs->mmgr, fop.new_path);
#endif
#endif
return -1;
/* ------------------------------------------------------ */
#endif
}

View File

@ -244,8 +244,10 @@ int qse_fs_chdir (qse_fs_t* fs, const qse_char_t* name)
#elif defined(__OS2__)
/* TODO: implement this */
return 0;
#elif defined(__DOS__)
/* TODO: implement this */
return 0;
#else
idx = 0;

View File

@ -24,12 +24,14 @@
# include <windows.h>
typedef DWORD qse_fs_syserr_t;
#elif defined(__OS2__)
# error NOT IMPLEMENTED
# define INCL_DOSERRORS
# include <os2.h>
typedef APIRET qse_fs_syserr_t;
#elif defined(__DOS__)
# error NOT IMPLEMENTED
# include <errno.h>
typedef int qse_fs_syserr_t;
#else
# include "syscall.h"
# include <errno.h>
typedef int qse_fs_syserr_t;
#endif

View File

@ -52,21 +52,21 @@ static qse_pio_errnum_t syserr_to_errnum (DWORD e)
{
switch (e)
{
case ERROR_NOT_ENOUGH_MEMORY:
case ERROR_OUTOFMEMORY:
return QSE_PIO_ENOMEM;
case ERROR_INVALID_PARAMETER:
case ERROR_INVALID_HANDLE:
case ERROR_INVALID_NAME:
return QSE_PIO_EINVAL;
case ERROR_FILE_NOT_FOUND:
case ERROR_PATH_NOT_FOUND:
return QSE_PIO_ENOENT;
case ERROR_ACCESS_DENIED:
return QSE_PIO_EACCES;
case ERROR_NOT_ENOUGH_MEMORY:
case ERROR_OUTOFMEMORY:
return QSE_PIO_ENOMEM;
case ERROR_FILE_NOT_FOUND:
case ERROR_PATH_NOT_FOUND:
return QSE_PIO_ENOENT;
case ERROR_ALREADY_EXISTS:
case ERROR_FILE_EXISTS:
@ -76,7 +76,7 @@ static qse_pio_errnum_t syserr_to_errnum (DWORD e)
return QSE_PIO_EPIPE;
default:
return QSE_PIO_ESUBSYS;
return QSE_PIO_ESYSERR;
}
}
#elif defined(__OS2__)
@ -84,20 +84,20 @@ static qse_pio_errnum_t syserr_to_errnum (APIRET e)
{
switch (e)
{
case ERROR_NOT_ENOUGH_MEMORY:
return QSE_PIO_ENOMEM;
case ERROR_INVALID_PARAMETER:
case ERROR_INVALID_HANDLE:
case ERROR_INVALID_NAME:
return QSE_PIO_EINVAL;
case ERROR_FILE_NOT_FOUND:
case ERROR_PATH_NOT_FOUND:
return QSE_PIO_ENOENT;
case ERROR_ACCESS_DENIED:
return QSE_PIO_EACCES;
case ERROR_NOT_ENOUGH_MEMORY:
return QSE_PIO_ENOMEM;
case ERROR_FILE_NOT_FOUND:
case ERROR_PATH_NOT_FOUND:
return QSE_PIO_ENOENT;
case ERROR_ALREADY_EXISTS:
return QSE_PIO_EEXIST;
@ -106,7 +106,7 @@ static qse_pio_errnum_t syserr_to_errnum (APIRET e)
return QSE_PIO_EPIPE;
default:
return QSE_PIO_ESUBSYS;
return QSE_PIO_ESYSERR;
}
}
#elif defined(__DOS__)
@ -120,17 +120,17 @@ static qse_pio_errnum_t syserr_to_errnum (int e)
case EINVAL:
return QSE_PIO_EINVAL;
case ENOENT:
return QSE_PIO_ENOENT;
case EACCES:
return QSE_PIO_EACCES;
case ENOENT:
return QSE_PIO_ENOENT;
case EEXIST:
return QSE_PIO_EEXIST;
default:
return QSE_PIO_ESUBSYS;
return QSE_PIO_ESYSERR;
}
}
#else
@ -144,12 +144,12 @@ static qse_pio_errnum_t syserr_to_errnum (int e)
case EINVAL:
return QSE_PIO_EINVAL;
case ENOENT:
return QSE_PIO_ENOENT;
case EACCES:
return QSE_PIO_EACCES;
case ENOENT:
return QSE_PIO_ENOENT;
case EEXIST:
return QSE_PIO_EEXIST;
@ -160,7 +160,7 @@ static qse_pio_errnum_t syserr_to_errnum (int e)
return QSE_PIO_EPIPE;
default:
return QSE_PIO_ESUBSYS;
return QSE_PIO_ESYSERR;
}
}
#endif
@ -1663,7 +1663,7 @@ create_process:
return 0;
oops:
if (pio->errnum == QSE_PIO_ENOERR) pio->errnum = QSE_PIO_ESUBSYS;
if (pio->errnum == QSE_PIO_ENOERR) pio->errnum = QSE_PIO_ESYSERR;
#if defined(_WIN32)
if (windevnul != INVALID_HANDLE_VALUE) CloseHandle (windevnul);
@ -2049,7 +2049,7 @@ int qse_pio_wait (qse_pio_t* pio)
if (w != WAIT_OBJECT_0)
{
/* WAIT_FAILED, WAIT_ABANDONED */
pio->errnum = QSE_PIO_ESUBSYS;
pio->errnum = QSE_PIO_ESYSERR;
return -1;
}
@ -2062,7 +2062,7 @@ int qse_pio_wait (qse_pio_t* pio)
CloseHandle (pio->child);
pio->child = QSE_PIO_PID_NIL;
pio->errnum = QSE_PIO_ESUBSYS;
pio->errnum = QSE_PIO_ESYSERR;
return -1;
}
@ -2075,7 +2075,7 @@ int qse_pio_wait (qse_pio_t* pio)
/* this should not happen as the control reaches here
* only when WaitforSingleObject() is successful.
* if it happends, close the handle and return an error */
pio->errnum = QSE_PIO_ESUBSYS;
pio->errnum = QSE_PIO_ESYSERR;
return -1;
}
@ -2108,7 +2108,7 @@ int qse_pio_wait (qse_pio_t* pio)
if (rc != NO_ERROR)
{
/* WAIT_FAILED, WAIT_ABANDONED */
pio->errnum = QSE_PIO_ESUBSYS;
pio->errnum = QSE_PIO_ESYSERR;
return -1;
}
@ -2225,7 +2225,7 @@ int qse_pio_kill (qse_pio_t* pio)
n = TerminateProcess (pio->child, 255 + 1 + 9);
if (n == FALSE)
{
pio->errnum = QSE_PIO_ESUBSYS;
pio->errnum = QSE_PIO_ESYSERR;
return -1;
}
return 0;
@ -2235,7 +2235,7 @@ int qse_pio_kill (qse_pio_t* pio)
rc = DosKillProcess (pio->child, DKP_PROCESSTREE);
if (rc != NO_ERROR)
{
pio->errnum = QSE_PIO_ESUBSYS;
pio->errnum = QSE_PIO_ESYSERR;
return -1;
}
return 0;
@ -2247,7 +2247,7 @@ int qse_pio_kill (qse_pio_t* pio)
#else
n = QSE_KILL (pio->child, SIGKILL);
if (n <= -1) pio->errnum = QSE_PIO_ESUBSYS;
if (n <= -1) pio->errnum = QSE_PIO_ESYSERR;
return n;
#endif
}

View File

@ -57,8 +57,8 @@ static qse_sio_errnum_t fio_errnum_to_sio_errnum (qse_fio_t* fio)
return QSE_SIO_EEXIST;
case QSE_FIO_EINTR:
return QSE_SIO_EINTR;
case QSE_FIO_ESUBSYS:
return QSE_SIO_ESUBSYS;
case QSE_FIO_ESYSERR:
return QSE_SIO_ESYSERR;
case QSE_FIO_ENOIMPL:
return QSE_SIO_ENOIMPL;
default:
@ -443,14 +443,14 @@ qse_ssize_t qse_sio_putwcs (qse_sio_t* sio, const qse_wchar_t* str)
sio->u.file.handle, cur, left,
&count, QSE_NULL) == FALSE)
{
sio->errnum = QSE_SIO_ESUBSYS;
sio->errnum = QSE_SIO_ESYSERR;
return -1;
}
if (count == 0) break;
if (count > left)
{
sio->errnum = QSE_SIO_ESUBSYS;
sio->errnum = QSE_SIO_ESYSERR;
return -1;
}
}
@ -502,7 +502,7 @@ qse_ssize_t qse_sio_putwcsn (
sio->u.file.handle, cur, left,
&count, QSE_NULL) == FALSE)
{
sio->errnum = QSE_SIO_ESUBSYS;
sio->errnum = QSE_SIO_ESYSERR;
return -1;
}
if (count == 0) break;
@ -517,7 +517,7 @@ qse_ssize_t qse_sio_putwcsn (
*/
if (count > left)
{
sio->errnum = QSE_SIO_ESUBSYS;
sio->errnum = QSE_SIO_ESYSERR;
return -1;
}
}