/* <type> <timestamp> <prefix> <text> */
const char *type_prefix = "?";
unsigned int type;
- time_t t;
+ struct timeval tv;
/* find type's prefix */
for (type = 0; type < LOG_TYPE_COUNT; type++) {
}
}
- if (str_to_time(args[1], &t) < 0) {
+ if (str_to_timeval(args[1], &tv) < 0) {
e_error(event, "Invalid timestamp: %s", args[1]);
- t = 0;
+ i_zero(&tv);
}
- if (t >= min_timestamp) {
- doveadm_print(t_strflocaltime(LOG_TIMESTAMP_FORMAT, t));
+ if (tv.tv_sec >= min_timestamp) {
+ const char *ts_secs =
+ t_strflocaltime(LOG_TIMESTAMP_FORMAT, tv.tv_sec);
+ doveadm_print(t_strdup_printf("%s.%06u", ts_secs,
+ (unsigned int)tv.tv_usec));
doveadm_print(t_cmd_log_error_trim(args[2]));
doveadm_print(t_cmd_log_error_trim(type_prefix));
doveadm_print(args[3]);
struct log_error_data *next;
enum log_type type;
- time_t timestamp;
+ struct timeval timestamp;
unsigned char prefix_text[FLEXIBLE_ARRAY_MEMBER];
};
struct log_error {
enum log_type type;
- time_t timestamp;
+ struct timeval timestamp;
const char *prefix;
const char *text;
};
iter = log_error_buffer_iter_init(conn->errorbuf);
while ((error = log_error_buffer_iter_next(iter)) != NULL) {
str_truncate(str, 0);
- str_printfa(str, "%s\t%ld\t",
+ str_printfa(str, "%s\t%"PRIdTIME_T".%06u\t",
failure_log_type_names[error->type],
- (long)error->timestamp);
+ error->timestamp.tv_sec,
+ (unsigned int)error->timestamp.tv_usec);
str_append_tabescaped(str, error->prefix);
str_append_c(str, '\t');
str_append_tabescaped(str, error->text);
case LOG_TYPE_PANIC:
i_zero(&err);
err.type = ctx->type;
- err.timestamp = log_time->tv_sec;
+ err.timestamp = *log_time;
err.prefix = ctx->log_prefix != NULL ? ctx->log_prefix : prefix;
err.text = text;
log_error_buffer_add(log->errorbuf, &err);