svn commit: r360368 - stable/12/usr.sbin/config
Jason A. Harmening
jah at FreeBSD.org
Mon Apr 27 05:35:29 UTC 2020
Author: jah
Date: Mon Apr 27 05:35:26 2020
New Revision: 360368
URL: https://svnweb.freebsd.org/changeset/base/360368
Log:
MFC r359815: config(8): use sbuf to manage line buffers
Modified:
stable/12/usr.sbin/config/main.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/usr.sbin/config/main.c
==============================================================================
--- stable/12/usr.sbin/config/main.c Mon Apr 27 05:27:39 2020 (r360367)
+++ stable/12/usr.sbin/config/main.c Mon Apr 27 05:35:26 2020 (r360368)
@@ -113,6 +113,8 @@ struct hdr_list {
struct hdr_list *h_next;
} *htab;
+static struct sbuf *line_buf = NULL;
+
/*
* Config builds a set of files for building a UNIX
* system given a description of the desired system.
@@ -304,6 +306,29 @@ usage(void)
exit(EX_USAGE);
}
+static void
+init_line_buf(void)
+{
+ if (line_buf == NULL) {
+ line_buf = sbuf_new(NULL, NULL, 80, SBUF_AUTOEXTEND);
+ if (line_buf == NULL) {
+ errx(EXIT_FAILURE, "failed to allocate line buffer");
+ }
+ } else {
+ sbuf_clear(line_buf);
+ }
+}
+
+static char *
+get_line_buf(void)
+{
+ if (sbuf_finish(line_buf) != 0) {
+ errx(EXIT_FAILURE, "failed to generate line buffer, "
+ "partial line = %s", sbuf_data(line_buf));
+ }
+ return sbuf_data(line_buf);
+}
+
/*
* get_word
* returns EOF on end of file
@@ -313,11 +338,10 @@ usage(void)
char *
get_word(FILE *fp)
{
- static char line[160];
int ch;
- char *cp;
int escaped_nl = 0;
+ init_line_buf();
begin:
while ((ch = getc(fp)) != EOF)
if (ch != ' ' && ch != '\t')
@@ -336,29 +360,20 @@ begin:
else
return (NULL);
}
- cp = line;
- *cp++ = ch;
+ sbuf_putc(line_buf, ch);
/* Negation operator is a word by itself. */
if (ch == '!') {
- *cp = 0;
- return (line);
+ return get_line_buf();
}
- while ((ch = getc(fp)) != EOF && cp < line + sizeof(line)) {
+ while ((ch = getc(fp)) != EOF) {
if (isspace(ch))
break;
- *cp++ = ch;
+ sbuf_putc(line_buf, ch);
}
- if (cp >= line + sizeof(line)) {
- line[sizeof(line) - 1] = '\0';
- fprintf(stderr, "config: attempted overflow, partial line: `%s'",
- line);
- exit(2);
- }
- *cp = 0;
if (ch == EOF)
return ((char *)EOF);
(void) ungetc(ch, fp);
- return (line);
+ return (get_line_buf());
}
/*
@@ -369,11 +384,10 @@ begin:
char *
get_quoted_word(FILE *fp)
{
- static char line[512];
int ch;
- char *cp;
int escaped_nl = 0;
+ init_line_buf();
begin:
while ((ch = getc(fp)) != EOF)
if (ch != ' ' && ch != '\t')
@@ -392,7 +406,6 @@ begin:
else
return (NULL);
}
- cp = line;
if (ch == '"' || ch == '\'') {
int quote = ch;
@@ -401,9 +414,8 @@ begin:
if (ch == quote && !escaped_nl)
break;
if (ch == '\n' && !escaped_nl) {
- *cp = 0;
printf("config: missing quote reading `%s'\n",
- line);
+ get_line_buf());
exit(2);
}
if (ch == '\\' && !escaped_nl) {
@@ -411,38 +423,23 @@ begin:
continue;
}
if (ch != quote && escaped_nl)
- *cp++ = '\\';
- if (cp >= line + sizeof(line)) {
- line[sizeof(line) - 1] = '\0';
- printf(
- "config: line buffer overflow reading partial line `%s'\n",
- line);
- exit(2);
- }
- *cp++ = ch;
+ sbuf_putc(line_buf, '\\');
+ sbuf_putc(line_buf, ch);
escaped_nl = 0;
}
} else {
- *cp++ = ch;
- while ((ch = getc(fp)) != EOF && cp < line + sizeof(line)) {
+ sbuf_putc(line_buf, ch);
+ while ((ch = getc(fp)) != EOF) {
if (isspace(ch))
break;
- *cp++ = ch;
+ sbuf_putc(line_buf, ch);
}
- if (cp >= line + sizeof(line)) {
- line[sizeof(line) - 1] = '\0';
- printf(
- "config: line buffer overflow reading partial line `%s'\n",
- line);
- exit(2);
- }
if (ch != EOF)
(void) ungetc(ch, fp);
}
- *cp = 0;
if (ch == EOF)
return ((char *)EOF);
- return (line);
+ return (get_line_buf());
}
/*
More information about the svn-src-all
mailing list