diff options
Diffstat (limited to '')
-rw-r--r-- | www/text.causal.agency/Makefile | 13 | ||||
-rw-r--r-- | www/text.causal.agency/igp.1 | 49 | ||||
-rw-r--r-- | www/text.causal.agency/igp.c | 143 |
3 files changed, 3 insertions, 202 deletions
diff --git a/www/text.causal.agency/Makefile b/www/text.causal.agency/Makefile index 913fc586..5b3c86b8 100644 --- a/www/text.causal.agency/Makefile +++ b/www/text.causal.agency/Makefile @@ -1,7 +1,4 @@ -WEBROOT ?= /var/www/text.causal.agency -LIBEXEC ?= /usr/local/libexec - -CFLAGS += -Wall -Wextra +WEBROOT = /var/www/text.causal.agency TXTS += 001-make.txt TXTS += 002-writing-mdoc.txt @@ -38,15 +35,11 @@ all: colb ${TXTS} .7.txt: mandoc -T utf8 $< | ./colb > $@ -feed.atom: feed.sh ${TXTS} +feed.atom: feed.sh colb ${TXTS} sh feed.sh > feed.atom clean: - rm -f ${TXTS} feed.atom igp + rm -f colb ${TXTS} feed.atom install: colb ${TXTS} feed.atom install -p -m 644 ${TXTS} feed.atom ${WEBROOT} - -install-igp: igp - install igp ${LIBEXEC} - install -p -m 644 igp.c ${WEBROOT} diff --git a/www/text.causal.agency/igp.1 b/www/text.causal.agency/igp.1 deleted file mode 100644 index ccfaeaa6..00000000 --- a/www/text.causal.agency/igp.1 +++ /dev/null @@ -1,49 +0,0 @@ -.Dd January 14, 2021 -.Dt IGP 1 -.Os -. -.Sh NAME -.Nm igp -.Nd insane gopher posse -. -.Sh SYNOPSIS -.Nm -.Op Fl h Ar host -.Op Fl p Ar port -.Ar directory -. -.Sh DESCRIPTION -The -.Nm -utility is a simple -Internet Gopher server -which can be started by -.Xr inetd 8 . -It serves directory listings -and files under -.Ar directory . -. -.Pp -The arguments are as follows: -.Bl -tag -width Ds -.It Fl h Ar host -Set the host used in directory listings. -The default is the local host name. -.It Fl p Ar port -Set the port used in directory listeings. -The default is port 70. -.El -. -.Sh STANDARDS -.Rs -.%A B. Alberti -.%A F. Anklesaria -.%A D. Johnson -.%A P. Lindner -.%A M. McCahill -.%A D. Torrey -.%T The Internet Gopher Protocol -.%I IETF -.%R RFC 1436 -.%D March 1993 -.Re diff --git a/www/text.causal.agency/igp.c b/www/text.causal.agency/igp.c deleted file mode 100644 index cda604d8..00000000 --- a/www/text.causal.agency/igp.c +++ /dev/null @@ -1,143 +0,0 @@ -/* Copyright (C) 2021 June McEnroe <june@causal.agency> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include <dirent.h> -#include <err.h> -#include <errno.h> -#include <fcntl.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/socket.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <sys/uio.h> -#include <sysexits.h> -#include <time.h> -#include <unistd.h> - -#ifdef __FreeBSD__ -#include <sys/capsicum.h> -#endif - -static int compar(const void *_a, const void *_b) { - const struct dirent *a = _a; - const struct dirent *b = _b; - if (a->d_type != b->d_type) { - return (a->d_type > b->d_type) - (a->d_type < b->d_type); - } - return strcmp(a->d_name, b->d_name); -} - -int main(int argc, char *argv[]) { - int error; - const char *host = NULL; - const char *port = "70"; - for (int opt; 0 < (opt = getopt(argc, argv, "h:p:"));) { - switch (opt) { - break; case 'h': host = optarg; - break; case 'p': port = optarg; - break; default: return EX_USAGE; - } - } - if (optind == argc) return EX_USAGE; - if (!host) { - static char buf[256]; - error = gethostname(buf, sizeof(buf)); - if (error) abort(); - host = buf; - } - - const char *path = argv[optind]; - int root = open(path, O_RDONLY | O_DIRECTORY); - if (root < 0) err(EX_NOINPUT, "/"); - -#ifdef __FreeBSD__ - cap_rights_t cap; - error = cap_enter() - || cap_rights_limit(STDIN_FILENO, cap_rights_init(&cap, CAP_READ)) - || cap_rights_limit(STDOUT_FILENO, cap_rights_init(&cap, CAP_WRITE)) - || cap_rights_limit(STDERR_FILENO, &cap) - || cap_rights_limit( - root, cap_rights_init(&cap, CAP_PREAD, CAP_FSTATAT, CAP_FSTATFS) - ); - if (error) abort(); -#else -#warning "This is completely insecure without capsicum(4)!" -#endif - - char buf[1024]; - if (!fgets(buf, sizeof(buf), stdin)) return EX_PROTOCOL; - char *ptr = buf; - char *sel = strsep(&ptr, "\t\r\n"); - if (sel[0] == '/') sel++; - - int fd = (sel[0] ? openat(root, sel, O_RDONLY) : root); - if (fd < 0) err(EX_NOINPUT, "%s", sel); - - struct stat stat; - error = fstat(fd, &stat); - if (error) err(EX_IOERR, "%s", sel); - if (!(stat.st_mode & (S_IFREG | S_IFDIR))) { - errx(EX_NOINPUT, "%s: Not a file or directory", sel); - } - - if (stat.st_mode & S_IFREG) { -#ifdef __FreeBSD__ - error = sendfile(fd, STDOUT_FILENO, 0, 0, NULL, NULL, 0); - if (!error) return EX_OK; -#endif - char buf[4096]; - for (ssize_t len; 0 < (len = read(fd, buf, sizeof(buf)));) { - fwrite(buf, len, 1, stdout); - } - return EX_OK; - } - - DIR *dir = fdopendir(fd); - if (!dir) err(EX_IOERR, "%s", sel); - - size_t len = 0; - size_t width = 0; - static struct dirent ents[4096]; - for (struct dirent *ent; len < 4096 && (ent = readdir(dir));) { - if (ent->d_name[0] == '.') continue; - if (ent->d_type != DT_REG && ent->d_type != DT_DIR) continue; - if (ent->d_namlen > width) width = ent->d_namlen; - ents[len++] = *ent; - } - - qsort(ents, len, sizeof(ents[0]), compar); - for (size_t i = 0; i < len; ++i) { - char mtime[26] = ""; - if (ents[i].d_type == DT_REG) { - error = fstatat(fd, ents[i].d_name, &stat, 0); - if (error) err(EX_IOERR, "%s/%s", sel, ents[i].d_name); - ctime_r(&stat.st_mtime, mtime); - mtime[24] = '\0'; - } - printf( - "%c%-*s %s\t%s%s%s\t%s\t%s\r\n", - (ents[i].d_type == DT_DIR ? '1' : '0'), - (int)width, ents[i].d_name, mtime, - sel, (sel[0] ? "/" : ""), ents[i].d_name, host, port - ); - } - - printf("i-- \t\t%s\t%s\r\n", host, port); - printf("0Served by IGP (AGPLv3)\tigp.c\ttext.causal.agency\t70\r\n"); - printf(".\r\n"); -} |