Hi cwm users,
In converting this to use getline(3) over fgetln(3), I'm asking the question if
this (imho) mis-feature belongs in a window manager. I've hinted at wanting to
remove it in the past but there was opposition. As a compromise, we could just
leave the 'ssh>' menu available, but it will not be pre-populated (nor
auto-completed) by what's in ~/.ssh/known_hosts; just type in the
host/ip/whatever at the menu prompt. cwm(1) does a very rudimentary pass at
parsing the known_hosts file, and there's no reason to hoist code from ssh(1)
just to get auto-completion in a window manager menu.
Below is the minimal code part in kbfunc_menu_ssh().
Preferably, I'd like to remove the whole ssh menu, but can live with the below
if it's useful to others.
Thoughts?
Thanks,
Okan
Index: kbfunc.c
===================================================================
RCS file: /home/open/cvs/xenocara/app/cwm/kbfunc.c,v
retrieving revision 1.145
diff -u -p -r1.145 kbfunc.c
--- kbfunc.c 9 May 2017 13:40:18 -0000 1.145
+++ kbfunc.c 6 Jul 2017 19:36:13 -0000
@@ -462,50 +462,16 @@ kbfunc_menu_ssh(void *ctx, struct cargs
struct cmd_ctx *cmd;
struct menu *mi;
struct menu_q menuq;
- FILE *fp;
- char *buf, *lbuf, *p;
- char hostbuf[HOST_NAME_MAX+1];
char path[PATH_MAX];
int l;
- size_t len;
TAILQ_FOREACH(cmd, &Conf.cmdq, entry) {
if (strcmp(cmd->name, "term") == 0)
break;
}
- TAILQ_INIT(&menuq);
- if ((fp = fopen(Conf.known_hosts, "r")) == NULL) {
- warn("%s: %s", __func__, Conf.known_hosts);
- goto menu;
- }
+ TAILQ_INIT(&menuq);
- lbuf = NULL;
- while ((buf = fgetln(fp, &len))) {
- if (buf[len - 1] == '\n')
- buf[len - 1] = '\0';
- else {
- /* EOF without EOL, copy and add the NUL */
- lbuf = xmalloc(len + 1);
- (void)memcpy(lbuf, buf, len);
- lbuf[len] = '\0';
- buf = lbuf;
- }
- /* skip hashed hosts */
- if (strncmp(buf, HASH_MARKER, strlen(HASH_MARKER)) == 0)
- continue;
- for (p = buf; *p != ',' && *p != ' ' && p != buf + len; p++) {
- /* do nothing */
- }
- /* ignore badness */
- if (p - buf + 1 > sizeof(hostbuf))
- continue;
- (void)strlcpy(hostbuf, buf, p - buf + 1);
- menuq_add(&menuq, NULL, "%s", hostbuf);
- }
- free(lbuf);
- (void)fclose(fp);
-menu:
if ((mi = menu_filter(sc, &menuq, "ssh", NULL, (CWM_MENU_DUMMY),
search_match_text, search_print_text)) != NULL) {
if (mi->text[0] == '\0')