commit be97d6e6eed961ec5caf528306c94ffd55437328 from: Omar Polo date: Sun Aug 15 18:30:06 2021 UTC improve crash detection Create a file ~/.telescope/crashed on startup and unlink it on shutdown. If it's present on startup, it means that last time we crashed. It's like the ``dirty'' bit on filesystems to guard for unproper unmounts. commit - 7b4e4feb80bf2d3d829877aeabd4355677e8b8d2 commit + be97d6e6eed961ec5caf528306c94ffd55437328 blob - a654bc1709f8b481dd006a43944b44cc3c993c79 blob + f2c755588ed794e744644bee143216ebc661df94 --- fs.c +++ fs.c @@ -316,6 +316,8 @@ handle_get_file(struct imsg *imsg, size_t datalen) static void handle_quit(struct imsg *imsg, size_t datalen) { + unlink(crashed_file); + event_loopbreak(); } @@ -592,17 +594,25 @@ fs_main(void) +/* + * Check if the last time telescope crashed. The check is done by + * looking at `crashed_file': if it exists then last time we crashed. + * Then, while here, touch the file too. During IMSG_QUIT we'll + * remove it. + */ int last_time_crashed(void) { - int fd; - - if ((fd = open(crashed_file, O_RDONLY)) == -1) - return 0; + int fd, crashed = 1; + if (unlink(crashed_file) == -1 && errno == ENOENT) + crashed = 0; + + if ((fd = open(crashed_file, O_CREAT|O_WRONLY, 0600)) == -1) + return crashed; close(fd); - unlink(crashed_file); - return 1; + + return crashed; } int blob - cd954fb064de426894e1046005693ecee44b544b blob + 0d78ae0872f40a846b77522681d4122160684ec7 --- telescope.c +++ telescope.c @@ -17,7 +17,9 @@ #include "compat.h" #include +#include +#include #include #include #include @@ -990,11 +992,13 @@ int main(int argc, char * const *argv) { struct imsgev net_ibuf, fs_ibuf; + pid_t pid; int pipe2net[2], pipe2fs[2]; int ch, configtest = 0, fail = 0; int has_url = 0; int proc = -1; int sessionfd; + int status; char path[PATH_MAX]; const char *url = NEW_TAB_URL; const char *argv0; @@ -1133,6 +1137,16 @@ main(int argc, char * const *argv) ui_send_net(IMSG_QUIT, 0, NULL, 0); imsg_flush(&iev_fs->ibuf); imsg_flush(&iev_net->ibuf); + + /* wait for children to terminate */ + do { + pid = wait(&status); + if (pid == -1) { + if (errno != EINTR && errno != ECHILD) + err(1, "wait"); + } else if (WIFSIGNALED(status)) + warnx("child terminated; signal %d", WTERMSIG(status)); + } while (pid != -1 || (pid == -1 && errno == EINTR)); close(sessionfd);