Dear OpenBSD folks,

appended you will find a patch allowing cwm to also parse the contents
of /etc/ssh/ssh_known_hosts and thus extend the ssh menu.

the diff was taken against the latest source on the github xenocara repo.

comments and/or feedback is much appreciated.

thanks for considering this. :)

best regards

Franz Bettag

diff --git app/cwm/calmwm.h app/cwm/calmwm.h
index 008c16e1..445dab9e 100644
--- app/cwm/calmwm.h
+++ app/cwm/calmwm.h
@@ -305,6 +305,7 @@ struct conf {
        int                      xrandr_event_base;
        char                    *conf_file;
        char                    *known_hosts;
+       char                    *global_known_hosts;
        char                    *wm_argv;
        int                      debug;
};
diff --git app/cwm/conf.c app/cwm/conf.c
index c84be55b..62994b11 100644
--- app/cwm/conf.c
+++ app/cwm/conf.c
@@ -318,6 +318,7 @@ conf_init(struct conf *c)
        }
        xasprintf(&c->conf_file, "%s/%s", home, ".cwmrc");
        xasprintf(&c->known_hosts, "%s/%s", home, ".ssh/known_hosts");
+       xasprintf(&c->global_known_hosts, "/etc/ssh/ssh_known_hosts");
}

void
@@ -365,6 +366,7 @@ conf_clear(struct conf *c)

        free(c->conf_file);
        free(c->known_hosts);
+       free(c->global_known_hosts);
        free(c->font);
        free(c->wmname);
}
diff --git app/cwm/cwm.1 app/cwm/cwm.1
index fc8f0ece..ddadea0e 100644
--- app/cwm/cwm.1
+++ app/cwm/cwm.1
@@ -146,6 +146,8 @@ Spawn
dialog.
This parses
.Pa $HOME/.ssh/known_hosts
+and
+.Pa /etc/ssh/ssh_known_hosts
to provide host auto-completion.
.Xr ssh 1
will be executed via the configured terminal emulator.
diff --git app/cwm/kbfunc.c app/cwm/kbfunc.c
index 48404874..6b4c05dc 100644
--- app/cwm/kbfunc.c
+++ app/cwm/kbfunc.c
@@ -670,6 +670,34 @@ kbfunc_menu_ssh(void *ctx, struct cargs *cargs)

        if ((fp = fopen(Conf.known_hosts, "r")) == NULL) {
                warn("%s: %s", __func__, Conf.known_hosts);
+               goto global;
+       }
+
+       lbuf = NULL;
+       len = 0;
+       while ((slen = getline(&lbuf, &len, fp)) != -1) {
+               buf = lbuf;
+               if (buf[slen - 1] == '\n')
+                       buf[slen - 1] = '\0';
+
+               /* skip hashed hosts */
+               if (strncmp(buf, HASH_MARKER, strlen(HASH_MARKER)) == 0)
+                       continue;
+               for (p = buf; *p != ',' && *p != ' ' && p != buf + slen; p++)
+                       ;
+               /* ignore badness */
+               if (p - buf + 1 > sizeof(hostbuf))
+                       continue;
+               (void)strlcpy(hostbuf, buf, p - buf + 1);
+               menuq_add(&menuq, NULL, "%s", hostbuf);
+       }
+       free(lbuf);
+       if (ferror(fp))
+               err(1, "%s", path);
+       (void)fclose(fp);
+global:
+       if ((fp = fopen(Conf.global_known_hosts, "r")) == NULL) {
+               warn("%s: %s", __func__, Conf.global_known_hosts);
                goto menu;
        }

Reply via email to