added some incomplete openvms code to fio
This commit is contained in:
parent
4105128b3a
commit
08e1e7c9a8
@ -41,6 +41,7 @@
|
|||||||
# include <dos.h>
|
# include <dos.h>
|
||||||
# include <dosfunc.h>
|
# include <dosfunc.h>
|
||||||
#elif defined(vms) || defined(__vms)
|
#elif defined(vms) || defined(__vms)
|
||||||
|
# define __NEW_STARLET 1
|
||||||
# include <starlet.h> /* (SYS$...) */
|
# include <starlet.h> /* (SYS$...) */
|
||||||
# include <ssdef.h> /* (SS$...) */
|
# include <ssdef.h> /* (SS$...) */
|
||||||
# include <lib$routines.h> /* (lib$...) */
|
# include <lib$routines.h> /* (lib$...) */
|
||||||
|
@ -39,7 +39,9 @@
|
|||||||
# include <fcntl.h>
|
# include <fcntl.h>
|
||||||
# include <errno.h>
|
# include <errno.h>
|
||||||
#elif defined(vms) || defined(__vms)
|
#elif defined(vms) || defined(__vms)
|
||||||
|
# define __NEW_STARLET 1
|
||||||
# include <starlet.h>
|
# include <starlet.h>
|
||||||
|
# include <rms.h>
|
||||||
#else
|
#else
|
||||||
# include "syscall.h"
|
# include "syscall.h"
|
||||||
#endif
|
#endif
|
||||||
@ -134,6 +136,20 @@ static qse_fio_errnum_t syserr_to_errnum (int e)
|
|||||||
return QSE_FIO_ESYSERR;
|
return QSE_FIO_ESYSERR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#elif defined(vms) || defined(__vms)
|
||||||
|
static qse_fio_errnum_t syserr_to_errnum (unsigned long e)
|
||||||
|
{
|
||||||
|
switch (e)
|
||||||
|
{
|
||||||
|
case RMS$_NORMAL:
|
||||||
|
return QSE_FIO_ENOERR;
|
||||||
|
|
||||||
|
/* TODO: add more */
|
||||||
|
|
||||||
|
default:
|
||||||
|
return QSE_FIO_ESYSERR;
|
||||||
|
}
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
static qse_fio_errnum_t syserr_to_errnum (int e)
|
static qse_fio_errnum_t syserr_to_errnum (int e)
|
||||||
{
|
{
|
||||||
@ -615,6 +631,130 @@ int qse_fio_init (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#elif defined(vms) || defined(__vms)
|
||||||
|
|
||||||
|
if (flags & QSE_FIO_HANDLE)
|
||||||
|
{
|
||||||
|
/* TODO: implement this */
|
||||||
|
fio->errnum = QSE_FIO_ENOIMPL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
struct FAB* fab;
|
||||||
|
struct RAB* rab;
|
||||||
|
unsigned long r0;
|
||||||
|
|
||||||
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
|
const qse_mchar_t* path_mb = path;
|
||||||
|
#else
|
||||||
|
qse_mchar_t path_mb_buf[1024];
|
||||||
|
qse_mchar_t* path_mb;
|
||||||
|
qse_size_t wl, ml;
|
||||||
|
int px;
|
||||||
|
|
||||||
|
path_mb = path_mb_buf;
|
||||||
|
ml = QSE_COUNTOF(path_mb_buf);
|
||||||
|
px = qse_wcstombs (path, &wl, path_mb, &ml);
|
||||||
|
if (px == -2)
|
||||||
|
{
|
||||||
|
/* the static buffer is too small.
|
||||||
|
* allocate a buffer */
|
||||||
|
path_mb = qse_wcstombsdup (path, mmgr);
|
||||||
|
if (path_mb == QSE_NULL)
|
||||||
|
{
|
||||||
|
fio->errnum = QSE_FIO_ENOMEM;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (px <= -1)
|
||||||
|
{
|
||||||
|
fio->errnum = QSE_FIO_EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
rab = (struct RAB*)QSE_MMGR_ALLOC (
|
||||||
|
mmgr, QSE_SIZEOF(*rab) + QSE_SIZEOF(*fab));
|
||||||
|
if (rab == QSE_NULL)
|
||||||
|
{
|
||||||
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
|
/* nothing to do */
|
||||||
|
#else
|
||||||
|
if (path_mb != path_mb_buf) QSE_MMGR_FREE (mmgr, path_mb);
|
||||||
|
#endif
|
||||||
|
fio->errnum = QSE_FIO_ENOMEM;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fab = (struct FAB*)(rab + 1);
|
||||||
|
*rab = cc$rms_rab;
|
||||||
|
rab->rab$l_fab = fab;
|
||||||
|
|
||||||
|
*fab = cc$rms_fab;
|
||||||
|
fab->fab$l_fna = path_mb;
|
||||||
|
fab->fab$b_fns = strlen(path_mb);
|
||||||
|
fab->fab$b_org = FAB$C_SEQ;
|
||||||
|
fab->fab$b_rfm = FAB$C_VAR; /* FAB$C_STM, FAB$C_STMLF, FAB$C_VAR, etc... */
|
||||||
|
fab->fab$b_fac = FAB$M_GET | FAB$M_PUT;
|
||||||
|
|
||||||
|
fab->fab$b_fac = FAB$M_NIL;
|
||||||
|
if (flags & QSE_FIO_READ) fab->fab$b_fac |= FAB$M_GET;
|
||||||
|
if (flags & (QSE_FIO_WRITE | QSE_FIO_APPEND)) fab->fab$b_fac |= FAB$M_PUT | FAB$M_TRN; /* put, truncate */
|
||||||
|
|
||||||
|
fab->fab$b_shr |= FAB$M_SHRPUT | FAB$M_SHRGET; /* FAB$M_NIL */
|
||||||
|
if (flags & QSE_FIO_NOSHREAD) fab->fab$b_shr &= ~FAB$M_SHRGET;
|
||||||
|
if (flags & QSE_FIO_NOSHWRITE) fab->fab$b_shr &= ~FAB$M_SHRPUT;
|
||||||
|
|
||||||
|
if (flags & QSE_FIO_APPEND) rab->rab$l_rop |= RAB$M_EOF;
|
||||||
|
|
||||||
|
if (flags & QSE_FIO_CREATE)
|
||||||
|
{
|
||||||
|
if (flags & QSE_FIO_EXCLUSIVE)
|
||||||
|
fab->fab$l_fop &= ~FAB$M_CIF;
|
||||||
|
else
|
||||||
|
fab->fab$l_fop |= FAB$M_CIF;
|
||||||
|
|
||||||
|
r0 = sys$create (&fab, 0, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
r0 = sys$open (&fab, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r0 != RMS$_NORMAL && r0 != RMS$_CREATED)
|
||||||
|
{
|
||||||
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
|
/* nothing to do */
|
||||||
|
#else
|
||||||
|
if (path_mb != path_mb_buf) QSE_MMGR_FREE (mmgr, path_mb);
|
||||||
|
#endif
|
||||||
|
fio->errnum = syserr_to_errnum (r0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
r0 = sys$connect (&rab, 0, 0);
|
||||||
|
if (r0 != RMS$_NORMAL)
|
||||||
|
{
|
||||||
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
|
/* nothing to do */
|
||||||
|
#else
|
||||||
|
if (path_mb != path_mb_buf) QSE_MMGR_FREE (mmgr, path_mb);
|
||||||
|
#endif
|
||||||
|
fio->errnum = syserr_to_errnum (r0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(QSE_CHAR_IS_MCHAR)
|
||||||
|
/* nothing to do */
|
||||||
|
#else
|
||||||
|
if (path_mb != path_mb_buf) QSE_MMGR_FREE (mmgr, path_mb);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
handle = rab;
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
if (flags & QSE_FIO_HANDLE)
|
if (flags & QSE_FIO_HANDLE)
|
||||||
@ -708,14 +848,14 @@ int qse_fio_init (
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* set some file access hints */
|
/* set some file access hints */
|
||||||
#if defined(POSIX_FADV_RANDOM)
|
#if defined(POSIX_FADV_RANDOM)
|
||||||
if (flags & QSE_FIO_RANDOM)
|
if (flags & QSE_FIO_RANDOM)
|
||||||
posix_fadvise (handle, 0, 0, POSIX_FADV_RANDOM);
|
posix_fadvise (handle, 0, 0, POSIX_FADV_RANDOM);
|
||||||
#endif
|
#endif
|
||||||
#if defined(POSIX_FADV_SEQUENTIAL)
|
#if defined(POSIX_FADV_SEQUENTIAL)
|
||||||
if (flags & QSE_FIO_SEQUENTIAL)
|
if (flags & QSE_FIO_SEQUENTIAL)
|
||||||
posix_fadvise (handle, 0, 0, POSIX_FADV_SEQUENTIAL);
|
posix_fadvise (handle, 0, 0, POSIX_FADV_SEQUENTIAL);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -729,10 +869,19 @@ void qse_fio_fini (qse_fio_t* fio)
|
|||||||
{
|
{
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
CloseHandle (fio->handle);
|
CloseHandle (fio->handle);
|
||||||
|
|
||||||
#elif defined(__OS2__)
|
#elif defined(__OS2__)
|
||||||
DosClose (fio->handle);
|
DosClose (fio->handle);
|
||||||
|
|
||||||
#elif defined(__DOS__)
|
#elif defined(__DOS__)
|
||||||
close (fio->handle);
|
close (fio->handle);
|
||||||
|
|
||||||
|
#elif defined(vms) || defined(__vms)
|
||||||
|
struct RAB* rab = (struct RAB*)fio->handle;
|
||||||
|
sys$disconnect (rab, 0, 0);
|
||||||
|
sys$close ((struct FAB*)(rab + 1), 0, 0);
|
||||||
|
QSE_MMGR_FREE (fio->mmgr, fio->handle);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
QSE_CLOSE (fio->handle);
|
QSE_CLOSE (fio->handle);
|
||||||
#endif
|
#endif
|
||||||
@ -759,6 +908,8 @@ qse_ubi_t qse_fio_gethandleasubi (const qse_fio_t* fio)
|
|||||||
handle.ul = fio->handle;
|
handle.ul = fio->handle;
|
||||||
#elif defined(__DOS__)
|
#elif defined(__DOS__)
|
||||||
handle.i = fio->handle;
|
handle.i = fio->handle;
|
||||||
|
#elif defined(vms) || defined(__vms)
|
||||||
|
handle.ptr = fio->handle;
|
||||||
#else
|
#else
|
||||||
handle.i = fio->handle;
|
handle.i = fio->handle;
|
||||||
#endif
|
#endif
|
||||||
@ -837,6 +988,11 @@ qse_fio_off_t qse_fio_seek (
|
|||||||
};
|
};
|
||||||
|
|
||||||
return lseek (fio->handle, offset, seek_map[origin]);
|
return lseek (fio->handle, offset, seek_map[origin]);
|
||||||
|
#elif defined(vms) || defined(__vms)
|
||||||
|
|
||||||
|
/* TODO: */
|
||||||
|
fio->errnum = QSE_FIO_ENOIMPL;
|
||||||
|
return (qse_fio_off_t)-1;
|
||||||
#else
|
#else
|
||||||
static int seek_map[] =
|
static int seek_map[] =
|
||||||
{
|
{
|
||||||
@ -908,6 +1064,19 @@ int qse_fio_truncate (qse_fio_t* fio, qse_fio_off_t size)
|
|||||||
if (n <= -1) fio->errnum = syserr_to_errnum (errno);
|
if (n <= -1) fio->errnum = syserr_to_errnum (errno);
|
||||||
return n;
|
return n;
|
||||||
|
|
||||||
|
#elif defined(vms) || defined(__vms)
|
||||||
|
|
||||||
|
unsigned long r0;
|
||||||
|
struct RAB* rab = (struct RAB*)fio->handle;
|
||||||
|
|
||||||
|
if ((r0 = sys$rewind (rab, 0, 0)) != RMS$_NORMAL ||
|
||||||
|
(r0 = sys$truncate (rab, 0, 0)) != RMS$_NORMAL)
|
||||||
|
{
|
||||||
|
fio->errnum = syserr_to_errnum (r0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
#else
|
#else
|
||||||
int n;
|
int n;
|
||||||
n = QSE_FTRUNCATE (fio->handle, size);
|
n = QSE_FTRUNCATE (fio->handle, size);
|
||||||
@ -954,6 +1123,24 @@ qse_ssize_t qse_fio_read (qse_fio_t* fio, void* buf, qse_size_t size)
|
|||||||
if (n <= -1) fio->errnum = syserr_to_errnum (errno);
|
if (n <= -1) fio->errnum = syserr_to_errnum (errno);
|
||||||
return n;
|
return n;
|
||||||
|
|
||||||
|
#elif defined(vms) || defined(__vms)
|
||||||
|
|
||||||
|
unsigned long r0;
|
||||||
|
struct RAB* rab = (struct RAB*)fio->handle;
|
||||||
|
|
||||||
|
if (size > 32767) size = 32767;
|
||||||
|
|
||||||
|
rab->rab$l_ubf = buf;
|
||||||
|
rab->rab$w_usz = size;
|
||||||
|
|
||||||
|
r0 = sys$get (rab, 0, 0);
|
||||||
|
if (r0 != RMS$_NORMAL)
|
||||||
|
{
|
||||||
|
fio->errnum = syserr_to_errnum (r0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rab->rab$w_rsz;
|
||||||
#else
|
#else
|
||||||
|
|
||||||
ssize_t n;
|
ssize_t n;
|
||||||
@ -1022,6 +1209,25 @@ qse_ssize_t qse_fio_write (qse_fio_t* fio, const void* data, qse_size_t size)
|
|||||||
if (n <= -1) fio->errnum = syserr_to_errnum (errno);
|
if (n <= -1) fio->errnum = syserr_to_errnum (errno);
|
||||||
return n;
|
return n;
|
||||||
|
|
||||||
|
#elif defined(vms) || defined(__vms)
|
||||||
|
|
||||||
|
unsigned long r0;
|
||||||
|
struct RAB* rab = (struct RAB*)fio->handle;
|
||||||
|
|
||||||
|
if (size > 32767) size = 32767;
|
||||||
|
|
||||||
|
rab->rab$l_rbf = (char*)data;
|
||||||
|
rab->rab$w_rsz = size;
|
||||||
|
|
||||||
|
r0 = sys$put (rab, 0, 0);
|
||||||
|
if (r0 != RMS$_NORMAL)
|
||||||
|
{
|
||||||
|
fio->errnum = syserr_to_errnum (r0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rab->rab$w_rsz;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
ssize_t n;
|
ssize_t n;
|
||||||
@ -1229,6 +1435,12 @@ int qse_fio_chmod (qse_fio_t* fio, int mode)
|
|||||||
fio->errnum = QSE_FIO_ENOIMPL;
|
fio->errnum = QSE_FIO_ENOIMPL;
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
#elif defined(vms) || defined(__vms)
|
||||||
|
|
||||||
|
/* TODO: */
|
||||||
|
fio->errnum = QSE_FIO_ENOIMPL;
|
||||||
|
return (qse_fio_off_t)-1;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
int n;
|
int n;
|
||||||
n = QSE_FCHMOD (fio->handle, mode);
|
n = QSE_FCHMOD (fio->handle, mode);
|
||||||
@ -1266,6 +1478,12 @@ int qse_fio_sync (qse_fio_t* fio)
|
|||||||
if (n <= -1) fio->errnum = syserr_to_errnum (errno);
|
if (n <= -1) fio->errnum = syserr_to_errnum (errno);
|
||||||
return n;
|
return n;
|
||||||
|
|
||||||
|
#elif defined(vms) || defined(__vms)
|
||||||
|
|
||||||
|
/* TODO: */
|
||||||
|
fio->errnum = QSE_FIO_ENOIMPL;
|
||||||
|
return (qse_fio_off_t)-1;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
int n;
|
int n;
|
||||||
@ -1306,6 +1524,9 @@ int qse_getstdfiohandle (qse_fio_std_t std, qse_fio_hnd_t* hnd)
|
|||||||
STD_OUTPUT_HANDLE,
|
STD_OUTPUT_HANDLE,
|
||||||
STD_ERROR_HANDLE
|
STD_ERROR_HANDLE
|
||||||
};
|
};
|
||||||
|
#elif defined(vms) || defined(__vms)
|
||||||
|
/* TODO */
|
||||||
|
int tab[] = { 0, 1, 2 };
|
||||||
#else
|
#else
|
||||||
|
|
||||||
qse_fio_hnd_t tab[] =
|
qse_fio_hnd_t tab[] =
|
||||||
@ -1329,6 +1550,9 @@ int qse_getstdfiohandle (qse_fio_std_t std, qse_fio_hnd_t* hnd)
|
|||||||
if (tmp == INVALID_HANDLE_VALUE) return -1;
|
if (tmp == INVALID_HANDLE_VALUE) return -1;
|
||||||
*hnd = tmp;
|
*hnd = tmp;
|
||||||
}
|
}
|
||||||
|
#elif defined(vms) || defined(__vms)
|
||||||
|
/* TODO: */
|
||||||
|
return -1;
|
||||||
#else
|
#else
|
||||||
*hnd = tab[std];
|
*hnd = tab[std];
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user