summaryrefslogtreecommitdiffstats
path: root/pw/pw_utils.c
diff options
context:
space:
mode:
authorBaptiste Daroussin <bapt@FreeBSD.org>2015-08-02 12:47:50 +0000
committerBaptiste Daroussin <bapt@FreeBSD.org>2015-08-02 12:47:50 +0000
commit0c4addea3407c6268cd01be51e8d56a804e5b15d (patch)
tree6a632c6d718df3fdad70db4b8a3569a58f595176 /pw/pw_utils.c
parentf1bef959a51e2994216735586c6ef525f2728f10 (diff)
downloadpw-darwin-0c4addea3407c6268cd01be51e8d56a804e5b15d.tar.gz
pw-darwin-0c4addea3407c6268cd01be51e8d56a804e5b15d.tar.zst
pw-darwin-0c4addea3407c6268cd01be51e8d56a804e5b15d.zip
Rewrite parsing subcommands arguments of pw(8)
Now each subcommands checks its arguments in a dedicated functions. This helps improving input validation, code readability/maintainability While here: - Add a -y option to pw userdel/usermod so it can maintain NIS servers if nispasswd is not defined in pw.conf(5) - Allow pw -r <rootdir> to remove directory with userdel -r - Fix bug when renaming a user which was not renaming the user name it groups it is a member of. - Only parse pw.conf(5) when needed.
Diffstat (limited to 'pw/pw_utils.c')
-rw-r--r--pw/pw_utils.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/pw/pw_utils.c b/pw/pw_utils.c
new file mode 100644
index 0000000..31b79c0
--- /dev/null
+++ b/pw/pw_utils.c
@@ -0,0 +1,97 @@
+/*-
+ * Copyright (C) 2015 Baptiste Daroussin <bapt@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer
+ * in this position and unchanged.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include <err.h>
+#include <inttypes.h>
+#include <sysexits.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#include "pw.h"
+
+int
+pw_checkfd(char *nptr)
+{
+ const char *errstr;
+ int fd = -1;
+
+ if (strcmp(nptr, "-") == 0)
+ return '-';
+ fd = strtonum(nptr, 0, INT_MAX, &errstr);
+ if (errstr != NULL)
+ errx(EX_USAGE, "Bad file descriptor '%s': %s",
+ nptr, errstr);
+ return (fd);
+}
+
+uintmax_t
+pw_checkid(char *nptr, uintmax_t maxval)
+{
+ const char *errstr = NULL;
+ uintmax_t id;
+
+ id = strtounum(nptr, 0, maxval, &errstr);
+ if (errstr)
+ errx(EX_USAGE, "Bad id '%s': %s", nptr, errstr);
+ return (id);
+}
+
+struct userconf *
+get_userconfig(const char *config)
+{
+ char defaultcfg[MAXPATHLEN];
+
+ if (config != NULL)
+ return (read_userconfig(config));
+ snprintf(defaultcfg, sizeof(defaultcfg), "%s/pw.conf", conf.etcpath);
+ return (read_userconfig(defaultcfg));
+}
+
+int
+nis_update(void) {
+ pid_t pid;
+ int i;
+
+ fflush(NULL);
+ if ((pid = fork()) == -1) {
+ warn("fork()");
+ return (1);
+ }
+ if (pid == 0) {
+ execlp("/usr/bin/make", "make", "-C", "/var/yp/", (char*) NULL);
+ _exit(1);
+ }
+ waitpid(pid, &i, 0);
+ if ((i = WEXITSTATUS(i)) != 0)
+ errx(i, "make exited with status %d", i);
+ return (i);
+}