yp_dbupdate.c revision 330897
1/*-
2 * SPDX-License-Identifier: BSD-4-Clause
3 *
4 * Copyright (c) 1996
5 *	Bill Paul <wpaul@ctr.columbia.edu>.  All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 *    must display the following acknowledgement:
17 *	This product includes software developed by Bill Paul.
18 * 4. Neither the name of the author nor the names of any co-contributors
19 *    may be used to endorse or promote products derived from this software
20 *    without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 */
34
35#include <sys/cdefs.h>
36__FBSDID("$FreeBSD: stable/11/usr.sbin/rpc.ypupdated/yp_dbupdate.c 330897 2018-03-14 03:19:51Z eadler $");
37
38#include <sys/fcntl.h>
39
40#include <stdint.h>
41#include <stdio.h>
42#include <stdlib.h>
43#include <string.h>
44#include <errno.h>
45#include <limits.h>
46#include <db.h>
47#include <unistd.h>
48#include <rpcsvc/ypclnt.h>
49#include <rpcsvc/ypupdate_prot.h>
50#include "ypxfr_extern.h"
51#include "ypupdated_extern.h"
52
53static int
54yp_domake(char *map, char *domain)
55{
56	int pid;
57
58	switch ((pid = fork())) {
59	case 0:
60		execlp(MAP_UPDATE_PATH, MAP_UPDATE, map, domain, (char *)NULL);
61		yp_error("couldn't exec map update process: %s",
62						strerror(errno));
63		exit(1);
64		break;
65	case -1:
66		yp_error("fork() failed: %s", strerror(errno));
67		return(YPERR_YPERR);
68		break;
69	default:
70		children++;
71		break;
72	}
73
74	return(0);
75}
76
77int
78ypmap_update(char *netname, char *map, unsigned int op, unsigned int keylen,
79    char *keyval, unsigned int datlen, char *datval)
80{
81	DB *dbp;
82	DBT key = { NULL, 0 }, data = { NULL, 0 };
83	char *yp_last = "YP_LAST_MODIFIED";
84	char yplastbuf[YPMAXRECORD];
85	char *domptr;
86	int rval = 0;
87
88	if ((domptr = strchr(netname, '@')) == NULL)
89		return(ERR_ACCESS);
90	domptr++;
91
92
93	dbp = yp_open_db_rw(domptr, map, O_RDWR);
94	if (dbp == NULL)
95		return(ERR_DBASE);
96
97	key.data = keyval;
98	key.size = keylen;
99	data.data = datval;
100	data.size = datlen;
101
102	switch (op) {
103	case YPOP_DELETE: /* delete this entry */
104		rval = yp_del_record(dbp, &key);
105		if (rval == YP_TRUE)
106			rval = 0;
107		break;
108	case YPOP_INSERT: /* add, do not change */
109		rval = yp_put_record(dbp, &key, &data, 0);
110		if (rval == YP_TRUE)
111			rval = 0;
112		break;
113	case YPOP_STORE: /* add, or change */
114		rval = yp_put_record(dbp, &key, &data, 1);
115		if (rval == YP_TRUE)
116			rval = 0;
117		break;
118	case YPOP_CHANGE: /* change, do not add */
119		if (yp_get_record(domptr, map, &key, &data, 0) != YP_TRUE) {
120			rval = ERR_KEY;
121			break;
122		}
123		rval = yp_put_record(dbp, &key, &data, 1);
124		if (rval == YP_TRUE)
125			rval = 0;
126		break;
127	default:
128		yp_error("unknown update command: (%d)", op);
129	}
130
131	if (rval) {
132		(void)(dbp->close)(dbp);
133		return(rval);
134	}
135
136	snprintf(yplastbuf, sizeof(yplastbuf), "%jd", (intmax_t)time(NULL));
137	key.data = yp_last;
138	key.size = strlen(yp_last);
139	data.data = (char *)&yplastbuf;
140	data.size = strlen(yplastbuf);
141	if (yp_put_record(dbp, &key, &data, 1) != YP_TRUE) {
142		yp_error("failed to update timestamp in %s/%s", domptr, map);
143		(void)(dbp->close)(dbp);
144		return(ERR_DBASE);
145	}
146
147	(void)(dbp->close)(dbp);
148	return(yp_domake(map, domptr));
149}
150