defined MIO_FEATURE_LOG_WRITER
This commit is contained in:
parent
d1d7929830
commit
a2904ad30d
@ -265,6 +265,10 @@ int mio_setoption (mio_t* mio, mio_option_t id, const void* value)
|
|||||||
case MIO_LOG_MAXCAPA:
|
case MIO_LOG_MAXCAPA:
|
||||||
mio->option.log_maxcapa = *(mio_oow_t*)value;
|
mio->option.log_maxcapa = *(mio_oow_t*)value;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
case MIO_LOG_WRITER:
|
||||||
|
mio->option.log_writer = (mio_log_writer_t)value;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
mio_seterrnum (mio, MIO_EINVAL);
|
mio_seterrnum (mio, MIO_EINVAL);
|
||||||
@ -286,6 +290,10 @@ int mio_getoption (mio_t* mio, mio_option_t id, void* value)
|
|||||||
case MIO_LOG_MAXCAPA:
|
case MIO_LOG_MAXCAPA:
|
||||||
*(mio_oow_t*)value = mio->option.log_maxcapa;
|
*(mio_oow_t*)value = mio->option.log_maxcapa;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
case MIO_LOG_WRITER:
|
||||||
|
*(mio_log_writer_t*)value = mio->option.log_writer;
|
||||||
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
mio_seterrnum (mio, MIO_EINVAL);
|
mio_seterrnum (mio, MIO_EINVAL);
|
||||||
|
@ -122,10 +122,11 @@ typedef struct mio_errinf_t mio_errinf_t;
|
|||||||
|
|
||||||
enum mio_feature_t
|
enum mio_feature_t
|
||||||
{
|
{
|
||||||
MIO_FEATURE_LOG = ((mio_bitmask_t)1 << 0),
|
MIO_FEATURE_MUX = ((mio_bitmask_t)1 << 0),
|
||||||
MIO_FEATURE_MUX = ((mio_bitmask_t)1 << 1),
|
MIO_FEATURE_LOG = ((mio_bitmask_t)1 << 1),
|
||||||
|
MIO_FEATURE_LOG_WRITER = ((mio_bitmask_t)1 << 2),
|
||||||
|
|
||||||
MIO_FEATURE_ALL = (MIO_FEATURE_LOG | MIO_FEATURE_MUX)
|
MIO_FEATURE_ALL = (MIO_FEATURE_MUX | MIO_FEATURE_LOG | MIO_FEATURE_LOG_WRITER)
|
||||||
};
|
};
|
||||||
typedef enum mio_feature_t mio_feature_t;
|
typedef enum mio_feature_t mio_feature_t;
|
||||||
|
|
||||||
@ -133,11 +134,11 @@ enum mio_option_t
|
|||||||
{
|
{
|
||||||
MIO_TRAIT,
|
MIO_TRAIT,
|
||||||
MIO_LOG_MASK,
|
MIO_LOG_MASK,
|
||||||
MIO_LOG_MAXCAPA
|
MIO_LOG_MAXCAPA,
|
||||||
|
MIO_LOG_WRITER
|
||||||
};
|
};
|
||||||
typedef enum mio_option_t mio_option_t;
|
typedef enum mio_option_t mio_option_t;
|
||||||
|
|
||||||
|
|
||||||
enum mio_stopreq_t
|
enum mio_stopreq_t
|
||||||
{
|
{
|
||||||
MIO_STOPREQ_NONE = 0,
|
MIO_STOPREQ_NONE = 0,
|
||||||
@ -148,6 +149,15 @@ typedef enum mio_stopreq_t mio_stopreq_t;
|
|||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
|
|
||||||
|
typedef int (*mio_log_writer_t) (
|
||||||
|
mio_t* mio,
|
||||||
|
mio_bitmask_t mask,
|
||||||
|
const mio_bch_t* dptr,
|
||||||
|
mio_oow_t dlen
|
||||||
|
);
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
|
||||||
#define MIO_TMRIDX_INVALID ((mio_tmridx_t)-1)
|
#define MIO_TMRIDX_INVALID ((mio_tmridx_t)-1)
|
||||||
|
|
||||||
typedef mio_oow_t mio_tmridx_t;
|
typedef mio_oow_t mio_tmridx_t;
|
||||||
@ -653,6 +663,7 @@ struct mio_t
|
|||||||
mio_bitmask_t trait;
|
mio_bitmask_t trait;
|
||||||
mio_bitmask_t log_mask;
|
mio_bitmask_t log_mask;
|
||||||
mio_oow_t log_maxcapa;
|
mio_oow_t log_maxcapa;
|
||||||
|
mio_log_writer_t log_writer;
|
||||||
} option;
|
} option;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
|
@ -88,8 +88,12 @@ enum logfd_flag_t
|
|||||||
LOGFD_OPENED_HERE = (1 << 1)
|
LOGFD_OPENED_HERE = (1 << 1)
|
||||||
};
|
};
|
||||||
|
|
||||||
static int write_all (int fd, const mio_bch_t* ptr, mio_oow_t len)
|
static int write_all (mio_t* mio, int fd, mio_bitmask_t mask, const mio_bch_t* ptr, mio_oow_t len)
|
||||||
{
|
{
|
||||||
|
if (mio->option.log_writer) return mio->option.log_writer(mio, mask, ptr, len);
|
||||||
|
|
||||||
|
if (MIO_UNLIKELY(fd <= -1)) return 0; /* MIO_FEATURE_LOG_WRITER is off but mio->option.log_write is not set */
|
||||||
|
|
||||||
while (len > 0)
|
while (len > 0)
|
||||||
{
|
{
|
||||||
mio_ooi_t wr;
|
mio_ooi_t wr;
|
||||||
@ -122,7 +126,7 @@ static int write_all (int fd, const mio_bch_t* ptr, mio_oow_t len)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int write_log (mio_t* mio, int fd, const mio_bch_t* ptr, mio_oow_t len)
|
static int write_log (mio_t* mio, int fd, mio_bitmask_t mask, const mio_bch_t* ptr, mio_oow_t len)
|
||||||
{
|
{
|
||||||
mio_sys_log_t* log = &mio->sysdep->log;
|
mio_sys_log_t* log = &mio->sysdep->log;
|
||||||
|
|
||||||
@ -143,7 +147,7 @@ static int write_log (mio_t* mio, int fd, const mio_bch_t* ptr, mio_oow_t len)
|
|||||||
if (log->out.len >= MIO_COUNTOF(log->out.buf))
|
if (log->out.len >= MIO_COUNTOF(log->out.buf))
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
n = write_all(fd, log->out.buf, log->out.len);
|
n = write_all(mio, fd, mask, log->out.buf, log->out.len);
|
||||||
log->out.len = 0;
|
log->out.len = 0;
|
||||||
if (n <= -1) return -1;
|
if (n <= -1) return -1;
|
||||||
}
|
}
|
||||||
@ -155,7 +159,7 @@ static int write_log (mio_t* mio, int fd, const mio_bch_t* ptr, mio_oow_t len)
|
|||||||
rcapa = MIO_COUNTOF(log->out.buf);
|
rcapa = MIO_COUNTOF(log->out.buf);
|
||||||
if (len >= rcapa)
|
if (len >= rcapa)
|
||||||
{
|
{
|
||||||
if (write_all(fd, ptr, rcapa) <= -1) return -1;
|
if (write_all(mio, fd, mask, ptr, rcapa) <= -1) return -1;
|
||||||
ptr += rcapa;
|
ptr += rcapa;
|
||||||
len -= rcapa;
|
len -= rcapa;
|
||||||
}
|
}
|
||||||
@ -173,12 +177,12 @@ static int write_log (mio_t* mio, int fd, const mio_bch_t* ptr, mio_oow_t len)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void flush_log (mio_t* mio, int fd)
|
static void flush_log (mio_t* mio, int fd, mio_bitmask_t mask)
|
||||||
{
|
{
|
||||||
mio_sys_log_t* log = &mio->sysdep->log;
|
mio_sys_log_t* log = &mio->sysdep->log;
|
||||||
if (log->out.len > 0)
|
if (log->out.len > 0)
|
||||||
{
|
{
|
||||||
write_all (fd, log->out.buf, log->out.len);
|
write_all (mio, fd, mask, log->out.buf, log->out.len);
|
||||||
log->out.len = 0;
|
log->out.len = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -188,19 +192,22 @@ void mio_sys_writelog (mio_t* mio, mio_bitmask_t mask, const mio_ooch_t* msg, mi
|
|||||||
mio_sys_log_t* log = &mio->sysdep->log;
|
mio_sys_log_t* log = &mio->sysdep->log;
|
||||||
mio_bch_t buf[256];
|
mio_bch_t buf[256];
|
||||||
mio_oow_t ucslen, bcslen, msgidx;
|
mio_oow_t ucslen, bcslen, msgidx;
|
||||||
int n, logfd;
|
int n, logfd = -1;
|
||||||
|
|
||||||
if (mask & MIO_LOG_STDERR)
|
if (mio->_features & MIO_FEATURE_LOG_WRITER)
|
||||||
{
|
{
|
||||||
logfd = 2;
|
if (mask & MIO_LOG_STDERR)
|
||||||
}
|
{
|
||||||
else
|
logfd = 2;
|
||||||
{
|
}
|
||||||
if (mask & MIO_LOG_STDOUT) logfd = 1;
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
logfd = log->fd;
|
if (mask & MIO_LOG_STDOUT) logfd = 1;
|
||||||
if (logfd <= -1) return;
|
else
|
||||||
|
{
|
||||||
|
logfd = log->fd;
|
||||||
|
if (logfd <= -1) return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -260,14 +267,14 @@ void mio_sys_writelog (mio_t* mio, mio_bitmask_t mask, const mio_ooch_t* msg, mi
|
|||||||
tslen = sprintf(ts, "%04d-%02d-%02d %02d:%02d:%02d ", tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday, tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
|
tslen = sprintf(ts, "%04d-%02d-%02d %02d:%02d:%02d ", tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday, tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
write_log (mio, logfd, ts, tslen);
|
write_log (mio, logfd, mask, ts, tslen);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (logfd == log->fd && (log->fd_flag & LOGFD_TTY))
|
if (logfd == log->fd && (log->fd_flag & LOGFD_TTY))
|
||||||
{
|
{
|
||||||
if (mask & MIO_LOG_FATAL) write_log (mio, logfd, "\x1B[1;31m", 7);
|
if (mask & MIO_LOG_FATAL) write_log (mio, logfd, mask, "\x1B[1;31m", 7);
|
||||||
else if (mask & MIO_LOG_ERROR) write_log (mio, logfd, "\x1B[1;32m", 7);
|
else if (mask & MIO_LOG_ERROR) write_log (mio, logfd, mask, "\x1B[1;32m", 7);
|
||||||
else if (mask & MIO_LOG_WARN) write_log (mio, logfd, "\x1B[1;33m", 7);
|
else if (mask & MIO_LOG_WARN) write_log (mio, logfd, mask, "\x1B[1;33m", 7);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(MIO_OOCH_IS_UCH)
|
#if defined(MIO_OOCH_IS_UCH)
|
||||||
@ -289,7 +296,7 @@ void mio_sys_writelog (mio_t* mio, mio_bitmask_t mask, const mio_ooch_t* msg, mi
|
|||||||
MIO_ASSERT (mio, ucslen > 0); /* if this fails, the buffer size must be increased */
|
MIO_ASSERT (mio, ucslen > 0); /* if this fails, the buffer size must be increased */
|
||||||
|
|
||||||
/* attempt to write all converted characters */
|
/* attempt to write all converted characters */
|
||||||
if (write_log(mio, logfd, buf, bcslen) <= -1) break;
|
if (write_log(mio, logfd, mask, buf, bcslen) <= -1) break;
|
||||||
|
|
||||||
if (n == 0) break;
|
if (n == 0) break;
|
||||||
else
|
else
|
||||||
@ -305,40 +312,46 @@ void mio_sys_writelog (mio_t* mio, mio_bitmask_t mask, const mio_ooch_t* msg, mi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
write_log (mio, logfd, msg, len);
|
write_log (mio, logfd, mask, msg, len);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (logfd == log->fd && (log->fd_flag & LOGFD_TTY))
|
if (logfd == log->fd && (log->fd_flag & LOGFD_TTY))
|
||||||
{
|
{
|
||||||
if (mask & (MIO_LOG_FATAL | MIO_LOG_ERROR | MIO_LOG_WARN)) write_log (mio, logfd, "\x1B[0m", 4);
|
if (mask & (MIO_LOG_FATAL | MIO_LOG_ERROR | MIO_LOG_WARN)) write_log (mio, logfd, mask, "\x1B[0m", 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
flush_log (mio, logfd);
|
flush_log (mio, logfd, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
int mio_sys_initlog (mio_t* mio)
|
int mio_sys_initlog (mio_t* mio)
|
||||||
{
|
{
|
||||||
mio_sys_log_t* log = &mio->sysdep->log;
|
mio_sys_log_t* log = &mio->sysdep->log;
|
||||||
/*mio_oow_t pathlen;*/
|
|
||||||
|
|
||||||
/* TODO: */
|
if (mio->_features & MIO_FEATURE_LOG_WRITER)
|
||||||
#define LOG_FILE "/dev/stderr"
|
|
||||||
log->fd = open(LOG_FILE, O_CREAT | O_WRONLY | O_APPEND , 0644);
|
|
||||||
if (log->fd == -1)
|
|
||||||
{
|
{
|
||||||
/*mio_seterrbfmtwithsyserr (mio, 0, errno, "cannot open log file %hs", LOG_FILE);*/
|
/* TODO: different file? */
|
||||||
log->fd = 2;
|
#define LOG_FILE "/dev/stderr"
|
||||||
log->fd_flag = 0;
|
log->fd = open(LOG_FILE, O_CREAT | O_WRONLY | O_APPEND , 0644);
|
||||||
|
if (log->fd == -1)
|
||||||
|
{
|
||||||
|
/*mio_seterrbfmtwithsyserr (mio, 0, errno, "cannot open log file %hs", LOG_FILE);*/
|
||||||
|
log->fd = 2;
|
||||||
|
log->fd_flag = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
log->fd_flag |= LOGFD_OPENED_HERE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(HAVE_ISATTY)
|
||||||
|
if (isatty(log->fd)) log->fd_flag |= LOGFD_TTY;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
log->fd_flag |= LOGFD_OPENED_HERE;
|
log->fd = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(HAVE_ISATTY)
|
|
||||||
if (isatty(log->fd)) log->fd_flag |= LOGFD_TTY;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pthread_mutex_init (&log->mtx, MIO_NULL);
|
pthread_mutex_init (&log->mtx, MIO_NULL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -349,11 +362,14 @@ void mio_sys_finilog (mio_t* mio)
|
|||||||
|
|
||||||
pthread_mutex_destroy (&log->mtx);
|
pthread_mutex_destroy (&log->mtx);
|
||||||
|
|
||||||
if ((log->fd_flag & LOGFD_OPENED_HERE) && log->fd >= 0)
|
if (mio->_features & MIO_FEATURE_LOG_WRITER)
|
||||||
{
|
{
|
||||||
close (log->fd);
|
if ((log->fd_flag & LOGFD_OPENED_HERE) && log->fd >= 0)
|
||||||
log->fd = -1;
|
{
|
||||||
log->fd_flag = 0;
|
close (log->fd);
|
||||||
|
log->fd = -1;
|
||||||
|
log->fd_flag = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user