diff options
Diffstat (limited to 'url.c')
-rw-r--r-- | url.c | 42 |
1 files changed, 22 insertions, 20 deletions
diff --git a/url.c b/url.c index 21f946c..349dc00 100644 --- a/url.c +++ b/url.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2020 C. McEnroe <june@causal.agency> +/* Copyright (C) 2020 June McEnroe <june@causal.agency> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -32,7 +32,6 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <sysexits.h> #include <unistd.h> #include "chat.h" @@ -41,6 +40,7 @@ static const char *Pattern = { "(" "cvs|" "ftp|" + "gemini|" "git|" "gopher|" "http|" @@ -66,7 +66,7 @@ static void compile(void) { if (!error) return; char buf[256]; regerror(error, &Regex, buf, sizeof(buf)); - errx(EX_SOFTWARE, "regcomp: %s: %s", buf, Pattern); + errx(1, "regcomp: %s: %s", buf, Pattern); } struct URL { @@ -91,14 +91,14 @@ static void push(uint id, const char *nick, const char *str, size_t len) { url->nick = NULL; if (nick) { url->nick = strdup(nick); - if (!url->nick) err(EX_OSERR, "strdup"); + if (!url->nick) err(1, "strdup"); } url->url = malloc(len + 1); - if (!url->url) err(EX_OSERR, "malloc"); + if (!url->url) err(1, "malloc"); char buf[1024]; snprintf(buf, sizeof(buf), "%.*s", (int)len, str); - styleStrip(&(struct Cat) { url->url, len + 1, 0 }, buf); + styleStrip(url->url, len + 1, buf); } void urlScan(uint id, const char *nick, const char *mesg) { @@ -119,9 +119,10 @@ static const struct Util OpenUtils[] = { static void urlOpen(const char *url) { pid_t pid = fork(); - if (pid < 0) err(EX_OSERR, "fork"); + if (pid < 0) err(1, "fork"); if (pid) return; + setsid(); close(STDIN_FILENO); dup2(utilPipe[1], STDOUT_FILENO); dup2(utilPipe[1], STDERR_FILENO); @@ -130,7 +131,7 @@ static void urlOpen(const char *url) { utilPush(&util, url); execvp(util.argv[0], (char *const *)util.argv); warn("%s", util.argv[0]); - _exit(EX_CONFIG); + _exit(127); } for (size_t i = 0; i < ARRAY_LEN(OpenUtils); ++i) { struct Util util = OpenUtils[i]; @@ -138,11 +139,11 @@ static void urlOpen(const char *url) { execvp(util.argv[0], (char *const *)util.argv); if (errno != ENOENT) { warn("%s", util.argv[0]); - _exit(EX_CONFIG); + _exit(127); } } warnx("no open utility found"); - _exit(EX_CONFIG); + _exit(127); } struct Util urlCopyUtil; @@ -156,23 +157,24 @@ static const struct Util CopyUtils[] = { static void urlCopy(const char *url) { int rw[2]; int error = pipe(rw); - if (error) err(EX_OSERR, "pipe"); + if (error) err(1, "pipe"); size_t len = strlen(url); if (len > PIPE_BUF) len = PIPE_BUF; ssize_t n = write(rw[1], url, len); - if (n < 0) err(EX_IOERR, "write"); + if (n < 0) err(1, "write"); error = close(rw[1]); - if (error) err(EX_IOERR, "close"); + if (error) err(1, "close"); pid_t pid = fork(); - if (pid < 0) err(EX_OSERR, "fork"); + if (pid < 0) err(1, "fork"); if (pid) { close(rw[0]); return; } + setsid(); dup2(rw[0], STDIN_FILENO); dup2(utilPipe[1], STDOUT_FILENO); dup2(utilPipe[1], STDERR_FILENO); @@ -180,17 +182,17 @@ static void urlCopy(const char *url) { if (urlCopyUtil.argc) { execvp(urlCopyUtil.argv[0], (char *const *)urlCopyUtil.argv); warn("%s", urlCopyUtil.argv[0]); - _exit(EX_CONFIG); + _exit(127); } for (size_t i = 0; i < ARRAY_LEN(CopyUtils); ++i) { execvp(CopyUtils[i].argv[0], (char *const *)CopyUtils[i].argv); if (errno != ENOENT) { warn("%s", CopyUtils[i].argv[0]); - _exit(EX_CONFIG); + _exit(127); } } warnx("no copy utility found"); - _exit(EX_CONFIG); + _exit(127); } void urlOpenCount(uint id, uint count) { @@ -236,7 +238,7 @@ static int writeString(FILE *file, const char *str) { } static ssize_t readString(FILE *file, char **buf, size_t *cap) { ssize_t len = getdelim(buf, cap, '\0', file); - if (len < 0 && !feof(file)) err(EX_IOERR, "getdelim"); + if (len < 0 && !feof(file)) err(1, "getdelim"); return len; } @@ -266,11 +268,11 @@ void urlLoad(FILE *file, size_t version) { readString(file, &buf, &cap); if (buf[0]) { url->nick = strdup(buf); - if (!url->nick) err(EX_OSERR, "strdup"); + if (!url->nick) err(1, "strdup"); } readString(file, &buf, &cap); url->url = strdup(buf); - if (!url->url) err(EX_OSERR, "strdup"); + if (!url->url) err(1, "strdup"); } free(buf); } |