From 972cf03ed9ac980bb8a66dbbcce59fd4f2837e82 Mon Sep 17 00:00:00 2001 From: Baptiste Daroussin Date: Wed, 3 Jun 2015 20:48:28 +0000 Subject: [PATCH] Add a pw_mkdb2(3) function which does the same thing as pw_mkdb(3) except it takes a new argument allowing to specify the endianness of the database to generate Differential Revision: https://reviews.freebsd.org/D2730 Reviewed by: ian --- lib/libutil/Makefile | 1 + lib/libutil/libutil.h | 4 ++++ lib/libutil/pw_util.3 | 24 +++++++++++++++++++++++- lib/libutil/pw_util.c | 28 +++++++++++++++++++++++++--- 4 files changed, 53 insertions(+), 4 deletions(-) diff --git a/lib/libutil/Makefile b/lib/libutil/Makefile index 2f68628279b3..22143391c32f 100644 --- a/lib/libutil/Makefile +++ b/lib/libutil/Makefile @@ -78,6 +78,7 @@ MLINKS+=pw_util.3 pw_copy.3 \ pw_util.3 pw_make.3 \ pw_util.3 pw_make_v7.3 \ pw_util.3 pw_mkdb.3 \ + pw_util.3 pw_mkdb2.3 \ pw_util.3 pw_lock.3 \ pw_util.3 pw_scan.3 \ pw_util.3 pw_tempname.3 \ diff --git a/lib/libutil/libutil.h b/lib/libutil/libutil.h index b20ffa291a90..fc32fe7be1ea 100644 --- a/lib/libutil/libutil.h +++ b/lib/libutil/libutil.h @@ -144,6 +144,9 @@ char *fparseln(FILE *_fp, size_t *_len, size_t *_lineno, #endif #ifdef _PWD_H_ +#define PWDB_NATIVE 0 +#define PWDB_LE 1 +#define PWDB_BE 2 int pw_copy(int _ffd, int _tfd, const struct passwd *_pw, struct passwd *_old_pw); struct passwd @@ -155,6 +158,7 @@ int pw_init(const char *_dir, const char *_master); char *pw_make(const struct passwd *_pw); char *pw_make_v7(const struct passwd *_pw); int pw_mkdb(const char *_user); +int pw_mkdb2(const char *_user, int endian); int pw_lock(void); struct passwd * pw_scan(const char *_line, int _flags); diff --git a/lib/libutil/pw_util.3 b/lib/libutil/pw_util.3 index 706368fbffed..73150d5501b2 100644 --- a/lib/libutil/pw_util.3 +++ b/lib/libutil/pw_util.3 @@ -37,6 +37,7 @@ .Nm pw_make , .Nm pw_make_v7 , .Nm pw_mkdb , +.Nm pw_mkdb2 , .Nm pw_lock , .Nm pw_scan , .Nm pw_tempname , @@ -66,6 +67,8 @@ .Ft int .Fn pw_mkdb "const char *user" .Ft int +.Fn pw_mkdb "const char *user" "int endian" +.Ft int .Fn pw_lock "void" .Ft "struct passwd *" .Fn pw_scan "const char *line" "int flags" @@ -225,11 +228,30 @@ function regenerates the password database by running .Xr pwd_mkdb 8 . If .Fa user -only the record corresponding to that user will be updated. +is set, only the record corresponding to that user will be updated. The .Fn pw_mkdb function returns 0 in case of success and -1 in case of failure. .Pp +.Fn pw_mkdb2 +function regenerates the password database by running +.Xr pwd_mkdb 8 . +If +.Fa user +is set, only the record corresponding to that user will be updated. +.Pp +The +.Fa endian +variable can take the following values +.Bl -tag -width PWDB_NATIVE +.It Dv PWDB_NATIVE +the database will be generated in host native endianness. +.It Dv PWDB_LE +the database will be generated in Little-endian. +.It Dv PWDB_BE +the database will be generated in Big-endian. +.El +.Pp The .Fn pw_lock function locks the master password file. diff --git a/lib/libutil/pw_util.c b/lib/libutil/pw_util.c index befd1fb02d70..b0bdad15daba 100644 --- a/lib/libutil/pw_util.c +++ b/lib/libutil/pw_util.c @@ -242,14 +242,36 @@ pw_tmp(int mfd) return (tfd); } +int +pw_mkdb(const char *user) +{ + + return (pw_mkdb2(user, PWDB_NATIVE)); +} + /* * Regenerate the password database. */ int -pw_mkdb(const char *user) +pw_mkdb2(const char *user, int endian) { int pstat; pid_t pid; + const char *arg; + + switch (endian) { + case PWDB_NATIVE: + arg = "-p"; + break; + case PWDB_LE: + arg = "-pL"; + break; + case PWDB_BE: + arg = "-pB"; + break; + default: + return (-1); + } (void)fflush(stderr); switch ((pid = fork())) { @@ -258,10 +280,10 @@ pw_mkdb(const char *user) case 0: /* child */ if (user == NULL) - execl(_PATH_PWD_MKDB, "pwd_mkdb", "-p", + execl(_PATH_PWD_MKDB, "pwd_mkdb", arg, "-d", passwd_dir, tempname, (char *)NULL); else - execl(_PATH_PWD_MKDB, "pwd_mkdb", "-p", + execl(_PATH_PWD_MKDB, "pwd_mkdb", arg, "-d", passwd_dir, "-u", user, tempname, (char *)NULL); _exit(1);