#define DUMPV(fmt,pfx,v) fprintf(f, " " #v "=" fmt, pfx v);
-#define FOR_CONN(conn) \
- for ((conn)=LIST_HEAD(conns); (conn); (conn)=LIST_NEXT((conn)))
+#define FOR_LIST_NODE(nodevar, list) \
+ for ((nodevar)=LIST_HEAD(list); (nodevar); (nodevar)=LIST_NEXT((nodevar)))
+
+#define FOR_CONN(conn) FOR_LIST_NODE(conn, conns)
/*----- doubly linked lists -----*/
RCI_max
} ResultCountIndex;
+typedef enum {
+ read_ok, read_blank, read_err, nooffer_missing,
+ ECI_max
+} EventCountIndex;
/*----- transmission buffers -----*/
/*----- core operational data structure types -----*/
typedef struct {
- int counts[art_MaxState][RCI_max];
- int read_ok, read_blank, read_err, nooffer_missing;
+ int results[art_MaxState][RCI_max];
+ int events[ECI_max];
} Counts;
struct InputFile {
int close_perhaps(int *fd);
void xclose(int fd, const char *what, const char *what2);
void xclose_perhaps(int *fd, const char *what, const char *what2);
-pid_t xfork(const char *what);
+pid_t xfork(const char *what); /* also runs postfork in child */
+pid_t xfork_bare(const char *what);
void on_fd_read_except(int fd, oop_call_fd callback);
void cancel_fd_read_except(int fd);
void vconnfail(Conn *conn, const char *fmt, va_list al) PRINTF(2,0);
void connfail(Conn *conn, const char *fmt, ...) PRINTF(2,3);
+void notice_conns_more(const char *new_kind);
+void notice_conns_fewer(void);
+void notice_conns_stats(void);
+
int allow_connect_start(void);
void connect_start(void);
extern StateMachineState sms;
extern int until_flush;
extern InputFile *main_input_file, *flushing_input_file, *backlog_input_file;
+extern Counts backlog_counts;
+extern int backlog_counts_report;
extern FILE *defer;
extern int until_connect, until_backlog_nextscan;
extern double accept_proportion;