static void notice(u_user *u, const char *fmt, ...) { char buf[512]; va_list va; va_start(va, fmt); vsnf(FMT_USER, buf, 512, fmt, va); va_end(va); if (u == NULL) { /* ?? */ u_log(LG_INFO, "notice: %s", buf); } else { u_link_f(u->link, ":%S NOTICE %U :%s", &me, u, buf); } }
void u_link_vnum(u_link *link, const char *tgt, int num, va_list va) { char buf[4096]; char *fmt; if (!link) return; fmt = u_numeric_fmt[num]; if (fmt == NULL) { u_log(LG_SEVERE, "Attempted to use NULL numeric %d", num); return; } /* numerics are ALWAYS FMT_USER */ vsnf(FMT_USER, buf, 4096, fmt, va); u_link_f(link, ":%S %03d %s %s", &me, num, tgt, buf); }
int u_log(int level, char* fmt, ...) { static bool logging = false; struct tm *tm; char tmbuf[512]; char buf[BUFSIZE]; va_list va; if (level > u_log_level) return 0; if (logging) return 0; logging = true; va_start(va, fmt); vsnf(FMT_LOG, buf, BUFSIZE, fmt, va); va_end(va); tm = localtime(&NOW.tv_sec); snf(FMT_LOG, tmbuf, 512, "%04d/%02d/%02d %02d:%02d:%02d", tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); struct hook_log hook; hook.level = level; hook.time = tmbuf; hook.line = buf; if (log_hook == NULL) log_hook = u_hook_get(HOOK_LOG); u_hook_call(log_hook, &hook); logging = false; return u_log_handler(level, tmbuf, buf); }
void u_link_vf(u_link *link, const char *fmt, va_list va) { uchar *buf; size_t sz; int type; if (!link) return; if (link->sendq > 0 && link->conn->sendq.size + 512 > link->sendq) { on_sendq_full(link->conn); return; } buf = u_conn_get_send_buffer(link->conn, 512); if (buf == NULL) { on_sendq_full(link->conn); return; } type = FMT_USER; if (link->type == LINK_SERVER) type = FMT_SERVER; sz = vsnf(type, (char*)buf, 510, fmt, va); buf[sz] = '\0'; u_log(LG_DEBUG, "[%G] <- %s", link, buf); buf[sz++] = '\r'; buf[sz++] = '\n'; u_conn_end_send_buffer(link->conn, sz); }