defined MIO_FEATURE_LOG_WRITER

This commit is contained in:
hyung-hwan 2021-07-19 04:57:30 +00:00
parent d1d7929830
commit a2904ad30d
3 changed files with 80 additions and 45 deletions

View File

@ -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);

View File

@ -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

View File

@ -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;
}
} }
} }