commit eb722b5028dcd686244ecbca2ff4bfb0a29a6c68 from: Omar Polo date: Mon Jan 03 12:04:24 2022 UTC move know_host parsing to the fs process and load the store via imsgs Like previously did with the session file, now the main process doesn't parse anything with the only exception being the configuration file. With this in, the only bit from fs.h still used in the main process is the path to the configuration file. commit - 50f036824c2c9c860754f608c478c909642bdab1 commit + eb722b5028dcd686244ecbca2ff4bfb0a29a6c68 blob - 5e8a17493f800dd8c5af5c9850a5bfbcd2655d9d blob + 065cde90fd716f1acebd322bf4634a731e031b5a --- fs.c +++ fs.c @@ -59,6 +59,7 @@ static void getenv_default(char*, const char*, const static void mkdirs(const char*, mode_t); static void xdg_init(void); static void load_last_session(void); +static void load_certs(void); static struct imsgev *iev_ui; static FILE *session; @@ -339,6 +340,7 @@ handle_misc(struct imsg *imsg, size_t datalen) { switch (imsg->hdr.type) { case IMSG_INIT: + load_certs(); load_last_session(); break; @@ -880,43 +882,42 @@ parse_khost_line(char *line, char *tmp[3]) return ap == &tmp[3] && *line == '\0'; } -int -load_certs(struct ohash *h) +static void +load_certs(void) { char *tmp[3], *line = NULL; const char *errstr; size_t lineno = 0, linesize = 0; ssize_t linelen; FILE *f; - struct tofu_entry *e; + struct tofu_entry e; if ((f = fopen(known_hosts_file, "r")) == NULL) - return 0; + return; while ((linelen = getline(&line, &linesize, f)) != -1) { - if ((e = calloc(1, sizeof(*e))) == NULL) - abort(); - lineno++; - if (parse_khost_line(line, tmp)) { - strlcpy(e->domain, tmp[0], sizeof(e->domain)); - strlcpy(e->hash, tmp[1], sizeof(e->hash)); + memset(&e, 0, sizeof(e)); + if (parse_khost_line(line, tmp)) { + strlcpy(e.domain, tmp[0], sizeof(e.domain)); + strlcpy(e.hash, tmp[1], sizeof(e.hash)); - e->verified = strtonum(tmp[2], 0, 1, &errstr); + e.verified = strtonum(tmp[2], 0, 1, &errstr); if (errstr != NULL) errx(1, "%s:%zu verification for %s is %s: %s", known_hosts_file, lineno, - e->domain, errstr, tmp[2]); - tofu_add(h, e); + e.domain, errstr, tmp[2]); + + fs_send_ui(IMSG_TOFU, 0, -1, &e, sizeof(e)); } else { warnx("%s:%zu invalid entry", known_hosts_file, lineno); - free(e); } } free(line); - return ferror(f); + fclose(f); + return; } blob - 5e48fbdecfc07b88e66e1a9d8d9e1db284fa8ffd blob + 7f07e22acf62c3676335e7e4fc7795b4ac8f2fa8 --- fs.h +++ fs.h @@ -49,6 +49,5 @@ int fs_init(void); int fs_main(void); int last_time_crashed(void); int lock_session(void); -int load_certs(struct ohash *); #endif blob - 0d06700ce88a704696aab7f7a764ba1ac8ff670b blob + 9c81b8fbd2cbbad08aa49c3f9bdd02cc73516ecf --- telescope.c +++ telescope.c @@ -115,6 +115,7 @@ static void handle_save_page_path(const char *, stru static void handle_imsg_file_opened(struct imsg *, size_t); static void handle_imsg_buf(struct imsg *, size_t); static void handle_imsg_eof(struct imsg *, size_t); +static void handle_imsg_tofu(struct imsg *, size_t); static void handle_imsg_bookmark_ok(struct imsg *, size_t); static void handle_imsg_save_cert_ok(struct imsg *, size_t); static void handle_imsg_update_cert_ok(struct imsg *, size_t); @@ -153,6 +154,7 @@ static imsg_handlerfn *handlers[] = { [IMSG_GOT_META] = handle_imsg_got_meta, [IMSG_BUF] = handle_imsg_buf, [IMSG_EOF] = handle_imsg_eof, + [IMSG_TOFU] = handle_imsg_tofu, [IMSG_BOOKMARK_OK] = handle_imsg_bookmark_ok, [IMSG_SAVE_CERT_OK] = handle_imsg_save_cert_ok, [IMSG_UPDATE_CERT_OK] = handle_imsg_update_cert_ok, @@ -610,6 +612,26 @@ handle_imsg_eof(struct imsg *imsg, size_t datalen) } static void +handle_imsg_tofu(struct imsg *imsg, size_t datalen) +{ + struct tofu_entry *e; + + if (operating) + die(); + + if ((e = calloc(1, sizeof(*e))) == NULL) + die(); + + if (datalen != sizeof(*e)) + die(); + memcpy(e, imsg->data, sizeof(*e)); + if (e->domain[sizeof(e->domain)-1] != '\0' || + e->hash[sizeof(e->hash)-1] != '\0') + die(); + tofu_add(&certs, e); +} + +static void handle_imsg_bookmark_ok(struct imsg *imsg, size_t datalen) { int res; @@ -1219,9 +1241,8 @@ main(int argc, char * const *argv) setproctitle("ui"); - /* initialize tofu & load certificates */ + /* initialize tofu store */ tofu_init(&certs, 5, offsetof(struct tofu_entry, domain)); - load_certs(&certs); event_init(); blob - 1755f633562bf7c0c8bfeeea22085afc9ce45b1c blob + 1cb51617e81908a9f7c4f87713bf8de8bc19c253 --- telescope.h +++ telescope.h @@ -58,6 +58,7 @@ enum imsg_type { /* ui <-> fs */ IMSG_INIT, + IMSG_TOFU, IMSG_BOOKMARK_PAGE, IMSG_BOOKMARK_OK, IMSG_SAVE_CERT,