about summary refs log tree commit diff
path: root/url.c
diff options
context:
space:
mode:
Diffstat (limited to 'url.c')
-rw-r--r--url.c42
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);
 }