From 628a2b4f87056f05ff44ca093f34c18c810b1ca9 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 24 Apr 2010 23:46:16 +0100 Subject: [PATCH] wip make it compile; add warnings to Makefile --- backends/Makefile | 2 + backends/innduct.c | 128 ++++++++++++++++++++++++++++----------------- 2 files changed, 82 insertions(+), 48 deletions(-) diff --git a/backends/Makefile b/backends/Makefile index 1d8071c..2e3956c 100644 --- a/backends/Makefile +++ b/backends/Makefile @@ -63,6 +63,8 @@ $(FIXSCRIPT): @echo Run configure before running make. See INSTALL for details. @exit 1 +innduct.o: CFLAGS += -Wimplicit -Wstrict-prototypes -Wmissing-prototypes + actsync: actsync.o $(LIBINN) ; $(LINK) actsync.o $(INNLIBS) archive: archive.o $(BOTH) ; $(LINK) archive.o $(STORELIBS) batcher: batcher.o $(BOTH) ; $(LINK) batcher.o $(STORELIBS) diff --git a/backends/innduct.c b/backends/innduct.c index a5bb448..de0a2bc 100644 --- a/backends/innduct.c +++ b/backends/innduct.c @@ -149,9 +149,11 @@ perl -ne 'print if m/-8\<-/..m/-\>8-/; print "\f" if m/-\^L-/' backends/innduct. #define _GNU_SOURCE +#include "inn/list.h" #include "config.h" #include "storage.h" #include "nntp.h" +#include "libinn.h" #include #include @@ -165,6 +167,9 @@ perl -ne 'print if m/-8\<-/..m/-\>8-/; print "\f" if m/-\^L-/' backends/innduct. #include #include #include +#include +#include +#include #include #include @@ -181,29 +186,54 @@ perl -ne 'print if m/-8\<-/..m/-\>8-/; print "\f" if m/-\^L-/' backends/innduct. /*----- doubly linked lists -----*/ -#define ISNODE(T) struct { T *succ, *pred; } node +#define ISNODE(T) struct { T *succ, *pred; } node /* must be at start */ #define DEFLIST(T) typedef struct { T *head, *tail, *tp; int count; } T##List -#define NODE(n) ((struct node*)&(n)->node) +#define NODE(n) (assert((void*)&(n)->node == &(n)), \ + (struct node*)&(n)->node) -#define LIST_ADDHEAD(l,n) \ - (list_addhead((struct list*)&(l), NODE((n))), (void)(l).count++) -#define LIST_ADDTAIL(l,n) \ - (list_addtail((struct list*)&(l), NODE((n))), (void)(l).count++) +#define LIST_CHECKCANHAVENODE(l,n) \ + ((void)((n) == ((l).head))) /* just for the type check */ + +#define LIST_ADDSOMEHOW(l,n,list_addsomehow) \ + ( LIST_CHECKCANHAVENODE(l,n), \ + list_addsomehow((struct list*)&(l), NODE((n))), \ + (void)(l).count++ \ + ) + +#define LIST_REMSOMEHOW(l,list_remsomehow) \ + ( (typeof((l).head)) \ + ( (l).count \ + ? ( (l).count--, \ + list_remsomehow((struct list*)&(l)) ) \ + : 0 \ + ) \ + ) + + +#define LIST_ADDHEAD(l,n) LIST_ADDSOMEHOW((l),(n),list_addhead) +#define LIST_ADDTAIL(l,n) LIST_ADDSOMEHOW((l),(n),list_addtail) +#define LIST_REMHEAD(l) LIST_REMSOMEHOW((l),list_remhead) +#define LIST_REMTAIL(l) LIST_REMSOMEHOW((l),list_remtail) -#define LIST_REMHEAD(l) \ - ((l).count ? ((l).count--, (void*)list_remhead((struct list*)&(l))) : 0) -#define LIST_REMTAIL(l) \ - ((l).count ? ((l).count--, (void*)list_remtail((struct list*)&(l))) : 0) #define LIST_REMOVE(l,n) \ - (list_remove(NODE((n))), (void)(l).count--) -#define LIST_INSERT(l,n,pred) \ - (list_insert((struct list*)&(l), NODE((n)), NODE((pred))), (void)(l).count++) + ( LIST_CHECKCANHAVENODE(l,n), \ + list_remove(NODE((n))), \ + (void)(l).count-- \ + ) + +#define LIST_INSERT(l,n,pred) \ + ( LIST_CHECKCANHAVENODE(l,n), \ + LIST_CHECKCANHAVENODE(l,pred), \ + list_insert((struct list*)&(l), NODE((n)), NODE((pred))), \ + (void)(l).count++ \ + ) /*----- type predeclarations -----*/ typedef struct Conn Conn; typedef struct Article Article; +typedef struct InputFile InputFile; typedef enum StateMachineState StateMachineState; DEFLIST(Conn); @@ -222,6 +252,8 @@ static void statemc_setstate(StateMachineState newsms, int periods, const char *forlog, const char *why); static void check_master_queue(void); +static void postfork_inputfile(InputFile *ipf); + /*----- configuration options -----*/ static char *sitename, *feedfile; @@ -296,8 +328,8 @@ typedef struct { /*----- core operational data structure types -----*/ -typedef struct InputFile { - /* This is an instance of struct oop_readable */ +struct InputFile { + /* This is also an instance of struct oop_readable */ struct oop_readable readable; /* first */ oop_readable_call *readable_callback; void *readable_callback_user; @@ -311,7 +343,7 @@ typedef struct InputFile { int counts[art_MaxState][RCI_max]; char path[]; -} InputFile; +}; struct Article { ISNODE(Article); @@ -506,7 +538,7 @@ static void check_isreg(const struct stat *stab, const char *path, } static void xfstat(int fd, struct stat *stab_r, const char *what) { - int r= fstab(fd, stab_r); + int r= fstat(fd, stab_r); if (r) sysdie("could not fstat %s", what); } @@ -542,6 +574,23 @@ static int samefile(const struct stat *a, const struct stat *b) { a->st_dev == b->st_dev); } +static char *sanitise(const char *input, int len) { + static char sanibuf[100]; /* returns pointer to this buffer! */ + + const char *p= input; + char *q= sanibuf; + *q++= '`'; + for (;;) { + if (q > sanibuf+sizeof(sanibuf)-8) { strcpy(q,"'.."); break; } + int c; + if (len<=0 || !(c= *p++)) { *q++= '\''; *q=0; break; } + if (c>=' ' && c<=126 && c!='\\') { *q++= c; continue; } + sprintf(q,"\\x%02x",c); + q += 4; + } + return sanibuf; +} + /*========== making new connections ==========*/ static int connecting_sockets[2]= {-1,-1}; @@ -549,7 +598,7 @@ static pid_t connecting_child; static void connect_attempt_discard(void) { if (connecting_sockets[0]) - cancel_fd(connecting_sockets[0]); + loop->cancel_fd(connecting_sockets[0]); perhaps_close(&connecting_sockets[0]); perhaps_close(&connecting_sockets[1]); @@ -640,7 +689,7 @@ static void *connchild_event(oop_source *lp, int fd, oop_event e, void *u) { fatal("connect: child gave unexpected exit status %d", es); } - setnonblocking(conn->fd, 1); + setnonblock(conn->fd, 1); /* Phew! */ LIST_ADDHEAD(idle, conn); @@ -679,12 +728,8 @@ static void connect_start(void) { alarm(connection_setup_timeout); if (NNTPconnect(remote_host, port, &cn_from, &cn_to, buf) < 0) { - if (buf[0]) { - sanitise_inplace(buf); - fatal("connect: rejected: %s", buf); - } else { - sysfatal("connect: connection attempt failed"); - } + if (buf[0]) fatal("connect: rejected: %s", sanitise(buf)); + else sysfatal("connect: connection attempt failed"); } if (NNTPsendpassword(remote_host, cn_from, cn_to) < 0) sysfatal("connect: authentication failed"); @@ -701,19 +746,16 @@ static void connect_start(void) { } int l= strlen(buf); assert(l>=1); - if (buf[-1]!='\n') { - sanitise_inplace(buf); + if (buf[-1]!='\n') fatal("connect: response to MODE STREAM is too long: %.100s...", - remote_host, buf); - } + remote_host, sanitise(buf)); l--; if (l>0 && buf[l-1]=='\r') l--; buf[l]= 0; char *ep; int rcode= strtoul(buf,&ep,10); - if (ep != &buf[3]) { - sanitise_inplace(buf); - fatal("connect: bad response to MODE STREAM: %.50s", buf); - } + if (ep != &buf[3]) + fatal("connect: bad response to MODE STREAM: %.50s", sanitise(buf)); + switch (rcode) { case 203: exitstatus= CONNCHILD_ESTATUS_STREAM; @@ -722,8 +764,8 @@ static void connect_start(void) { case 500: break; default: - sanitise_inplace(buf); - warn("connect: unexpected response to MODE STREAM: %.50s", buf); + warn("connect: unexpected response to MODE STREAM: %.50s", + sanitise(buf)); exitstatus= 2; break; } @@ -1129,22 +1171,12 @@ static void *peer_rd_ok(oop_source *lp, oop_read *oread, oop_event ev, } assert(ev == OOP_RD_OK); + char *sani= sanitise(data, recsz); + char *ep; unsigned long code= strtoul(data, &ep, 10); if (ep != data+3 || *ep != ' ' || data[0]=='0') { - char sanibuf[100]; - const char *p= data; - char *q= sanibuf; - *q++= '`'; - for (;;) { - if (q > sanibuf+sizeof(sanibuf)-8) { strcpy(q,"..."); break; } - int c= *p++; - if (!c) { *q++= '\''; break; } - if (c>=' ' && c<=126 && c!='\\') { *q++= c; continue; } - sprintf(q,"\\x%02x",c); - q += 4; - } - connfail(conn, "badly formatted response from peer: %s", sanibuf); + connfail(conn, "badly formatted response from peer: %s", sani); return OOP_CONTINUE; } -- 2.30.2