commit ea080950069d12713bf146472e18750210c4a24f from: Omar Polo date: Tue Jul 20 08:34:58 2021 UTC touch ~/.telescope/crashed if the connection to ui process dies commit - 8064b84908439d34f2d8c11f09107d7e226d3809 commit + ea080950069d12713bf146472e18750210c4a24f blob - 8a803f10ae2871a1068d20eb8d286357f2740cac blob + c49aada1867eade200f189c326cbc652fdde5370 --- fs.c +++ fs.c @@ -55,6 +55,7 @@ static FILE *session; static char lockfile_path[PATH_MAX]; static char bookmark_file[PATH_MAX]; static char known_hosts_file[PATH_MAX], known_hosts_tmp[PATH_MAX]; +static char crashed_file[PATH_MAX]; char session_file[PATH_MAX]; @@ -350,7 +351,23 @@ static void handle_dispatch_imsg(int fd, short ev, void *d) { struct imsgev *iev = d; - dispatch_imsg(iev, ev, handlers, sizeof(handlers)); + int e; + + if (dispatch_imsg(iev, ev, handlers, sizeof(handlers)) == -1) { + /* + * This should leave a ~/.telescope/crashed file to + * trigger about:crash on next run. Unfortunately, if + * the main process dies the fs sticks around and + * doesn't notice that the fd was closed. Why EV_READ + * is not triggered when a fd is closed on the other end? + */ + e = errno; + if ((fd = open(crashed_file, O_CREAT|O_TRUNC|O_WRONLY, 0600)) + == -1) + err(1, "open"); + close(fd); + errx(1, "connection closed: %s", strerror(e)); + } } static int @@ -386,6 +403,9 @@ fs_init(void) strlcpy(session_file, getenv("HOME"), sizeof(session_file)); strlcat(session_file, "/.telescope/session", sizeof(session_file)); + strlcpy(crashed_file, getenv("HOME"), sizeof(crashed_file)); + strlcat(crashed_file, "/.telescope/crashed", sizeof(crashed_file)); + return 1; } blob - e42024b1ac845d80b1ff160f43770ad712f73b9a blob + 165dfe5ff526750c3ca47b1ab1d4f6b2ca5d1034 --- gemini.c +++ gemini.c @@ -567,7 +567,9 @@ static void handle_dispatch_imsg(int fd, short ev, void *d) { struct imsgev *iev = d; - dispatch_imsg(iev, ev, handlers, sizeof(handlers)); + + if (dispatch_imsg(iev, ev, handlers, sizeof(handlers)) == -1) + err(1, "connection closed"); } static int blob - 06045f111b22cb336a414b93ebc84d74c367ccd0 blob + e01b03d74d63d9fee1f99ba2c2cfec45d0ec49fc --- telescope.c +++ telescope.c @@ -541,7 +541,9 @@ static void handle_dispatch_imsg(int fd, short ev, void *d) { struct imsgev *iev = d; - dispatch_imsg(iev, ev, handlers, sizeof(handlers)); + + if (dispatch_imsg(iev, ev, handlers, sizeof(handlers)) == -1) + err(1, "connection closed"); } static void blob - 0da6cb218cdd79482477250ca15f821435846658 blob + 3824cee6e40bdc431ec84e473727dc570b4738bb --- telescope.h +++ telescope.h @@ -337,7 +337,7 @@ int mark_nonblock(int); int has_prefix(const char*, const char*); int unicode_isspace(uint32_t); int unicode_isgraph(uint32_t); -void dispatch_imsg(struct imsgev*, short, imsg_handlerfn**, size_t); +int dispatch_imsg(struct imsgev *, short, imsg_handlerfn **, size_t); int imsg_compose_event(struct imsgev *, uint16_t, uint32_t, pid_t, int, const void *, uint16_t); /* wrap.c */ blob - 9d51f36474be436c2bd10eae4ecd1f741a37ebd8 blob + 6db63f66abf8ca343e535fd83df530d61fa67243 --- util.c +++ util.c @@ -75,7 +75,7 @@ imsg_event_add(struct imsgev *iev) event_add(&iev->ev, NULL); } -void +int dispatch_imsg(struct imsgev *iev, short event, imsg_handlerfn **handlers, size_t size) { @@ -90,13 +90,13 @@ dispatch_imsg(struct imsgev *iev, short event, imsg_ha if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) err(1, "imsg_read error"); if (n == 0) - err(1, "connection closed"); + return -1; } if (event & EV_WRITE) { if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) err(1, "msgbuf_write"); if (n == 0) - err(1, "connection closed"); + return -1; } for (;;) { @@ -113,6 +113,7 @@ dispatch_imsg(struct imsgev *iev, short event, imsg_ha } imsg_event_add(iev); + return 0; } int