commit - 5163d06e99f13dc060058f5ca99383f1442a504a
commit + 6cc5fcfe173c6d504497dead4171fabf46131134
blob - 9d66121a1ab68547730a8417a7f72de2c9be8c61
blob + cdf12dd6406e0ec32f1506e1a0aed23f545b3ae3
--- ChangeLog
+++ ChangeLog
2021-07-08 Omar Polo <op@omarpolo.com>
+ * telescope.c (start_child): re-exec the children processes
+
* ui.c (print_vline): bug: print the trailing face until the right column, not one less. (this would leave the last column white if !olivetti-mode and a background color for some body lines)
2021-07-07 Omar Polo <op@omarpolo.com>
blob - 30c46ecda4c84c1859d216abd5479f7583308c0b
blob + 676cd6ff61373fc0d64c1bcbcbbc1cdacb2a405b
--- fs.c
+++ fs.c
}
int
-fs_main(struct imsgbuf *b)
+fs_main(void)
{
- ibuf = b;
+ setproctitle("fs");
+ fs_init();
+
event_init();
+ if ((ibuf = calloc(1, sizeof(*ibuf))) == NULL)
+ die();
+ imsg_init(ibuf, 3);
event_set(&imsgev, ibuf->fd, EV_READ | EV_PERSIST, handle_dispatch_imsg, ibuf);
event_add(&imsgev, NULL);
blob - 7b089c544b5ccfbe0f56de616faaed19061e60ab
blob + dd48075995c32948a8f2168e23404814ca966cc1
--- gemini.c
+++ gemini.c
}
int
-client_main(struct imsgbuf *b)
+client_main(void)
{
- ibuf = b;
+ setproctitle("net");
TAILQ_INIT(&reqhead);
event_init();
+ /* Setup pipe and event handler to the main process */
+ if ((ibuf = calloc(1, sizeof(*ibuf))) == NULL)
+ die();
+ imsg_init(ibuf, 3);
event_set(&imsgev, ibuf->fd, EV_READ | EV_PERSIST, handle_dispatch_imsg, ibuf);
event_add(&imsgev, NULL);
blob - f3bdd4d8240930703a31bcec2934ff54fc8dc851
blob + 1e9b1046ee0786259437ad3757cd7caa436e1505
--- telescope.c
+++ telescope.c
struct event netev, fsev;
struct tabshead tabshead;
struct proxylist proxies;
+
+enum telescope_process {
+ PROC_UI,
+ PROC_FS,
+ PROC_NET,
+};
/* the first is also the fallback one */
static struct proto protos[] = {
static void handle_dispatch_imsg(int, short, void*);
static void load_page_from_str(struct tab*, const char*);
static void do_load_url(struct tab*, const char*);
+static pid_t start_child(enum telescope_process, const char *, int);
static imsg_handlerfn *handlers[] = {
[IMSG_ERR] = handle_imsg_err,
new_tab(url);
}
-static void
-usage(void)
+static pid_t
+start_child(enum telescope_process p, const char *argv0, int fd)
+{
+ const char *argv[4];
+ int argc = 0;
+ pid_t pid;
+
+ switch (pid = fork()) {
+ case -1:
+ die();
+ case 0:
+ break;
+ default:
+ close(fd);
+ return pid;
+ }
+
+ if (dup2(fd, 3) == -1)
+ err(1, "cannot setup imsg fd");
+
+ argv[argc++] = argv0;
+ switch (p) {
+ case PROC_UI:
+ errx(1, "Can't start ui process");
+ case PROC_FS:
+ argv[argc++] = "-Tf";
+ break;
+ case PROC_NET:
+ argv[argc++] = "-Tn";
+ break;
+ }
+
+ argv[argc++] = NULL;
+ execvp(argv0, (char *const *)argv);
+ err(1, "execvp(%s)", argv0);
+}
+
+static void __attribute__((noreturn))
+usage(int r)
{
fprintf(stderr, "USAGE: %s [-hn] [-c config] [url]\n", getprogname());
fprintf(stderr, "version: " PACKAGE " " VERSION "\n");
+ exit(r);
}
int
int net_fds[2], fs_fds[2];
int ch, configtest = 0, fail = 0;
int has_url = 0;
+ int proc = -1;
char path[PATH_MAX];
- char *url = NEW_TAB_URL;
+ const char *url = NEW_TAB_URL;
+ const char *argv0;
+ argv0 = argv[0];
+
signal(SIGCHLD, SIG_IGN);
signal(SIGPIPE, SIG_IGN);
strlcpy(path, getenv("HOME"), sizeof(path));
strlcat(path, "/.telescope/config", sizeof(path));
- while ((ch = getopt(argc, argv, "c:hn")) != -1) {
+ while ((ch = getopt(argc, argv, "c:hnT:")) != -1) {
switch (ch) {
case 'c':
fail = 1;
configtest = 1;
break;
case 'h':
- usage();
- return 0;
+ usage(0);
+ case 'T':
+ switch (*optarg) {
+ case 'f':
+ proc = PROC_FS;
+ break;
+ case 'n':
+ proc = PROC_NET;
+ break;
+ default:
+ errx(1, "invalid process spec %c",
+ *optarg);
+ }
+ break;
default:
- usage();
- return 1;
+ usage(1);
}
}
argc -= optind;
argv += optind;
+ if (proc != -1) {
+ if (argc > 0)
+ usage(1);
+ else if (proc == PROC_FS)
+ return fs_main();
+ else if (proc == PROC_NET)
+ return client_main();
+ else
+ usage(1);
+ }
+
if (argc != 0) {
has_url = 1;
url = argv[0];
}
- /*
- * initialize part of the fs layer. Before starting the UI
- * and dropping the priviledges we need to read some stuff.
- */
- fs_init();
-
/* setup keys before reading the config */
TAILQ_INIT(&global_map.m);
global_map.unhandled_input = global_key_unbound;
exit(0);
}
+ /* Start children. */
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, fs_fds) == -1)
err(1, "socketpair");
+ start_child(PROC_FS, argv0, fs_fds[1]);
+ imsg_init(&fs_ibuf, fs_fds[0]);
+ fsibuf = &fs_ibuf;
- switch (fork()) {
- case -1:
- err(1, "fork");
- case 0:
- /* child */
- setproctitle("fs");
- close(fs_fds[0]);
- imsg_init(&fs_ibuf, fs_fds[1]);
- exit(fs_main(&fs_ibuf));
- default:
- close(fs_fds[1]);
- imsg_init(&fs_ibuf, fs_fds[0]);
- fsibuf = &fs_ibuf;
- }
-
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, net_fds) == -1)
err(1, "socketpair");
+ start_child(PROC_NET, argv0, net_fds[1]);
+ imsg_init(&network_ibuf, net_fds[0]);
+ netibuf = &network_ibuf;
- switch (fork()) {
- case -1:
- err(1, "fork");
- case 0:
- /* child */
- setproctitle("client");
- close(net_fds[0]);
- close(fs_fds[0]);
- imsg_init(&network_ibuf, net_fds[1]);
- exit(client_main(&network_ibuf));
- default:
- close(net_fds[1]);
- imsg_init(&network_ibuf, net_fds[0]);
- netibuf = &network_ibuf;
- }
-
setproctitle("ui");
+ /* initialize tofu & load certificates */
+ fs_init();
tofu_init(&certs, 5, offsetof(struct tofu_entry, domain));
load_certs(&certs);
blob - 82231939a93f4c0b653475c37143c471303d7876
blob + 17475e59659c68fa7e64a500759111da5ddce936
--- telescope.h
+++ telescope.h
/* fs.c */
int fs_init(void);
-int fs_main(struct imsgbuf*);
+int fs_main(void);
int load_certs(struct ohash*);
int load_last_session(void(*)(const char*));
/* gemini.c */
-int client_main(struct imsgbuf*);
+int client_main(void);
/* gemtext.c */
void gemtext_initparser(struct parser*);