interim commit while overhauling pio
This commit is contained in:
parent
afefb7b85a
commit
b037bfcaf5
@ -8,29 +8,72 @@
|
|||||||
#include <qse/types.h>
|
#include <qse/types.h>
|
||||||
#include <qse/macros.h>
|
#include <qse/macros.h>
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
IN_FROM_NUL /* < /dev/null */
|
||||||
|
IN_DROP
|
||||||
|
IN_ACCEPT
|
||||||
|
IN_KEEP
|
||||||
|
|
||||||
|
OUT_TO_NUL /* > /dev/null */
|
||||||
|
OUT_DROP /* close it.. */
|
||||||
|
OUT_ACCEPT
|
||||||
|
OUT_KEEP /* dont do anything */
|
||||||
|
|
||||||
|
ERR_TO_NUL
|
||||||
|
ERR_DROP
|
||||||
|
ERR_ACCEPT
|
||||||
|
ERR_KEEP
|
||||||
|
#endif
|
||||||
|
|
||||||
enum qse_pio_open_flag_t
|
enum qse_pio_open_flag_t
|
||||||
{
|
{
|
||||||
QSE_PIO_READ = (1 << 1),
|
QSE_PIO_WRITEIN = (1 << 0),
|
||||||
QSE_PIO_WRITE = (1 << 2),
|
QSE_PIO_READOUT = (1 << 1),
|
||||||
|
QSE_PIO_READERR = (1 << 2),
|
||||||
|
QSE_PIO_DROPIN = (1 << 3),
|
||||||
|
QSE_PIO_DROPOUT = (1 << 4),
|
||||||
|
QSE_PIO_DROPERR = (1 << 5),
|
||||||
|
QSE_PIO_ERRTOOUT = (1 << 6),
|
||||||
|
QSE_PIO_OUTTOERR = (1 << 7),
|
||||||
|
QSE_PIO_ERRTONUL = (1 << 8),
|
||||||
|
QSE_PIO_OUTTONUL = (1 << 9),
|
||||||
|
|
||||||
|
QSE_PIO_READ = (QSE_PIO_READOUT),
|
||||||
|
QSE_PIO_WRITE = (QSE_PIO_WRITEIN)
|
||||||
|
};
|
||||||
|
|
||||||
|
enum qse_pio_rw_flag_t
|
||||||
|
{
|
||||||
|
QSE_PIO_IN = (1 << 0),
|
||||||
|
QSE_PIO_OUT = (1 << 1),
|
||||||
|
QSE_PIO_ERR = (1 << 2),
|
||||||
|
|
||||||
|
QSE_PIO_END = (1 << 8)
|
||||||
|
};
|
||||||
|
|
||||||
|
enum qse_pio_handle_id_t
|
||||||
|
{
|
||||||
|
QSE_PIO_HANDLE_IN = 0,
|
||||||
|
QSE_PIO_HANDLE_OUT = 1,
|
||||||
|
QSE_PIO_HANDLE_ERR = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
/* <winnt.h> => typedef PVOID HANDLE; */
|
/* <winnt.h> => typedef PVOID HANDLE; */
|
||||||
typedef void* qse_pio_hnd_t;
|
typedef void* qse_pio_hnd_t;
|
||||||
|
typedef int qse_pio_pid_t; /* TODO */
|
||||||
#else
|
#else
|
||||||
typedef int qse_pio_hnd_t;
|
typedef int qse_pio_hnd_t;
|
||||||
|
typedef int qse_pio_pid_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* pipe offset */
|
|
||||||
typedef qse_int64_t qse_pio_off_t;
|
|
||||||
typedef enum qse_pio_seek_origin_t qse_pio_ori_t;
|
|
||||||
|
|
||||||
typedef struct qse_pio_t qse_pio_t;
|
typedef struct qse_pio_t qse_pio_t;
|
||||||
|
|
||||||
struct qse_pio_t
|
struct qse_pio_t
|
||||||
{
|
{
|
||||||
qse_mmgr_t* mmgr;
|
qse_mmgr_t* mmgr;
|
||||||
qse_pio_hnd_t handle;
|
qse_pio_pid_t child;
|
||||||
|
qse_pio_hnd_t handle[3];
|
||||||
};
|
};
|
||||||
|
|
||||||
#define QSE_PIO_MMGR(pio) ((pio)->mmgr)
|
#define QSE_PIO_MMGR(pio) ((pio)->mmgr)
|
||||||
@ -44,18 +87,13 @@ extern "C" {
|
|||||||
* NAME
|
* NAME
|
||||||
* qse_pio_open - open a pipe to a child process
|
* qse_pio_open - open a pipe to a child process
|
||||||
*
|
*
|
||||||
* DESCRIPTION
|
|
||||||
* To open a pipe, you should set the flags with at least one of
|
|
||||||
* QSE_PIO_READ, QSE_PIO_WRITE, QSE_PIO_APPEND.
|
|
||||||
*
|
|
||||||
* SYNOPSIS
|
* SYNOPSIS
|
||||||
*/
|
*/
|
||||||
qse_pio_t* qse_pio_open (
|
qse_pio_t* qse_pio_open (
|
||||||
qse_mmgr_t* mmgr,
|
qse_mmgr_t* mmgr,
|
||||||
qse_size_t ext,
|
qse_size_t ext,
|
||||||
const qse_char_t* path,
|
const qse_char_t* path,
|
||||||
int flags,
|
int flags
|
||||||
int mode
|
|
||||||
);
|
);
|
||||||
/******/
|
/******/
|
||||||
|
|
||||||
@ -74,44 +112,68 @@ qse_pio_t* qse_pio_init (
|
|||||||
qse_pio_t* pio,
|
qse_pio_t* pio,
|
||||||
qse_mmgr_t* mmgr,
|
qse_mmgr_t* mmgr,
|
||||||
const qse_char_t* path,
|
const qse_char_t* path,
|
||||||
int flags,
|
int flags
|
||||||
int mode
|
|
||||||
);
|
);
|
||||||
|
|
||||||
void qse_pio_fini (
|
void qse_pio_fini (
|
||||||
qse_pio_t* pio
|
qse_pio_t* pio
|
||||||
);
|
);
|
||||||
|
|
||||||
qse_pio_hnd_t qse_pio_gethandle (
|
/****f* qse.pio/qse_pio_wait
|
||||||
qse_pio_t* pio
|
|
||||||
);
|
|
||||||
|
|
||||||
/****f* qse.cmn.pio/qse_pio_sethandle
|
|
||||||
* NAME
|
* NAME
|
||||||
* qse_pio_sethandle - set the pipe handle
|
* qse_pio_wait - wait for a child process
|
||||||
* WARNING
|
*
|
||||||
* Avoid using this function if you don't know what you are doing.
|
|
||||||
* You may have to retrieve the previous handle using qse_pio_gethandle()
|
|
||||||
* to take relevant actions before resetting it with qse_pio_sethandle().
|
|
||||||
* SYNOPSIS
|
* SYNOPSIS
|
||||||
*/
|
*/
|
||||||
void qse_pio_sethandle (
|
int qse_pio_wait (
|
||||||
qse_pio_t* pio,
|
qse_pio_t* pio
|
||||||
qse_pio_hnd_t handle
|
|
||||||
);
|
);
|
||||||
/******/
|
/******/
|
||||||
|
|
||||||
|
|
||||||
|
/****f* qse.pio/qse_pio_read
|
||||||
|
* NAME
|
||||||
|
* qse_pio_read - read data
|
||||||
|
*
|
||||||
|
* SYNOPSIS
|
||||||
|
*/
|
||||||
qse_ssize_t qse_pio_read (
|
qse_ssize_t qse_pio_read (
|
||||||
qse_pio_t* pio,
|
qse_pio_t* pio,
|
||||||
void* buf,
|
void* buf,
|
||||||
qse_size_t size
|
qse_size_t size,
|
||||||
|
int flags
|
||||||
);
|
);
|
||||||
|
/******/
|
||||||
|
|
||||||
|
/****f* qse.pio/qse_pio_write
|
||||||
|
* NAME
|
||||||
|
* qse_pio_write - write data
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
* If the parameter 'size' is zero, qse_pio_write() closes the the writing
|
||||||
|
* stream causing the child process reach the end of the stream.
|
||||||
|
*
|
||||||
|
* SYNOPSIS
|
||||||
|
*/
|
||||||
qse_ssize_t qse_pio_write (
|
qse_ssize_t qse_pio_write (
|
||||||
qse_pio_t* pio,
|
qse_pio_t* pio,
|
||||||
const void* buf,
|
const void* data,
|
||||||
qse_size_t size
|
qse_size_t size,
|
||||||
|
int flags
|
||||||
);
|
);
|
||||||
|
/******/
|
||||||
|
|
||||||
|
/****f* qse.pio/qse_pio_end
|
||||||
|
* NAME
|
||||||
|
* qse_pio_end
|
||||||
|
*
|
||||||
|
* SYNOPSIS
|
||||||
|
*/
|
||||||
|
void qse_pio_end (
|
||||||
|
qse_pio_t* pio,
|
||||||
|
int flags
|
||||||
|
);
|
||||||
|
/******/
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -247,10 +247,10 @@ qse_fio_off_t qse_fio_seek (
|
|||||||
SEEK_END
|
SEEK_END
|
||||||
};
|
};
|
||||||
|
|
||||||
#if !defined(_LP64) && defined(SYS__llseek)
|
#if defined(QSE_LLSEEK)
|
||||||
loff_t tmp;
|
loff_t tmp;
|
||||||
|
|
||||||
if (syscall (SYS__llseek, fio->handle,
|
if (QSE_LLSEEK (fio->handle,
|
||||||
(unsigned long)(offset>>32),
|
(unsigned long)(offset>>32),
|
||||||
(unsigned long)(offset&0xFFFFFFFFlu),
|
(unsigned long)(offset&0xFFFFFFFFlu),
|
||||||
&tmp,
|
&tmp,
|
||||||
@ -261,12 +261,10 @@ qse_fio_off_t qse_fio_seek (
|
|||||||
|
|
||||||
return (qse_fio_off_t)tmp;
|
return (qse_fio_off_t)tmp;
|
||||||
|
|
||||||
#elif defined(SYS_lseek)
|
#elif defined(HAVE_LSEEK64)
|
||||||
return syscall (SYS_lseek, fio->handle, offset, seek_map[origin]);
|
return QSE_LSEEK64 (fio->handle, offset, seek_map[origin]);
|
||||||
#elif !defined(_LP64) && defined(HAVE_LSEEK64)
|
|
||||||
return lseek64 (fio->handle, offset, seek_map[origin]);
|
|
||||||
#else
|
#else
|
||||||
return lseek (fio->handle, offset, seek_map[origin]);
|
return QSE_LSEEK (fio->handle, offset, seek_map[origin]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@ -283,7 +281,7 @@ int qse_fio_truncate (qse_fio_t* fio, qse_fio_off_t size)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
#else
|
#else
|
||||||
return QSE_TRUNCATE (fio->handle, size);
|
return QSE_FTRUNCATE (fio->handle, size);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -424,10 +422,6 @@ int qse_fio_chmod (qse_fio_t* fio, int mode)
|
|||||||
if (!(mode & QSE_FIO_WUSR)) flags = FILE_ATTRIBUTE_READONLY;
|
if (!(mode & QSE_FIO_WUSR)) flags = FILE_ATTRIBUTE_READONLY;
|
||||||
return (SetFileAttributes (name, flags) == FALSE)? -1: 0;
|
return (SetFileAttributes (name, flags) == FALSE)? -1: 0;
|
||||||
#else
|
#else
|
||||||
#if defined(SYS_fchmod)
|
return QSE_FCHMOD (fio->handle, mode);
|
||||||
return syscall (SYS_fchmod, fio->handle, mode);
|
|
||||||
#else
|
|
||||||
return fchmod (fio->handle, mode);
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -7,19 +7,19 @@
|
|||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <psapi.h>
|
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
#else
|
#else
|
||||||
#include "syscall.h"
|
#include "syscall.h"
|
||||||
#include <sys/types.h>
|
#include <errno.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define HNDIN(pio) ((pio)->handle[QSE_PIO_HANDLE_IN])
|
||||||
|
#define HNDOUT(pio) ((pio)->handle[QSE_PIO_HANDLE_OUT])
|
||||||
|
#define HNDERR(pio) ((pio)->handle[QSE_PIO_HANDLE_ERR])
|
||||||
|
|
||||||
qse_pio_t* qse_pio_open (
|
qse_pio_t* qse_pio_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)
|
const qse_char_t* path, int flags)
|
||||||
{
|
{
|
||||||
qse_pio_t* pio;
|
qse_pio_t* pio;
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ qse_pio_t* qse_pio_open (
|
|||||||
pio = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_pio_t) + ext);
|
pio = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_pio_t) + ext);
|
||||||
if (pio == QSE_NULL) return QSE_NULL;
|
if (pio == QSE_NULL) return QSE_NULL;
|
||||||
|
|
||||||
if (qse_pio_init (pio, mmgr, path, flags, mode) == QSE_NULL)
|
if (qse_pio_init (pio, mmgr, path, flags) == QSE_NULL)
|
||||||
{
|
{
|
||||||
QSE_MMGR_FREE (mmgr, pio);
|
QSE_MMGR_FREE (mmgr, pio);
|
||||||
return QSE_NULL;
|
return QSE_NULL;
|
||||||
@ -51,23 +51,148 @@ void qse_pio_close (qse_pio_t* pio)
|
|||||||
QSE_MMGR_FREE (pio->mmgr, pio);
|
QSE_MMGR_FREE (pio->mmgr, pio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
qse_pio_t* qse_pio_init (
|
qse_pio_t* qse_pio_init (
|
||||||
qse_pio_t* pio, qse_mmgr_t* mmgr,
|
qse_pio_t* pio, qse_mmgr_t* mmgr,
|
||||||
const qse_char_t* path, int flags, int mode)
|
const qse_char_t* path, int flags)
|
||||||
{
|
{
|
||||||
qse_pio_hnd_t handle;
|
qse_pio_pid_t pid;
|
||||||
|
qse_pio_hnd_t handle[6] = { -1, -1, -1, -1, -1, -1 };
|
||||||
|
int i, minidx = -1, maxidx = -1;
|
||||||
|
|
||||||
|
QSE_ASSERT (QSE_COUNTOF(pio->hanlde) == QSE_COUNTOF(handle));
|
||||||
|
|
||||||
QSE_MEMSET (pio, 0, QSE_SIZEOF(*pio));
|
QSE_MEMSET (pio, 0, QSE_SIZEOF(*pio));
|
||||||
pio->mmgr = mmgr;
|
pio->mmgr = mmgr;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
handle = -1;
|
/* TODO: XXXXXXXXXXXXXXXXX */
|
||||||
#else
|
#else
|
||||||
handle = -1;
|
if (flags & QSE_PIO_WRITEIN)
|
||||||
|
{
|
||||||
|
if (QSE_PIPE(&handle[0]) == -1) goto oops;
|
||||||
|
minidx = 0; maxidx = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & QSE_PIO_READOUT)
|
||||||
|
{
|
||||||
|
if (QSE_PIPE(&handle[2]) == -1) goto oops;
|
||||||
|
if (minidx == -1) minidx = 2;
|
||||||
|
maxidx = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & QSE_PIO_READERR)
|
||||||
|
{
|
||||||
|
if (QSE_PIPE(&handle[4]) == -1) goto oops;
|
||||||
|
if (minidx == -1) minidx = 4;
|
||||||
|
maxidx = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (maxidx == -1) goto oops;
|
||||||
|
|
||||||
|
pid = QSE_FORK();
|
||||||
|
if (pid == -1) goto oops;
|
||||||
|
|
||||||
|
if (pid == 0)
|
||||||
|
{
|
||||||
|
/* child */
|
||||||
|
|
||||||
|
if (flags & QSE_PIO_WRITEIN)
|
||||||
|
{
|
||||||
|
/* child should read */
|
||||||
|
QSE_CLOSE (handle[1]);
|
||||||
|
if (QSE_DUP2 (handle[0], 0) == -1) goto child_oops;
|
||||||
|
QSE_CLOSE (handle[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & QSE_PIO_READOUT)
|
||||||
|
{
|
||||||
|
/* child should write */
|
||||||
|
QSE_CLOSE (handle[2]);
|
||||||
|
if (QSE_DUP2 (handle[3], 1) == -1) goto child_oops;
|
||||||
|
|
||||||
|
if (flags & QSE_PIO_ERRTOOUT)
|
||||||
|
{
|
||||||
|
if (QSE_DUP2 (handle[3], 2) == -1) goto child_oops;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSE_CLOSE (handle[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & QSE_PIO_READERR)
|
||||||
|
{
|
||||||
|
/* child should write */
|
||||||
|
QSE_CLOSE (handle[4]);
|
||||||
|
if (QSE_DUP2 (handle[5], 2) == -1) goto child_oops;
|
||||||
|
|
||||||
|
if (flags & QSE_PIO_OUTTOERR)
|
||||||
|
{
|
||||||
|
if (QSE_DUP2 (handle[5], 1) == -1) goto child_oops;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSE_CLOSE (handle[5]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* TODO: ... */
|
||||||
|
//execl ("/bin/sh", "sh", "-c", "cat", QSE_NULL);
|
||||||
|
execl ("/bin/sh", "sh", "-c", "cat -aksksks", QSE_NULL);
|
||||||
|
|
||||||
|
child_oops:
|
||||||
|
QSE_EXIT(127);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* parent */
|
||||||
|
pio->child = pid;
|
||||||
|
|
||||||
|
if (flags & QSE_PIO_WRITEIN)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* 012345
|
||||||
|
* rw----
|
||||||
|
* X
|
||||||
|
* WRITE => 1
|
||||||
|
*/
|
||||||
|
QSE_CLOSE (handle[0]); handle[0] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & QSE_PIO_READOUT)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* 012345
|
||||||
|
* --rw--
|
||||||
|
* X
|
||||||
|
* READ => 2
|
||||||
|
*/
|
||||||
|
QSE_CLOSE (handle[3]); handle[3] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & QSE_PIO_READERR)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* 012345
|
||||||
|
* ----rw
|
||||||
|
* X
|
||||||
|
* READ => 4
|
||||||
|
*/
|
||||||
|
QSE_CLOSE (handle[5]); handle[5] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pio->handle = handle;
|
HNDIN(pio) = handle[1];
|
||||||
|
HNDOUT(pio) = handle[2];
|
||||||
|
HNDERR(pio) = handle[4];
|
||||||
|
|
||||||
|
for (i = minidx; i < maxidx; i++)
|
||||||
|
{
|
||||||
|
qse_printf (QSE_T("%d ==> %d\n"), i, handle[i]);
|
||||||
|
}
|
||||||
return pio;
|
return pio;
|
||||||
|
|
||||||
|
oops:
|
||||||
|
for (i = minidx; i < maxidx; i++) QSE_CLOSE (handle[i]);
|
||||||
|
return QSE_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void qse_pio_fini (qse_pio_t* pio)
|
void qse_pio_fini (qse_pio_t* pio)
|
||||||
@ -75,21 +200,60 @@ void qse_pio_fini (qse_pio_t* pio)
|
|||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
CloseHandle (pio->handle);
|
CloseHandle (pio->handle);
|
||||||
#else
|
#else
|
||||||
QSE_CLOSE (pio->handle);
|
int i, status;
|
||||||
|
|
||||||
|
if (HNDOUT(pio) != -1)
|
||||||
|
{
|
||||||
|
QSE_CLOSE (HNDOUT(pio));
|
||||||
|
HNDOUT(pio) = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HNDIN(pio) != -1)
|
||||||
|
{
|
||||||
|
QSE_CLOSE (HNDIN(pio));
|
||||||
|
HNDIN(pio) = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (QSE_WAITPID (pio->child, &status, 0) == -1)
|
||||||
|
{
|
||||||
|
if (errno != EINTR) break;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_pio_hnd_t qse_pio_gethandle (qse_pio_t* pio)
|
int qse_pio_wait (qse_pio_t* pio)
|
||||||
{
|
{
|
||||||
return pio->handle;
|
int status;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
if (opt & QSE_PIO_NOWAIT)
|
||||||
|
{
|
||||||
|
opt |= WNOHANG;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
n = waitpid (pio->child, &status, opt);
|
||||||
|
if (n == 0) break;
|
||||||
|
/* TODO: .... */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
output => return code...
|
||||||
|
output => termination cause...
|
||||||
|
#endif
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void qse_pio_sethandle (qse_pio_t* pio, qse_pio_hnd_t handle)
|
/*
|
||||||
|
qse_pio_hnd_t qse_pio_gethandle (qse_pio_t* pio, int readorwrite)
|
||||||
{
|
{
|
||||||
pio->handle = handle;
|
return handle[xxx];
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
qse_ssize_t qse_pio_read (qse_pio_t* pio, void* buf, qse_size_t size)
|
qse_ssize_t qse_pio_read (
|
||||||
|
qse_pio_t* pio, void* buf, qse_size_t size, int flags)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
DWORD count;
|
DWORD count;
|
||||||
@ -97,12 +261,25 @@ qse_ssize_t qse_pio_read (qse_pio_t* pio, void* buf, qse_size_t size)
|
|||||||
if (ReadFile(pio->handle, buf, size, &count, QSE_NULL) == FALSE) return -1;
|
if (ReadFile(pio->handle, buf, size, &count, QSE_NULL) == FALSE) return -1;
|
||||||
return (qse_ssize_t)count;
|
return (qse_ssize_t)count;
|
||||||
#else
|
#else
|
||||||
|
qse_pio_hnd_t handle = -1;
|
||||||
|
|
||||||
|
if (flags == 0) flags = QSE_PIO_OUT;
|
||||||
|
if (flags & QSE_PIO_ERR) handle = HNDERR(pio);
|
||||||
|
if (flags & QSE_PIO_OUT) handle = HNDOUT(pio);
|
||||||
|
|
||||||
|
if (handle == -1)
|
||||||
|
{
|
||||||
|
/* the stream is already closed */
|
||||||
|
return (qse_ssize_t)-1;
|
||||||
|
}
|
||||||
|
|
||||||
if (size > QSE_TYPE_MAX(size_t)) size = QSE_TYPE_MAX(size_t);
|
if (size > QSE_TYPE_MAX(size_t)) size = QSE_TYPE_MAX(size_t);
|
||||||
return QSE_READ (pio->handle, buf, size);
|
return QSE_READ (handle, buf, size);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_ssize_t qse_pio_write (qse_pio_t* pio, const void* data, qse_size_t size)
|
qse_ssize_t qse_pio_write (
|
||||||
|
qse_pio_t* pio, const void* data, qse_size_t size, int flags)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
DWORD count;
|
DWORD count;
|
||||||
@ -110,8 +287,37 @@ qse_ssize_t qse_pio_write (qse_pio_t* pio, const void* data, qse_size_t size)
|
|||||||
if (WriteFile(pio->handle, data, size, &count, QSE_NULL) == FALSE) return -1;
|
if (WriteFile(pio->handle, data, size, &count, QSE_NULL) == FALSE) return -1;
|
||||||
return (qse_ssize_t)count;
|
return (qse_ssize_t)count;
|
||||||
#else
|
#else
|
||||||
|
qse_pio_hnd_t handle;
|
||||||
|
|
||||||
|
if (flags == 0) flags = QSE_PIO_IN;
|
||||||
|
if (flags & QSE_PIO_IN) handle = HNDIN(pio);
|
||||||
|
|
||||||
|
if (handle == -1)
|
||||||
|
{
|
||||||
|
/* the stream is already closed */
|
||||||
|
return (qse_ssize_t)-1;
|
||||||
|
}
|
||||||
|
|
||||||
if (size > QSE_TYPE_MAX(size_t)) size = QSE_TYPE_MAX(size_t);
|
if (size > QSE_TYPE_MAX(size_t)) size = QSE_TYPE_MAX(size_t);
|
||||||
return QSE_WRITE (pio->handle, data, size);
|
return QSE_WRITE (handle, data, size);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qse_pio_end (qse_pio_t* pio, int flags)
|
||||||
|
{
|
||||||
|
if ((flags & QSE_PIO_IN) && HNDIN(pio) != -1)
|
||||||
|
{
|
||||||
|
QSE_CLOSE (HNDIN(pio));
|
||||||
|
HNDIN(pio) = -1;
|
||||||
|
}
|
||||||
|
if ((flags & QSE_PIO_ERR) && HNDERR(pio) != -1)
|
||||||
|
{
|
||||||
|
QSE_CLOSE (HNDERR(pio));
|
||||||
|
HNDERR(pio) = -1;
|
||||||
|
}
|
||||||
|
if ((flags & QSE_PIO_OUT) && HNDOUT(pio) != -1)
|
||||||
|
{
|
||||||
|
QSE_CLOSE (HNDOUT(pio));
|
||||||
|
HNDOUT(pio) = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,9 +1,17 @@
|
|||||||
#ifndef _QSE_LIB_CMN_SYSCALL_H_
|
#ifndef _QSE_LIB_CMN_SYSCALL_H_
|
||||||
#define _QSE_LIB_CMN_SYSCALL_H_
|
#define _QSE_LIB_CMN_SYSCALL_H_
|
||||||
|
|
||||||
#if defined(HAVE_UNISTD_H)
|
/* This file defines unix/linux system calls */
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_SYS_WAIT_H
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(QSE_USE_SYSCALL) && defined(HAVE_SYS_SYSCALL_H)
|
#if defined(QSE_USE_SYSCALL) && defined(HAVE_SYS_SYSCALL_H)
|
||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
@ -33,6 +41,30 @@
|
|||||||
#define QSE_WRITE(handle,buf,size) write(handle,buf,size)
|
#define QSE_WRITE(handle,buf,size) write(handle,buf,size)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(_LP64) && defined(SYS__llseek)
|
||||||
|
#define QSE_LLSEEK(handle,hoffset,loffset,out,whence) \
|
||||||
|
syscall(SYS__llseek,handle,hoffset,loffset,out,whence)
|
||||||
|
#elif !defined(_LP64) && defined(HAVE__LLSEEK)
|
||||||
|
#define QSE_LLSEEK(handle,hoffset,loffset,out,whence) \
|
||||||
|
_llseek(handle,hoffset,loffset,out,whence)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SYS_lseek65)
|
||||||
|
#define QSE_LSEEK64(handle,offset,whence) \
|
||||||
|
syscall(SYS_lseek64,handle,offset,whence)
|
||||||
|
#elif defined(HAVE_lseek64)
|
||||||
|
#define QSE_LSEEK64(handle,offset,whence) \
|
||||||
|
lseek64(handle,offset,whence)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SYS_lseek)
|
||||||
|
#define QSE_LSEEK(handle,offset,whence) \
|
||||||
|
syscall(SYS_lseek,handle,offset,whence)
|
||||||
|
#else
|
||||||
|
#define QSE_LSEEK(handle,offset,whence) \
|
||||||
|
lseek(handle,offset,whence)
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(_LP64) && defined(SYS_ftruncate64)
|
#if !defined(_LP64) && defined(SYS_ftruncate64)
|
||||||
#define QSE_FTRUNCATE(handle,size) syscall(SYS_ftruncate64,handle,size)
|
#define QSE_FTRUNCATE(handle,size) syscall(SYS_ftruncate64,handle,size)
|
||||||
#elif defined(SYS_ftruncate)
|
#elif defined(SYS_ftruncate)
|
||||||
@ -43,10 +75,71 @@
|
|||||||
#define QSE_FTRUNCATE(handle,size) ftruncate(handle,size)
|
#define QSE_FTRUNCATE(handle,size) ftruncate(handle,size)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(SYS_fchmod)
|
||||||
|
#define QSE_FCHMOD(handle,mode) syscall(SYS_fchmod,handle,mode)
|
||||||
|
#else
|
||||||
|
#define QSE_FCHMOD(handle,mode) fchmod(handle,mode)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SYS_dup2
|
||||||
|
#define QSE_DUP2(ofd,nfd) syscall(SYS_dup2,ofd,nfd)
|
||||||
|
#else
|
||||||
|
#define QSE_DUP2(ofd,nfd) dup2(ofd,nfd)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SYS_pipe
|
||||||
|
#define QSE_PIPE(pfds) syscall(SYS_pipe,pfds)
|
||||||
|
#else
|
||||||
|
#define QSE_PIPE(pfds) pipe(pfds)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SYS_exit
|
||||||
|
#define QSE_EXIT(code) syscall(SYS_exit,code)
|
||||||
|
#else
|
||||||
|
#define QSE_EXIT(code) _exit(code)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef SYS_fork
|
#ifdef SYS_fork
|
||||||
#define QSE_FORK() syscall(SYS_fork)
|
#define QSE_FORK() syscall(SYS_fork)
|
||||||
#else
|
#else
|
||||||
#define QSE_FORK() fork()
|
#define QSE_FORK() fork()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef SYS_waitpid
|
||||||
|
#define QSE_WAITPID(pid,status,options) syscall(SYS_waitpid,pid,status,options)
|
||||||
|
#else
|
||||||
|
#define QSE_WAITPID(pid,status,options) waitpid(pid,status,options)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SYS_getpid
|
||||||
|
#define QSE_GETPID() syscall(SYS_getpid)
|
||||||
|
#else
|
||||||
|
#define QSE_GETPID() getpid()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SYS_getuid
|
||||||
|
#define QSE_GETUID() syscall(SYS_getuid)
|
||||||
|
#else
|
||||||
|
#define QSE_GETUID() getuid()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SYS_geteuid
|
||||||
|
#define QSE_GETEUID() syscall(SYS_geteuid)
|
||||||
|
#else
|
||||||
|
#define QSE_GETEUID() geteuid()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SYS_getgid
|
||||||
|
#define QSE_GETGID() syscall(SYS_getgid)
|
||||||
|
#else
|
||||||
|
#define QSE_GETGID() getgid()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SYS_getegid
|
||||||
|
#define QSE_GETEGID() syscall(SYS_getegid)
|
||||||
|
#else
|
||||||
|
#define QSE_GETEGID() getegid()
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
AM_CPPFLAGS = -I$(top_srcdir)/include
|
AM_CPPFLAGS = -I$(top_srcdir)/include
|
||||||
|
|
||||||
bin_PROGRAMS = chr str sll map lda fio sio time
|
bin_PROGRAMS = chr str sll map lda fio pio sio time
|
||||||
|
|
||||||
LDFLAGS = -L../../lib/cmn -L../../lib/utl
|
LDFLAGS = -L../../lib/cmn -L../../lib/utl
|
||||||
LDADD = -lqseutl -lqsecmn
|
LDADD = -lqseutl -lqsecmn
|
||||||
@ -11,5 +11,6 @@ sll_SOURCES = sll.c
|
|||||||
map_SOURCES = map.c
|
map_SOURCES = map.c
|
||||||
lda_SOURCES = lda.c
|
lda_SOURCES = lda.c
|
||||||
fio_SOURCES = fio.c
|
fio_SOURCES = fio.c
|
||||||
|
pio_SOURCES = pio.c
|
||||||
sio_SOURCES = sio.c
|
sio_SOURCES = sio.c
|
||||||
time_SOURCES = time.c
|
time_SOURCES = time.c
|
||||||
|
@ -33,7 +33,8 @@ POST_UNINSTALL = :
|
|||||||
build_triplet = @build@
|
build_triplet = @build@
|
||||||
host_triplet = @host@
|
host_triplet = @host@
|
||||||
bin_PROGRAMS = chr$(EXEEXT) str$(EXEEXT) sll$(EXEEXT) map$(EXEEXT) \
|
bin_PROGRAMS = chr$(EXEEXT) str$(EXEEXT) sll$(EXEEXT) map$(EXEEXT) \
|
||||||
lda$(EXEEXT) fio$(EXEEXT) sio$(EXEEXT) time$(EXEEXT)
|
lda$(EXEEXT) fio$(EXEEXT) pio$(EXEEXT) sio$(EXEEXT) \
|
||||||
|
time$(EXEEXT)
|
||||||
subdir = test/cmn
|
subdir = test/cmn
|
||||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
@ -62,6 +63,10 @@ am_map_OBJECTS = map.$(OBJEXT)
|
|||||||
map_OBJECTS = $(am_map_OBJECTS)
|
map_OBJECTS = $(am_map_OBJECTS)
|
||||||
map_LDADD = $(LDADD)
|
map_LDADD = $(LDADD)
|
||||||
map_DEPENDENCIES =
|
map_DEPENDENCIES =
|
||||||
|
am_pio_OBJECTS = pio.$(OBJEXT)
|
||||||
|
pio_OBJECTS = $(am_pio_OBJECTS)
|
||||||
|
pio_LDADD = $(LDADD)
|
||||||
|
pio_DEPENDENCIES =
|
||||||
am_sio_OBJECTS = sio.$(OBJEXT)
|
am_sio_OBJECTS = sio.$(OBJEXT)
|
||||||
sio_OBJECTS = $(am_sio_OBJECTS)
|
sio_OBJECTS = $(am_sio_OBJECTS)
|
||||||
sio_LDADD = $(LDADD)
|
sio_LDADD = $(LDADD)
|
||||||
@ -91,10 +96,11 @@ LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
|||||||
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
|
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
|
||||||
$(LDFLAGS) -o $@
|
$(LDFLAGS) -o $@
|
||||||
SOURCES = $(chr_SOURCES) $(fio_SOURCES) $(lda_SOURCES) $(map_SOURCES) \
|
SOURCES = $(chr_SOURCES) $(fio_SOURCES) $(lda_SOURCES) $(map_SOURCES) \
|
||||||
$(sio_SOURCES) $(sll_SOURCES) $(str_SOURCES) $(time_SOURCES)
|
$(pio_SOURCES) $(sio_SOURCES) $(sll_SOURCES) $(str_SOURCES) \
|
||||||
DIST_SOURCES = $(chr_SOURCES) $(fio_SOURCES) $(lda_SOURCES) \
|
|
||||||
$(map_SOURCES) $(sio_SOURCES) $(sll_SOURCES) $(str_SOURCES) \
|
|
||||||
$(time_SOURCES)
|
$(time_SOURCES)
|
||||||
|
DIST_SOURCES = $(chr_SOURCES) $(fio_SOURCES) $(lda_SOURCES) \
|
||||||
|
$(map_SOURCES) $(pio_SOURCES) $(sio_SOURCES) $(sll_SOURCES) \
|
||||||
|
$(str_SOURCES) $(time_SOURCES)
|
||||||
ETAGS = etags
|
ETAGS = etags
|
||||||
CTAGS = ctags
|
CTAGS = ctags
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
@ -222,6 +228,7 @@ sll_SOURCES = sll.c
|
|||||||
map_SOURCES = map.c
|
map_SOURCES = map.c
|
||||||
lda_SOURCES = lda.c
|
lda_SOURCES = lda.c
|
||||||
fio_SOURCES = fio.c
|
fio_SOURCES = fio.c
|
||||||
|
pio_SOURCES = pio.c
|
||||||
sio_SOURCES = sio.c
|
sio_SOURCES = sio.c
|
||||||
time_SOURCES = time.c
|
time_SOURCES = time.c
|
||||||
all: all-am
|
all: all-am
|
||||||
@ -297,6 +304,9 @@ lda$(EXEEXT): $(lda_OBJECTS) $(lda_DEPENDENCIES)
|
|||||||
map$(EXEEXT): $(map_OBJECTS) $(map_DEPENDENCIES)
|
map$(EXEEXT): $(map_OBJECTS) $(map_DEPENDENCIES)
|
||||||
@rm -f map$(EXEEXT)
|
@rm -f map$(EXEEXT)
|
||||||
$(LINK) $(map_OBJECTS) $(map_LDADD) $(LIBS)
|
$(LINK) $(map_OBJECTS) $(map_LDADD) $(LIBS)
|
||||||
|
pio$(EXEEXT): $(pio_OBJECTS) $(pio_DEPENDENCIES)
|
||||||
|
@rm -f pio$(EXEEXT)
|
||||||
|
$(LINK) $(pio_OBJECTS) $(pio_LDADD) $(LIBS)
|
||||||
sio$(EXEEXT): $(sio_OBJECTS) $(sio_DEPENDENCIES)
|
sio$(EXEEXT): $(sio_OBJECTS) $(sio_DEPENDENCIES)
|
||||||
@rm -f sio$(EXEEXT)
|
@rm -f sio$(EXEEXT)
|
||||||
$(LINK) $(sio_OBJECTS) $(sio_LDADD) $(LIBS)
|
$(LINK) $(sio_OBJECTS) $(sio_LDADD) $(LIBS)
|
||||||
@ -320,6 +330,7 @@ distclean-compile:
|
|||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fio.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fio.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lda.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lda.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/map.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/map.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sio.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sio.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sll.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sll.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str.Po@am__quote@
|
||||||
|
Loading…
x
Reference in New Issue
Block a user