tWrite phlog index from directory listing - scribo - Email-based phlog generator
(HTM) git clone git://git.z3bra.org/scribo.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit f7d22671f042f57bfe07d2ee31686d2efce8b2fa
(DIR) parent 912d1da6b656d8907c7ff2478d3c1f5aab25d1ec
(HTM) Author: Willy Goiffon <dev@z3bra.org>
Date: Tue, 8 Sep 2020 11:55:17 +0200
Write phlog index from directory listing
Diffstat:
M config.def.h | 4 ++++
M scribo.c | 73 +++++++++++++++++++++++++------
2 files changed, 64 insertions(+), 13 deletions(-)
---
(DIR) diff --git a/config.def.h b/config.def.h
t@@ -1,2 +1,6 @@
char *basedir = ".";
char *datefmt = "%c";
+
+char *phlogname = "z3bra's lair";
+char *host = "z3bra.org";
+int port = 70;
(DIR) diff --git a/scribo.c b/scribo.c
t@@ -1,4 +1,5 @@
#include <ctype.h>
+#include <dirent.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
t@@ -7,6 +8,7 @@
#include <unistd.h>
#include <sys/queue.h>
+#include <sys/types.h>
#include "arg.h"
#include "config.h"
t@@ -117,11 +119,13 @@ parseheaders(FILE *fp, struct headers *head)
}
int
-writelog(FILE *in, FILE *out, struct headers *head)
+writeentry(FILE *in, char *dir, struct headers *head)
{
+ FILE *out;
struct tm tm = {.tm_isdst = -1};
char stamp[BUFSIZ];
char *subject, *date, *from;
+ char entry[PATH_MAX];
ssize_t len;
char buf[BUFSIZ];
t@@ -130,6 +134,13 @@ writelog(FILE *in, FILE *out, struct headers *head)
date = header(head, "Date");
from = header(head, "From");
+ snprintf(entry, sizeof(entry), "%s/%s.txt", dir, sanitize(subject));
+ out = fopen(entry, "w");
+ if (!out) {
+ perror(entry);
+ return -1;
+ }
+
/* convert date to an appropriate format */
strptime(date, "%a, %d %b %Y %T %z", &tm);
strftime(stamp, sizeof(stamp), datefmt, &tm);
t@@ -146,15 +157,41 @@ writelog(FILE *in, FILE *out, struct headers *head)
}
int
+writeindex(FILE *out, char *dir)
+{
+ DIR *dirp;
+ struct dirent *d;
+
+ dirp = opendir(dir);
+ if (!dirp)
+ return -1;
+
+ fprintf(out, "[i|%69s|Err||]\n", phlogname);
+ fprintf(out, "[i|──────────────────────────────────────────────────────────────────────|Err||]\n");
+ fprintf(out, "\n");
+ fprintf(out, "\nlog entries:\n\n");
+
+ while ((d = readdir(dirp))) {
+ if (d->d_type != DT_REG || !strstr(d->d_name, ".txt"))
+ continue;
+
+ fprintf(out, "[0|%s|%s|%s|%d]\n", d->d_name, d->d_name, host, port);
+ }
+
+ closedir(dirp);
+
+ return 0;
+}
+
+int
main(int argc, char *argv[])
{
FILE *in = stdin, *out = stdout;
char *argv0, *infile, *outfile;
- char fn[PATH_MAX];
struct headers headers;
infile = NULL;
- outfile = NULL;
+ outfile = "index.gph";
ARGBEGIN {
case 'b':
t@@ -174,25 +211,35 @@ main(int argc, char *argv[])
if (infile)
in = fopen(infile, "r");
- if (!in)
+ if (!in) {
+ perror(infile);
return -1;
+ }
- if (chdir(basedir) < 0)
+ if (chdir(basedir) < 0) {
+ perror(basedir);
return -1;
+ }
+
+ if (outfile)
+ out = fopen(outfile, "w");
- if (parseheaders(in, &headers) < 0)
+ if (!out) {
+ perror(outfile);
return -1;
+ }
- if (!outfile) {
- strlcpy(fn, sanitize(header(&headers, "Subject")), sizeof(fn));
- strlcat(fn, ".txt", sizeof(fn));
- outfile = fn;
+ if (parseheaders(in, &headers) < 0) {
+ perror("header section");
+ return -1;
}
- if (outfile && strncmp(outfile, "-", PATH_MAX))
- out = fopen(outfile, "w");
+ if (writeentry(in, basedir, &headers) < 0) {
+ perror("header section");
+ return -1;
+ }
- if (writelog(in, out, &headers) < 0)
+ if (writeindex(out, basedir) < 0)
return -1;
fclose(in);