1442 |
|
/* fd_desc is long enough */ |
1443 |
|
fd_note(&client_p->localClient->fd, "Nick: %s", nick); |
1444 |
|
} |
1445 |
+ |
|
1446 |
+ |
/* log_user_exit() |
1447 |
+ |
* |
1448 |
+ |
* inputs - pointer to connecting client |
1449 |
+ |
* output - NONE |
1450 |
+ |
* side effects - Current exiting client is logged to |
1451 |
+ |
* either SYSLOG or to file. |
1452 |
+ |
*/ |
1453 |
+ |
void |
1454 |
+ |
log_user_exit(struct Client *source_p) |
1455 |
+ |
{ |
1456 |
+ |
time_t on_for = CurrentTime - source_p->firsttime; |
1457 |
+ |
#ifdef SYSLOG_USERS |
1458 |
+ |
if (IsClient(source_p)) |
1459 |
+ |
{ |
1460 |
+ |
ilog(L_INFO, "%s (%3ld:%02ld:%02ld): %s!%s@%s %llu/%llu\n", |
1461 |
+ |
myctime(source_p->firsttime), |
1462 |
+ |
(signed long) on_for / 3600, |
1463 |
+ |
(signed long) (on_for % 3600)/60, |
1464 |
+ |
(signed long) on_for % 60, |
1465 |
+ |
source_p->name, source_p->username, source_p->host, |
1466 |
+ |
source_p->localClient->send.bytes>>10, |
1467 |
+ |
source_p->localClient->recv.bytes>>10); |
1468 |
+ |
} |
1469 |
+ |
#else |
1470 |
+ |
{ |
1471 |
+ |
char linebuf[BUFSIZ]; |
1472 |
+ |
|
1473 |
+ |
/* |
1474 |
+ |
* This conditional makes the logfile active only after |
1475 |
+ |
* it's been created - thus logging can be turned off by |
1476 |
+ |
* removing the file. |
1477 |
+ |
* -Taner |
1478 |
+ |
*/ |
1479 |
+ |
if (IsClient(source_p)) |
1480 |
+ |
{ |
1481 |
+ |
if (user_log_fb == NULL) |
1482 |
+ |
{ |
1483 |
+ |
if ((ConfigLoggingEntry.userlog[0] != '\0') && |
1484 |
+ |
(user_log_fb = fbopen(ConfigLoggingEntry.userlog, "r")) != NULL) |
1485 |
+ |
{ |
1486 |
+ |
fbclose(user_log_fb); |
1487 |
+ |
user_log_fb = fbopen(ConfigLoggingEntry.userlog, "a"); |
1488 |
+ |
} |
1489 |
+ |
} |
1490 |
+ |
|
1491 |
+ |
if (user_log_fb != NULL) |
1492 |
+ |
{ |
1493 |
+ |
size_t nbytes = ircsprintf(linebuf, |
1494 |
+ |
"%s (%3ld:%02ld:%02ld): %s!%s@%s %llu/%llu\n", |
1495 |
+ |
myctime(source_p->firsttime), |
1496 |
+ |
(signed long) on_for / 3600, |
1497 |
+ |
(signed long) (on_for % 3600)/60, |
1498 |
+ |
(signed long) on_for % 60, |
1499 |
+ |
source_p->name, source_p->username, source_p->host, |
1500 |
+ |
source_p->localClient->send.bytes>>10, |
1501 |
+ |
source_p->localClient->recv.bytes>>10); |
1502 |
+ |
fbputs(linebuf, user_log_fb, nbytes); |
1503 |
+ |
} |
1504 |
+ |
} |
1505 |
+ |
} |
1506 |
+ |
#endif |
1507 |
+ |
} |
1508 |
+ |
|
1509 |
+ |
|
1510 |
+ |
/* log_oper_action() |
1511 |
+ |
* |
1512 |
+ |
* inputs - type of oper log entry |
1513 |
+ |
* - pointer to oper |
1514 |
+ |
* - const char *pattern == format string |
1515 |
+ |
* - var args for format string |
1516 |
+ |
* output - none |
1517 |
+ |
* side effects - corresponding log is written to, if its present. |
1518 |
+ |
* |
1519 |
+ |
* rewritten sept 5 2005 - Dianora |
1520 |
+ |
*/ |
1521 |
+ |
void |
1522 |
+ |
log_oper_action(int log_type, const struct Client *source_p, |
1523 |
+ |
const char *pattern, ...) |
1524 |
+ |
{ |
1525 |
+ |
va_list args; |
1526 |
+ |
char linebuf[IRCD_BUFSIZE]; |
1527 |
+ |
FBFILE *log_fb; |
1528 |
+ |
char *logfile; |
1529 |
+ |
const char *log_message; |
1530 |
+ |
size_t nbytes; |
1531 |
+ |
size_t n_preamble; |
1532 |
+ |
char *p; |
1533 |
+ |
|
1534 |
+ |
switch(log_type) |
1535 |
+ |
{ |
1536 |
+ |
case LOG_OPER_TYPE: |
1537 |
+ |
logfile = ConfigLoggingEntry.operlog; |
1538 |
+ |
log_message = "OPER"; |
1539 |
+ |
break; |
1540 |
+ |
case LOG_FAILED_OPER_TYPE: |
1541 |
+ |
logfile = ConfigLoggingEntry.failed_operlog; |
1542 |
+ |
log_message = "FAILED OPER"; |
1543 |
+ |
break; |
1544 |
+ |
case LOG_KLINE_TYPE: |
1545 |
+ |
logfile = ConfigLoggingEntry.klinelog; |
1546 |
+ |
log_message = "KLINE"; |
1547 |
+ |
break; |
1548 |
+ |
case LOG_RKLINE_TYPE: |
1549 |
+ |
logfile = ConfigLoggingEntry.klinelog; |
1550 |
+ |
log_message = "RKLINE"; |
1551 |
+ |
break; |
1552 |
+ |
case LOG_DLINE_TYPE: |
1553 |
+ |
logfile = ConfigLoggingEntry.klinelog; |
1554 |
+ |
log_message = "DLINE"; |
1555 |
+ |
break; |
1556 |
+ |
case LOG_TEMP_DLINE_TYPE: |
1557 |
+ |
logfile = ConfigLoggingEntry.klinelog; |
1558 |
+ |
log_message = "TEMP DLINE"; |
1559 |
+ |
break; |
1560 |
+ |
case LOG_TEMP_KLINE_TYPE: |
1561 |
+ |
logfile = ConfigLoggingEntry.klinelog; |
1562 |
+ |
log_message = "TEMP KLINE"; |
1563 |
+ |
break; |
1564 |
+ |
case LOG_GLINE_TYPE: |
1565 |
+ |
logfile = ConfigLoggingEntry.glinelog; |
1566 |
+ |
log_message = "GLINE"; |
1567 |
+ |
break; |
1568 |
+ |
case LOG_KILL_TYPE: |
1569 |
+ |
logfile = ConfigLoggingEntry.killlog; |
1570 |
+ |
log_message = "KILL"; |
1571 |
+ |
break; |
1572 |
+ |
case LOG_IOERR_TYPE: |
1573 |
+ |
logfile = ConfigLoggingEntry.ioerrlog; |
1574 |
+ |
log_message = "IO ERR"; |
1575 |
+ |
break; |
1576 |
+ |
default: |
1577 |
+ |
return; |
1578 |
+ |
} |
1579 |
+ |
|
1580 |
+ |
if (*logfile == '\0') |
1581 |
+ |
return; |
1582 |
+ |
|
1583 |
+ |
p = linebuf; |
1584 |
+ |
if (source_p != NULL) |
1585 |
+ |
{ |
1586 |
+ |
n_preamble = ircsprintf(linebuf, "%s %s by (%s!%s@%s) :", |
1587 |
+ |
myctime(CurrentTime), log_message, |
1588 |
+ |
source_p->name, source_p->username, source_p->host); |
1589 |
+ |
|
1590 |
+ |
} |
1591 |
+ |
else |
1592 |
+ |
{ |
1593 |
+ |
n_preamble = ircsprintf(linebuf, "%s %s :", |
1594 |
+ |
myctime(CurrentTime), log_message); |
1595 |
+ |
} |
1596 |
+ |
|
1597 |
+ |
p += n_preamble; |
1598 |
+ |
|
1599 |
+ |
if ((log_fb = fbopen(logfile, "r")) != NULL) |
1600 |
+ |
{ |
1601 |
+ |
fbclose(log_fb); |
1602 |
+ |
log_fb = fbopen(logfile, "a"); |
1603 |
+ |
if (log_fb == NULL) |
1604 |
+ |
return; |
1605 |
+ |
va_start(args, pattern); |
1606 |
+ |
/* XXX add check for IRCD_BUFSIZE-(n_preamble+1) < 0 ? -db */ |
1607 |
+ |
nbytes = vsnprintf(p, IRCD_BUFSIZE-(n_preamble+1), pattern, args); |
1608 |
+ |
nbytes += n_preamble; |
1609 |
+ |
va_end(args); |
1610 |
+ |
fbputs(linebuf, log_fb, nbytes); |
1611 |
+ |
fbclose(log_fb); |
1612 |
+ |
} |
1613 |
+ |
} |