git: 432610226b1c - stable/12 - pw(8): use open_memstream(3) instead of sbuf(9)

Baptiste Daroussin bapt at FreeBSD.org
Wed May 5 08:25:25 UTC 2021


The branch stable/12 has been updated by bapt:

URL: https://cgit.FreeBSD.org/src/commit/?id=432610226b1ca188c5e7a7029e4852a5ad00edf5

commit 432610226b1ca188c5e7a7029e4852a5ad00edf5
Author:     Baptiste Daroussin <bapt at FreeBSD.org>
AuthorDate: 2021-04-27 03:05:13 +0000
Commit:     Baptiste Daroussin <bapt at FreeBSD.org>
CommitDate: 2021-05-05 07:37:17 +0000

    pw(8): use open_memstream(3) instead of sbuf(9)
    
    open_memstream(3) is a standard function that brings here the same
    functionnality what we were doing with sbuf(9).
    
    (cherry picked from commit 0cd4b781a6fa1ed4ca04a7b642f41652e25bbc9b)
---
 usr.sbin/pw/Makefile  |  2 +-
 usr.sbin/pw/pw_conf.c | 86 +++++++++++++++++++++++++++------------------------
 2 files changed, 47 insertions(+), 41 deletions(-)

diff --git a/usr.sbin/pw/Makefile b/usr.sbin/pw/Makefile
index 8db96d90f6e2..353eac132c7d 100644
--- a/usr.sbin/pw/Makefile
+++ b/usr.sbin/pw/Makefile
@@ -8,7 +8,7 @@ SRCS=	pw.c pw_conf.c pw_user.c pw_group.c pw_log.c pw_nis.c pw_vpw.c \
 
 WARNS?=	3
 
-LIBADD=	crypt util sbuf
+LIBADD=	crypt util
 
 .include <src.opts.mk>
 
diff --git a/usr.sbin/pw/pw_conf.c b/usr.sbin/pw/pw_conf.c
index 9dff3fe03efa..38df8cd8f50d 100644
--- a/usr.sbin/pw/pw_conf.c
+++ b/usr.sbin/pw/pw_conf.c
@@ -31,9 +31,6 @@ static const char rcsid[] =
   "$FreeBSD$";
 #endif /* not lint */
 
-#include <sys/types.h>
-#include <sys/sbuf.h>
-
 #include <err.h>
 #include <fcntl.h>
 #include <string.h>
@@ -412,9 +409,11 @@ write_userconfig(struct userconf *cnf, const char *file)
 {
 	int             fd;
 	int             i, j;
-	struct sbuf	*buf;
+	FILE           *buffp;
 	FILE           *fp;
 	char		cfgfile[MAXPATHLEN];
+	char           *buf;
+	size_t          sz;
 
 	if (file == NULL) {
 		snprintf(cfgfile, sizeof(cfgfile), "%s/" _PW_CONF,
@@ -429,117 +428,124 @@ write_userconfig(struct userconf *cnf, const char *file)
 		close(fd);
 		return (0);
 	}
-			
-	buf = sbuf_new_auto();
+
+	sz = 0;
+	buf = NULL;
+	buffp = open_memstream(&buf, &sz);
+	if (buffp == NULL)
+		err(EXIT_FAILURE, "open_memstream()");
+
 	for (i = _UC_NONE; i < _UC_FIELDS; i++) {
 		int             quote = 1;
 
-		sbuf_clear(buf);
+		if (buf != NULL)
+			memset(buf, 0, sz);
+		rewind(buffp);
 		switch (i) {
 		case _UC_DEFAULTPWD:
-			sbuf_cat(buf, boolean_str(cnf->default_password));
+			fputs(boolean_str(cnf->default_password), buffp);
 			break;
 		case _UC_REUSEUID:
-			sbuf_cat(buf, boolean_str(cnf->reuse_uids));
+			fputs(boolean_str(cnf->reuse_uids), buffp);
 			break;
 		case _UC_REUSEGID:
-			sbuf_cat(buf, boolean_str(cnf->reuse_gids));
+			fputs(boolean_str(cnf->reuse_gids), buffp);
 			break;
 		case _UC_NISPASSWD:
-			sbuf_cat(buf, cnf->nispasswd ?  cnf->nispasswd : "");
+			fputs(cnf->nispasswd ?  cnf->nispasswd : "", buffp);
 			quote = 0;
 			break;
 		case _UC_DOTDIR:
-			sbuf_cat(buf, cnf->dotdir ?  cnf->dotdir :
-			    boolean_str(0));
+			fputs(cnf->dotdir ?  cnf->dotdir : boolean_str(0),
+			    buffp);
 			break;
 		case _UC_NEWMAIL:
-			sbuf_cat(buf, cnf->newmail ?  cnf->newmail :
-			    boolean_str(0));
+			fputs(cnf->newmail ?  cnf->newmail : boolean_str(0),
+			    buffp);
 			break;
 		case _UC_LOGFILE:
-			sbuf_cat(buf, cnf->logfile ?  cnf->logfile :
-			    boolean_str(0));
+			fputs(cnf->logfile ?  cnf->logfile : boolean_str(0),
+			    buffp);
 			break;
 		case _UC_HOMEROOT:
-			sbuf_cat(buf, cnf->home);
+			fputs(cnf->home, buffp);
 			break;
 		case _UC_HOMEMODE:
-			sbuf_printf(buf, "%04o", cnf->homemode);
+			fprintf(buffp, "%04o", cnf->homemode);
 			quote = 0;
 			break;
 		case _UC_SHELLPATH:
-			sbuf_cat(buf, cnf->shelldir);
+			fputs(cnf->shelldir, buffp);
 			break;
 		case _UC_SHELLS:
 			for (j = 0; j < _UC_MAXSHELLS &&
 			    system_shells[j] != NULL; j++)
-				sbuf_printf(buf, "%s\"%s\"", j ?
+				fprintf(buffp, "%s\"%s\"", j ?
 				    "," : "", system_shells[j]);
 			quote = 0;
 			break;
 		case _UC_DEFAULTSHELL:
-			sbuf_cat(buf, cnf->shell_default ?
-			    cnf->shell_default : bourne_shell);
+			fputs(cnf->shell_default ?  cnf->shell_default :
+			    bourne_shell, buffp);
 			break;
 		case _UC_DEFAULTGROUP:
-			sbuf_cat(buf, cnf->default_group ?
-			    cnf->default_group : "");
+			fputs(cnf->default_group ?  cnf->default_group : "",
+			    buffp);
 			break;
 		case _UC_EXTRAGROUPS:
 			for (j = 0; cnf->groups != NULL &&
 			    j < (int)cnf->groups->sl_cur; j++)
-				sbuf_printf(buf, "%s\"%s\"", j ?
+				fprintf(buffp, "%s\"%s\"", j ?
 				    "," : "", cnf->groups->sl_str[j]);
 			quote = 0;
 			break;
 		case _UC_DEFAULTCLASS:
-			sbuf_cat(buf, cnf->default_class ?
-			    cnf->default_class : "");
+			fputs(cnf->default_class ?  cnf->default_class : "",
+			    buffp);
 			break;
 		case _UC_MINUID:
-			sbuf_printf(buf, "%ju", (uintmax_t)cnf->min_uid);
+			fprintf(buffp, "%ju", (uintmax_t)cnf->min_uid);
 			quote = 0;
 			break;
 		case _UC_MAXUID:
-			sbuf_printf(buf, "%ju", (uintmax_t)cnf->max_uid);
+			fprintf(buffp, "%ju", (uintmax_t)cnf->max_uid);
 			quote = 0;
 			break;
 		case _UC_MINGID:
-			sbuf_printf(buf, "%ju", (uintmax_t)cnf->min_gid);
+			fprintf(buffp, "%ju", (uintmax_t)cnf->min_gid);
 			quote = 0;
 			break;
 		case _UC_MAXGID:
-			sbuf_printf(buf, "%ju", (uintmax_t)cnf->max_gid);
+			fprintf(buffp, "%ju", (uintmax_t)cnf->max_gid);
 			quote = 0;
 			break;
 		case _UC_EXPIRE:
-			sbuf_printf(buf, "%jd", (intmax_t)cnf->expire_days);
+			fprintf(buffp, "%jd", (intmax_t)cnf->expire_days);
 			quote = 0;
 			break;
 		case _UC_PASSWORD:
-			sbuf_printf(buf, "%jd", (intmax_t)cnf->password_days);
+			fprintf(buffp, "%jd", (intmax_t)cnf->password_days);
 			quote = 0;
 			break;
 		case _UC_NONE:
 			break;
 		}
-		sbuf_finish(buf);
+		fflush(buffp);
 
 		if (comments[i])
 			fputs(comments[i], fp);
 
 		if (*kwds[i]) {
 			if (quote)
-				fprintf(fp, "%s = \"%s\"\n", kwds[i],
-				    sbuf_data(buf));
+				fprintf(fp, "%s = \"%s\"\n", kwds[i], buf);
 			else
-				fprintf(fp, "%s = %s\n", kwds[i], sbuf_data(buf));
+				fprintf(fp, "%s = %s\n", kwds[i], buf);
 #if debugging
-			printf("WROTE: %s = %s\n", kwds[i], sbuf_data(buf));
+			printf("WROTE: %s = %s\n", kwds[i], buf);
 #endif
 		}
 	}
-	sbuf_delete(buf);
+	fclose(buffp);
+	free(buf);
 	return (fclose(fp) != EOF);
 }


More information about the dev-commits-src-all mailing list