yp_dbupdate.c revision 114601
1163611Sphk/*
2163611Sphk * Copyright (c) 1996
3163611Sphk *	Bill Paul <wpaul@ctr.columbia.edu>.  All rights reserved.
4163611Sphk *
5163611Sphk * Redistribution and use in source and binary forms, with or without
6163611Sphk * modification, are permitted provided that the following conditions
7163611Sphk * are met:
8163611Sphk * 1. Redistributions of source code must retain the above copyright
9163611Sphk *    notice, this list of conditions and the following disclaimer.
10163611Sphk * 2. Redistributions in binary form must reproduce the above copyright
11163611Sphk *    notice, this list of conditions and the following disclaimer in the
12163611Sphk *    documentation and/or other materials provided with the distribution.
13163611Sphk * 3. All advertising materials mentioning features or use of this software
14163611Sphk *    must display the following acknowledgement:
15163611Sphk *	This product includes software developed by Bill Paul.
16163611Sphk * 4. Neither the name of the author nor the names of any co-contributors
17163611Sphk *    may be used to endorse or promote products derived from this software
18163611Sphk *    without specific prior written permission.
19163611Sphk *
20163611Sphk * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
21163611Sphk * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22163611Sphk * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23163611Sphk * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR CONTRIBUTORS BE LIABLE
24163611Sphk * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25163611Sphk * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26163611Sphk * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27163611Sphk * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28163611Sphk * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29163611Sphk * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30163611Sphk * SUCH DAMAGE.
31163611Sphk */
32163611Sphk
33163611Sphk#include <sys/cdefs.h>
34163611Sphk__FBSDID("$FreeBSD: head/usr.sbin/rpc.ypupdated/yp_dbupdate.c 114601 2003-05-03 21:06:42Z obrien $");
35163611Sphk
36163611Sphk#include <sys/fcntl.h>
37163611Sphk
38163611Sphk#include <stdio.h>
39163611Sphk#include <string.h>
40163611Sphk#include <errno.h>
41163611Sphk#include <limits.h>
42163611Sphk#include <db.h>
43163611Sphk#include <unistd.h>
44163611Sphkstruct dom_binding {};
45163611Sphk#include <rpcsvc/ypclnt.h>
46163611Sphk#include <rpcsvc/ypupdate_prot.h>
47163611Sphk#include "ypxfr_extern.h"
48163611Sphk#include "ypupdated_extern.h"
49163611Sphk
50163611Sphkstatic int
51163646Sphkyp_domake(char *map, char *domain)
52163646Sphk{
53163611Sphk	int pid;
54163611Sphk
55163611Sphk	switch ((pid = fork())) {
56163611Sphk	case 0:
57163611Sphk		execlp(MAP_UPDATE_PATH, MAP_UPDATE, map, domain, (char *)NULL);
58163611Sphk		yp_error("couldn't exec map update process: %s",
59163611Sphk						strerror(errno));
60163611Sphk		exit(1);
61163611Sphk		break;
62163611Sphk	case -1:
63163611Sphk		yp_error("fork() failed: %s", strerror(errno));
64163611Sphk		return(YPERR_YPERR);
65163611Sphk		break;
66163611Sphk	default:
67163611Sphk		children++;
68163611Sphk		break;
69163611Sphk	}
70163611Sphk
71163611Sphk	return(0);
72163611Sphk}
73163611Sphk
74163611Sphkint
75163611Sphkypmap_update(char *netname, char *map, unsigned int op, unsigned int keylen,
76163611Sphk    char *keyval, unsigned int datlen, char *datval)
77163611Sphk{
78163611Sphk	DB *dbp;
79163611Sphk	DBT key = { NULL, 0 }, data = { NULL, 0 };
80163611Sphk	char *yp_last = "YP_LAST_MODIFIED";
81163611Sphk	char yplastbuf[YPMAXRECORD];
82163611Sphk	char *domptr;
83163611Sphk	int rval = 0;
84163611Sphk
85163611Sphk	if ((domptr = strchr(netname, '@')) == NULL)
86163611Sphk		return(ERR_ACCESS);
87163611Sphk	domptr++;
88163611Sphk
89163611Sphk
90163611Sphk	dbp = yp_open_db_rw(domptr, map, O_RDWR);
91163611Sphk	if (dbp == NULL)
92163611Sphk		return(ERR_DBASE);
93163611Sphk
94163611Sphk	key.data = keyval;
95163611Sphk	key.size = keylen;
96163611Sphk	data.data = datval;
97163611Sphk	data.size = datlen;
98163611Sphk
99163611Sphk	switch (op) {
100163611Sphk	case YPOP_DELETE: /* delete this entry */
101163611Sphk		rval = yp_del_record(dbp, &key);
102163611Sphk		if (rval == YP_TRUE)
103163611Sphk			rval = 0;
104163611Sphk		break;
105163611Sphk	case YPOP_INSERT: /* add, do not change */
106163611Sphk		rval = yp_put_record(dbp, &key, &data, 0);
107163611Sphk		if (rval == YP_TRUE)
108163611Sphk			rval = 0;
109163611Sphk		break;
110163611Sphk	case YPOP_STORE: /* add, or change */
111163611Sphk		rval = yp_put_record(dbp, &key, &data, 1);
112163611Sphk		if (rval == YP_TRUE)
113163611Sphk			rval = 0;
114163611Sphk		break;
115163611Sphk	case YPOP_CHANGE: /* change, do not add */
116163611Sphk		if (yp_get_record(domptr, map, &key, &data, 0) != YP_TRUE) {
117163611Sphk			rval = ERR_KEY;
118163611Sphk			break;
119163611Sphk		}
120163611Sphk		rval = yp_put_record(dbp, &key, &data, 1);
121163611Sphk		if (rval == YP_TRUE)
122163611Sphk			rval = 0;
123163611Sphk		break;
124163611Sphk	default:
125163611Sphk		yp_error("unknown update command: (%d)", op);
126163611Sphk	}
127163611Sphk
128163611Sphk	if (rval) {
129163611Sphk		(void)(dbp->close)(dbp);
130163611Sphk		return(rval);
131163611Sphk	}
132163611Sphk
133163611Sphk	snprintf(yplastbuf, sizeof(yplastbuf), "%lu", time(NULL));
134163611Sphk	key.data = yp_last;
135163611Sphk	key.size = strlen(yp_last);
136163611Sphk	data.data = (char *)&yplastbuf;
137163611Sphk	data.size = strlen(yplastbuf);
138209390Sed	if (yp_put_record(dbp, &key, &data, 1) != YP_TRUE) {
139163611Sphk		yp_error("failed to update timestamp in %s/%s", domptr, map);
140163611Sphk		(void)(dbp->close)(dbp);
141163611Sphk		return(ERR_DBASE);
142163611Sphk	}
143163611Sphk
144163646Sphk	(void)(dbp->close)(dbp);
145163646Sphk	return(yp_domake(map, domptr));
146163611Sphk}
147163611Sphk