yp_dbupdate.c revision 90298
126236Swpaul/* 226236Swpaul * Copyright (c) 1996 326236Swpaul * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. 426236Swpaul * 526236Swpaul * Redistribution and use in source and binary forms, with or without 626236Swpaul * modification, are permitted provided that the following conditions 726236Swpaul * are met: 826236Swpaul * 1. Redistributions of source code must retain the above copyright 926236Swpaul * notice, this list of conditions and the following disclaimer. 1026236Swpaul * 2. Redistributions in binary form must reproduce the above copyright 1126236Swpaul * notice, this list of conditions and the following disclaimer in the 1226236Swpaul * documentation and/or other materials provided with the distribution. 1326236Swpaul * 3. All advertising materials mentioning features or use of this software 1426236Swpaul * must display the following acknowledgement: 1526236Swpaul * This product includes software developed by Bill Paul. 1626236Swpaul * 4. Neither the name of the author nor the names of any co-contributors 1726236Swpaul * may be used to endorse or promote products derived from this software 1826236Swpaul * without specific prior written permission. 1926236Swpaul * 2026236Swpaul * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND 2126236Swpaul * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2226236Swpaul * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2326236Swpaul * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR CONTRIBUTORS BE LIABLE 2426236Swpaul * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2526236Swpaul * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2626236Swpaul * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2726236Swpaul * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2826236Swpaul * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2926236Swpaul * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3026236Swpaul * SUCH DAMAGE. 3126236Swpaul */ 3226236Swpaul 3330378Scharnier#ifndef lint 3430378Scharnierstatic const char rcsid[] = 3550479Speter "$FreeBSD: head/usr.sbin/rpc.ypupdated/yp_dbupdate.c 90298 2002-02-06 15:26:07Z des $"; 3630378Scharnier#endif /* not lint */ 3730378Scharnier 3826236Swpaul#include <sys/fcntl.h> 3926236Swpaul 4026236Swpaul#include <stdio.h> 4126236Swpaul#include <string.h> 4226236Swpaul#include <errno.h> 4326236Swpaul#include <limits.h> 4426236Swpaul#include <db.h> 4526236Swpaul#include <unistd.h> 4626236Swpaulstruct dom_binding {}; 4726236Swpaul#include <rpcsvc/ypclnt.h> 4826236Swpaul#include <rpcsvc/ypupdate_prot.h> 4926236Swpaul#include "ypxfr_extern.h" 5026236Swpaul#include "ypupdated_extern.h" 5126236Swpaul 5290298Sdesstatic int 5390298Sdesyp_domake(char *map, char *domain) 5426236Swpaul{ 5526236Swpaul int pid; 5626236Swpaul 5790297Sdes switch ((pid = fork())) { 5826236Swpaul case 0: 5979452Sbrian execlp(MAP_UPDATE_PATH, MAP_UPDATE, map, domain, (char *)NULL); 6026236Swpaul yp_error("couldn't exec map update process: %s", 6126236Swpaul strerror(errno)); 6226236Swpaul exit(1); 6326236Swpaul break; 6426236Swpaul case -1: 6526236Swpaul yp_error("fork() failed: %s", strerror(errno)); 6626236Swpaul return(YPERR_YPERR); 6726236Swpaul break; 6826236Swpaul default: 6926236Swpaul children++; 7026236Swpaul break; 7126236Swpaul } 7226236Swpaul 7326236Swpaul return(0); 7426236Swpaul} 7526236Swpaul 7690298Sdesint 7790298Sdesypmap_update(char *netname, char *map, unsigned int op, unsigned int keylen, 7890298Sdes char *keyval, unsigned int datlen, char *datval) 7926236Swpaul{ 8026236Swpaul DB *dbp; 8126236Swpaul DBT key = { NULL, 0 }, data = { NULL, 0 }; 8226236Swpaul char *yp_last = "YP_LAST_MODIFIED"; 8326236Swpaul char yplastbuf[YPMAXRECORD]; 8426236Swpaul char *domptr; 8526236Swpaul int rval = 0; 8626236Swpaul 8726236Swpaul if ((domptr = strchr(netname, '@')) == NULL) 8826236Swpaul return(ERR_ACCESS); 8926236Swpaul domptr++; 9026236Swpaul 9126236Swpaul 9226236Swpaul dbp = yp_open_db_rw(domptr, map, O_RDWR); 9326236Swpaul if (dbp == NULL) 9426236Swpaul return(ERR_DBASE); 9526236Swpaul 9626236Swpaul key.data = keyval; 9726236Swpaul key.size = keylen; 9826236Swpaul data.data = datval; 9926236Swpaul data.size = datlen; 10026236Swpaul 10190297Sdes switch (op) { 10226236Swpaul case YPOP_DELETE: /* delete this entry */ 10326236Swpaul rval = yp_del_record(dbp, &key); 10426236Swpaul if (rval == YP_TRUE) 10526236Swpaul rval = 0; 10626236Swpaul break; 10726236Swpaul case YPOP_INSERT: /* add, do not change */ 10826236Swpaul rval = yp_put_record(dbp, &key, &data, 0); 10926236Swpaul if (rval == YP_TRUE) 11026236Swpaul rval = 0; 11126236Swpaul break; 11226236Swpaul case YPOP_STORE: /* add, or change */ 11326236Swpaul rval = yp_put_record(dbp, &key, &data, 1); 11426236Swpaul if (rval == YP_TRUE) 11526236Swpaul rval = 0; 11626236Swpaul break; 11726236Swpaul case YPOP_CHANGE: /* change, do not add */ 11826236Swpaul if (yp_get_record(domptr, map, &key, &data, 0) != YP_TRUE) { 11926236Swpaul rval = ERR_KEY; 12026236Swpaul break; 12126236Swpaul } 12226236Swpaul rval = yp_put_record(dbp, &key, &data, 1); 12326236Swpaul if (rval == YP_TRUE) 12426236Swpaul rval = 0; 12526236Swpaul break; 12626236Swpaul default: 12726236Swpaul yp_error("unknown update command: (%d)", op); 12826236Swpaul } 12926236Swpaul 13026236Swpaul if (rval) { 13126236Swpaul (void)(dbp->close)(dbp); 13226236Swpaul return(rval); 13326236Swpaul } 13426236Swpaul 13526236Swpaul snprintf(yplastbuf, sizeof(yplastbuf), "%lu", time(NULL)); 13626236Swpaul key.data = yp_last; 13726236Swpaul key.size = strlen(yp_last); 13826236Swpaul data.data = (char *)&yplastbuf; 13926236Swpaul data.size = strlen(yplastbuf); 14026236Swpaul if (yp_put_record(dbp, &key, &data, 1) != YP_TRUE) { 14126236Swpaul yp_error("failed to update timestamp in %s/%s", domptr, map); 14226236Swpaul (void)(dbp->close)(dbp); 14326236Swpaul return(ERR_DBASE); 14426236Swpaul } 14526236Swpaul 14626236Swpaul (void)(dbp->close)(dbp); 14726236Swpaul return(yp_domake(map, domptr)); 14826236Swpaul} 149