summary refs log tree commit diff
path: root/kbfunc.c
diff options
context:
space:
mode:
authorokan <okan>2017-07-10 13:36:58 +0000
committerokan <okan>2017-07-10 13:36:58 +0000
commitd179dfdeb97d1f4d16d56ae5783044770d87898c (patch)
tree057e013fdc6f090fe57270427aebee900da881b7 /kbfunc.c
parentf94fde51fb5c0a0afe44d627ba7493118bfc3d6f (diff)
downloadcwm-d179dfdeb97d1f4d16d56ae5783044770d87898c.tar.gz
cwm-d179dfdeb97d1f4d16d56ae5783044770d87898c.tar.xz
cwm-d179dfdeb97d1f4d16d56ae5783044770d87898c.zip
Replace fgetln(3) with POSIX getline(3); inspired by brynet and Ingo.
feedback and ok brynet@
Diffstat (limited to 'kbfunc.c')
-rw-r--r--kbfunc.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/kbfunc.c b/kbfunc.c
index f705b9d..c9847f9 100644
--- a/kbfunc.c
+++ b/kbfunc.c
@@ -468,6 +468,7 @@ kbfunc_menu_ssh(void *ctx, struct cargs *cargs)
 	char			 path[PATH_MAX];
 	int			 l;
 	size_t			 len;
+	ssize_t			 slen;
 
 	TAILQ_FOREACH(cmd, &Conf.cmdq, entry) {
 		if (strcmp(cmd->name, "term") == 0)
@@ -481,20 +482,16 @@ kbfunc_menu_ssh(void *ctx, struct cargs *cargs)
 	}
 
 	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;
-		}
+	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 + len; p++) {
+		for (p = buf; *p != ',' && *p != ' ' && p != buf + slen; p++) {
 			/* do nothing */
 		}
 		/* ignore badness */
@@ -504,6 +501,8 @@ kbfunc_menu_ssh(void *ctx, struct cargs *cargs)
 		menuq_add(&menuq, NULL, "%s", hostbuf);
 	}
 	free(lbuf);
+	if (ferror(fp))
+		err(1, "%s", path);
 	(void)fclose(fp);
 menu:
 	if ((mi = menu_filter(sc, &menuq, "ssh", NULL, (CWM_MENU_DUMMY),