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