sfeed

Simple RSS and Atom feed parser
git clone https://git.sinitax.com/codemadness/sfeed
Log | Files | Refs | README | LICENSE | Upstream | sfeed.txt

commit a13633a0a6b4e43d7809919ad70e085b9ecdff47
parent d425b524f5ce06e6d9cbb6838c4bf8b66b73ee06
Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date:   Sun,  5 Jul 2020 15:54:28 +0200

sfeed_mbox: don't ignore items with a missing/invalid timestamp

The Date header is mandatory.  Use the current time if it is missing/invalid.

Diffstat:
Msfeed_mbox.c | 33++++++++++++++++++---------------
1 file changed, 18 insertions(+), 15 deletions(-)

diff --git a/sfeed_mbox.c b/sfeed_mbox.c @@ -9,7 +9,7 @@ static char *line; static size_t linesize; -static char host[256], *user, mtimebuf[32]; +static char host[256], *user, dtimebuf[32], mtimebuf[32]; static unsigned long djb2(unsigned char *s, unsigned long hash) @@ -36,17 +36,18 @@ printfeed(FILE *fp, const char *feedname) hash = djb2((unsigned char *)line, 5381UL); parseline(line, fields); - parsedtime = 0; - if (strtotime(fields[FieldUnixTimestamp], &parsedtime)) - continue; - if (!(tm = gmtime(&parsedtime))) - err(1, "gmtime"); - if (!strftime(timebuf, sizeof(timebuf), "%a, %d %b %Y %H:%M:%S +0000", tm)) - errx(1, "strftime"); - /* mbox + mail header */ printf("From MAILER-DAEMON %s\n", mtimebuf); - printf("Date: %s\n", timebuf); + + parsedtime = 0; + if (!strtotime(fields[FieldUnixTimestamp], &parsedtime) && + (tm = gmtime(&parsedtime)) && + strftime(timebuf, sizeof(timebuf), "%a, %d %b %Y %H:%M:%S +0000", tm)) { + printf("Date: %s\n", timebuf); + } else { + printf("Date: %s\n", dtimebuf); /* invalid/missing: use current time */ + } + printf("From: %s <sfeed@>\n", fields[FieldAuthor][0] ? fields[FieldAuthor] : feedname); printf("To: %s <%s@%s>\n", user, user, host); printf("Subject: %s\n", fields[FieldTitle]); @@ -68,8 +69,8 @@ printfeed(FILE *fp, const char *feedname) int main(int argc, char *argv[]) { - struct tm tm; - time_t t; + struct tm tmnow; + time_t now; FILE *fp; char *name; int i; @@ -81,11 +82,13 @@ main(int argc, char *argv[]) user = "you"; if (gethostname(host, sizeof(host)) == -1) err(1, "gethostname"); - if ((t = time(NULL)) == -1) + if ((now = time(NULL)) == -1) err(1, "time"); - if (!gmtime_r(&t, &tm)) + if (!gmtime_r(&now, &tmnow)) err(1, "gmtime_r: can't get current time"); - if (!strftime(mtimebuf, sizeof(mtimebuf), "%a %b %d %H:%M:%S %Y", &tm)) + if (!strftime(mtimebuf, sizeof(mtimebuf), "%a %b %d %H:%M:%S %Y", &tmnow)) + errx(1, "strftime: can't format current time"); + if (!strftime(dtimebuf, sizeof(dtimebuf), "%a, %d %b %Y %H:%M:%S +0000", &tmnow)) errx(1, "strftime: can't format current time"); if (argc == 1) {