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