85 lines
2 KiB
C
85 lines
2 KiB
C
/* XXX: this program knows quite a bit about tcpto's internals */
|
|
|
|
#include "substdio.h"
|
|
#include "subfd.h"
|
|
#include "auto_qmail.h"
|
|
#include "fmt.h"
|
|
#include "ip.h"
|
|
#include "lock.h"
|
|
#include "error.h"
|
|
#include "exit.h"
|
|
#include "datetime.h"
|
|
#include "now.h"
|
|
|
|
void die(n) int n; { substdio_flush(subfdout); _exit(n); }
|
|
|
|
void warn(s) char *s;
|
|
{
|
|
char *x;
|
|
x = error_str(errno);
|
|
substdio_puts(subfdout,s);
|
|
substdio_puts(subfdout,": ");
|
|
substdio_puts(subfdout,x);
|
|
substdio_puts(subfdout,"\n");
|
|
}
|
|
|
|
void die_chdir() { warn("fatal: unable to chdir"); die(111); }
|
|
void die_open() { warn("fatal: unable to open tcpto"); die(111); }
|
|
void die_lock() { warn("fatal: unable to lock tcpto"); die(111); }
|
|
void die_read() { warn("fatal: unable to read tcpto"); die(111); }
|
|
|
|
char tcpto_buf[1024];
|
|
|
|
char tmp[FMT_ULONG + IPFMT];
|
|
|
|
void main()
|
|
{
|
|
int fdlock;
|
|
int fd;
|
|
int r;
|
|
int i;
|
|
char *record;
|
|
struct ip_address ip;
|
|
datetime_sec when;
|
|
datetime_sec start;
|
|
|
|
if (chdir(auto_qmail) == -1) die_chdir();
|
|
if (chdir("queue/lock") == -1) die_chdir();
|
|
|
|
fdlock = open_write("tcpto");
|
|
if (fdlock == -1) die_open();
|
|
fd = open_read("tcpto");
|
|
if (fd == -1) die_open();
|
|
if (lock_ex(fdlock) == -1) die_lock();
|
|
r = read(fd,tcpto_buf,sizeof(tcpto_buf));
|
|
close(fd);
|
|
close(fdlock);
|
|
|
|
if (r == -1) die_read();
|
|
r >>= 4;
|
|
|
|
start = now();
|
|
|
|
record = tcpto_buf;
|
|
for (i = 0;i < r;++i)
|
|
{
|
|
if (record[4] >= 1)
|
|
{
|
|
byte_copy(&ip,4,record);
|
|
when = (unsigned long) (unsigned char) record[11];
|
|
when = (when << 8) + (unsigned long) (unsigned char) record[10];
|
|
when = (when << 8) + (unsigned long) (unsigned char) record[9];
|
|
when = (when << 8) + (unsigned long) (unsigned char) record[8];
|
|
|
|
substdio_put(subfdout,tmp,ip_fmt(tmp,&ip));
|
|
substdio_puts(subfdout," timed out ");
|
|
substdio_put(subfdout,tmp,fmt_ulong(tmp,(unsigned long) (start - when)));
|
|
substdio_puts(subfdout," seconds ago; # recent timeouts: ");
|
|
substdio_put(subfdout,tmp,fmt_ulong(tmp,(unsigned long) (unsigned char) record[4]));
|
|
substdio_puts(subfdout,"\n");
|
|
}
|
|
record += 16;
|
|
}
|
|
|
|
die(0);
|
|
}
|