xref: /freebsd/usr.sbin/pw/pw_utils.c (revision d2d022b9fdebd6bfe2983bb688818ed8bfc422a6)
1*d2d022b9SBaptiste Daroussin /*-
2*d2d022b9SBaptiste Daroussin  * Copyright (C) 2015 Baptiste Daroussin <bapt@FreeBSD.org>
3*d2d022b9SBaptiste Daroussin  * All rights reserved.
4*d2d022b9SBaptiste Daroussin  *
5*d2d022b9SBaptiste Daroussin  * Redistribution and use in source and binary forms, with or without
6*d2d022b9SBaptiste Daroussin  * modification, are permitted provided that the following conditions
7*d2d022b9SBaptiste Daroussin  * are met:
8*d2d022b9SBaptiste Daroussin  * 1. Redistributions of source code must retain the above copyright
9*d2d022b9SBaptiste Daroussin  *    notice, this list of conditions and the following disclaimer
10*d2d022b9SBaptiste Daroussin  *    in this position and unchanged.
11*d2d022b9SBaptiste Daroussin  * 2. Redistributions in binary form must reproduce the above copyright
12*d2d022b9SBaptiste Daroussin  *    notice, this list of conditions and the following disclaimer in the
13*d2d022b9SBaptiste Daroussin  *    documentation and/or other materials provided with the distribution.
14*d2d022b9SBaptiste Daroussin  *
15*d2d022b9SBaptiste Daroussin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16*d2d022b9SBaptiste Daroussin  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17*d2d022b9SBaptiste Daroussin  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18*d2d022b9SBaptiste Daroussin  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19*d2d022b9SBaptiste Daroussin  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20*d2d022b9SBaptiste Daroussin  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21*d2d022b9SBaptiste Daroussin  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22*d2d022b9SBaptiste Daroussin  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23*d2d022b9SBaptiste Daroussin  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24*d2d022b9SBaptiste Daroussin  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25*d2d022b9SBaptiste Daroussin  */
26*d2d022b9SBaptiste Daroussin 
27*d2d022b9SBaptiste Daroussin #include <sys/cdefs.h>
28*d2d022b9SBaptiste Daroussin __FBSDID("$FreeBSD$");
29*d2d022b9SBaptiste Daroussin 
30*d2d022b9SBaptiste Daroussin #include <sys/types.h>
31*d2d022b9SBaptiste Daroussin #include <sys/wait.h>
32*d2d022b9SBaptiste Daroussin 
33*d2d022b9SBaptiste Daroussin #include <err.h>
34*d2d022b9SBaptiste Daroussin #include <inttypes.h>
35*d2d022b9SBaptiste Daroussin #include <sysexits.h>
36*d2d022b9SBaptiste Daroussin #include <limits.h>
37*d2d022b9SBaptiste Daroussin #include <stdlib.h>
38*d2d022b9SBaptiste Daroussin 
39*d2d022b9SBaptiste Daroussin #include "pw.h"
40*d2d022b9SBaptiste Daroussin 
41*d2d022b9SBaptiste Daroussin int
42*d2d022b9SBaptiste Daroussin pw_checkfd(char *nptr)
43*d2d022b9SBaptiste Daroussin {
44*d2d022b9SBaptiste Daroussin 	const char *errstr;
45*d2d022b9SBaptiste Daroussin 	int fd = -1;
46*d2d022b9SBaptiste Daroussin 
47*d2d022b9SBaptiste Daroussin 	if (strcmp(nptr, "-") == 0)
48*d2d022b9SBaptiste Daroussin 		return '-';
49*d2d022b9SBaptiste Daroussin 	fd = strtonum(nptr, 0, INT_MAX, &errstr);
50*d2d022b9SBaptiste Daroussin 	if (errstr != NULL)
51*d2d022b9SBaptiste Daroussin 		errx(EX_USAGE, "Bad file descriptor '%s': %s",
52*d2d022b9SBaptiste Daroussin 		    nptr, errstr);
53*d2d022b9SBaptiste Daroussin 	return (fd);
54*d2d022b9SBaptiste Daroussin }
55*d2d022b9SBaptiste Daroussin 
56*d2d022b9SBaptiste Daroussin uintmax_t
57*d2d022b9SBaptiste Daroussin pw_checkid(char *nptr, uintmax_t maxval)
58*d2d022b9SBaptiste Daroussin {
59*d2d022b9SBaptiste Daroussin 	const char *errstr = NULL;
60*d2d022b9SBaptiste Daroussin 	uintmax_t id;
61*d2d022b9SBaptiste Daroussin 
62*d2d022b9SBaptiste Daroussin 	id = strtounum(nptr, 0, maxval, &errstr);
63*d2d022b9SBaptiste Daroussin 	if (errstr)
64*d2d022b9SBaptiste Daroussin 		errx(EX_USAGE, "Bad id '%s': %s", nptr, errstr);
65*d2d022b9SBaptiste Daroussin 	return (id);
66*d2d022b9SBaptiste Daroussin }
67*d2d022b9SBaptiste Daroussin 
68*d2d022b9SBaptiste Daroussin struct userconf *
69*d2d022b9SBaptiste Daroussin get_userconfig(const char *config)
70*d2d022b9SBaptiste Daroussin {
71*d2d022b9SBaptiste Daroussin 	char defaultcfg[MAXPATHLEN];
72*d2d022b9SBaptiste Daroussin 
73*d2d022b9SBaptiste Daroussin 	if (config != NULL)
74*d2d022b9SBaptiste Daroussin 		return (read_userconfig(config));
75*d2d022b9SBaptiste Daroussin 	snprintf(defaultcfg, sizeof(defaultcfg), "%s/pw.conf", conf.etcpath);
76*d2d022b9SBaptiste Daroussin 	return (read_userconfig(defaultcfg));
77*d2d022b9SBaptiste Daroussin }
78*d2d022b9SBaptiste Daroussin 
79*d2d022b9SBaptiste Daroussin int
80*d2d022b9SBaptiste Daroussin nis_update(void) {
81*d2d022b9SBaptiste Daroussin 	pid_t pid;
82*d2d022b9SBaptiste Daroussin 	int i;
83*d2d022b9SBaptiste Daroussin 
84*d2d022b9SBaptiste Daroussin 	fflush(NULL);
85*d2d022b9SBaptiste Daroussin 	if ((pid = fork()) == -1) {
86*d2d022b9SBaptiste Daroussin 		warn("fork()");
87*d2d022b9SBaptiste Daroussin 		return (1);
88*d2d022b9SBaptiste Daroussin 	}
89*d2d022b9SBaptiste Daroussin 	if (pid == 0) {
90*d2d022b9SBaptiste Daroussin 		execlp("/usr/bin/make", "make", "-C", "/var/yp/", (char*) NULL);
91*d2d022b9SBaptiste Daroussin 		_exit(1);
92*d2d022b9SBaptiste Daroussin 	}
93*d2d022b9SBaptiste Daroussin 	waitpid(pid, &i, 0);
94*d2d022b9SBaptiste Daroussin 	if ((i = WEXITSTATUS(i)) != 0)
95*d2d022b9SBaptiste Daroussin 		errx(i, "make exited with status %d", i);
96*d2d022b9SBaptiste Daroussin 	return (i);
97*d2d022b9SBaptiste Daroussin }
98