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 33114601Sobrien#include <sys/cdefs.h> 34114601Sobrien__FBSDID("$FreeBSD$"); 3530378Scharnier 3626236Swpaul#include <sys/fcntl.h> 3726236Swpaul 38228679Sdim#include <stdint.h> 3926236Swpaul#include <stdio.h> 40129658Sstefanf#include <stdlib.h> 4126236Swpaul#include <string.h> 4226236Swpaul#include <errno.h> 4326236Swpaul#include <limits.h> 4426236Swpaul#include <db.h> 4526236Swpaul#include <unistd.h> 4626236Swpaul#include <rpcsvc/ypclnt.h> 4726236Swpaul#include <rpcsvc/ypupdate_prot.h> 4826236Swpaul#include "ypxfr_extern.h" 4926236Swpaul#include "ypupdated_extern.h" 5026236Swpaul 5190298Sdesstatic int 5290298Sdesyp_domake(char *map, char *domain) 5326236Swpaul{ 5426236Swpaul int pid; 5526236Swpaul 5690297Sdes switch ((pid = fork())) { 5726236Swpaul case 0: 5879452Sbrian execlp(MAP_UPDATE_PATH, MAP_UPDATE, map, domain, (char *)NULL); 5926236Swpaul yp_error("couldn't exec map update process: %s", 6026236Swpaul strerror(errno)); 6126236Swpaul exit(1); 6226236Swpaul break; 6326236Swpaul case -1: 6426236Swpaul yp_error("fork() failed: %s", strerror(errno)); 6526236Swpaul return(YPERR_YPERR); 6626236Swpaul break; 6726236Swpaul default: 6826236Swpaul children++; 6926236Swpaul break; 7026236Swpaul } 7126236Swpaul 7226236Swpaul return(0); 7326236Swpaul} 7426236Swpaul 7590298Sdesint 7690298Sdesypmap_update(char *netname, char *map, unsigned int op, unsigned int keylen, 7790298Sdes char *keyval, unsigned int datlen, char *datval) 7826236Swpaul{ 7926236Swpaul DB *dbp; 8026236Swpaul DBT key = { NULL, 0 }, data = { NULL, 0 }; 8126236Swpaul char *yp_last = "YP_LAST_MODIFIED"; 8226236Swpaul char yplastbuf[YPMAXRECORD]; 8326236Swpaul char *domptr; 8426236Swpaul int rval = 0; 8526236Swpaul 8626236Swpaul if ((domptr = strchr(netname, '@')) == NULL) 8726236Swpaul return(ERR_ACCESS); 8826236Swpaul domptr++; 8926236Swpaul 9026236Swpaul 9126236Swpaul dbp = yp_open_db_rw(domptr, map, O_RDWR); 9226236Swpaul if (dbp == NULL) 9326236Swpaul return(ERR_DBASE); 9426236Swpaul 9526236Swpaul key.data = keyval; 9626236Swpaul key.size = keylen; 9726236Swpaul data.data = datval; 9826236Swpaul data.size = datlen; 9926236Swpaul 10090297Sdes switch (op) { 10126236Swpaul case YPOP_DELETE: /* delete this entry */ 10226236Swpaul rval = yp_del_record(dbp, &key); 10326236Swpaul if (rval == YP_TRUE) 10426236Swpaul rval = 0; 10526236Swpaul break; 10626236Swpaul case YPOP_INSERT: /* add, do not change */ 10726236Swpaul rval = yp_put_record(dbp, &key, &data, 0); 10826236Swpaul if (rval == YP_TRUE) 10926236Swpaul rval = 0; 11026236Swpaul break; 11126236Swpaul case YPOP_STORE: /* add, or change */ 11226236Swpaul rval = yp_put_record(dbp, &key, &data, 1); 11326236Swpaul if (rval == YP_TRUE) 11426236Swpaul rval = 0; 11526236Swpaul break; 11626236Swpaul case YPOP_CHANGE: /* change, do not add */ 11726236Swpaul if (yp_get_record(domptr, map, &key, &data, 0) != YP_TRUE) { 11826236Swpaul rval = ERR_KEY; 11926236Swpaul break; 12026236Swpaul } 12126236Swpaul rval = yp_put_record(dbp, &key, &data, 1); 12226236Swpaul if (rval == YP_TRUE) 12326236Swpaul rval = 0; 12426236Swpaul break; 12526236Swpaul default: 12626236Swpaul yp_error("unknown update command: (%d)", op); 12726236Swpaul } 12826236Swpaul 12926236Swpaul if (rval) { 13026236Swpaul (void)(dbp->close)(dbp); 13126236Swpaul return(rval); 13226236Swpaul } 13326236Swpaul 134228680Sdim snprintf(yplastbuf, sizeof(yplastbuf), "%jd", (intmax_t)time(NULL)); 13526236Swpaul key.data = yp_last; 13626236Swpaul key.size = strlen(yp_last); 13726236Swpaul data.data = (char *)&yplastbuf; 13826236Swpaul data.size = strlen(yplastbuf); 13926236Swpaul if (yp_put_record(dbp, &key, &data, 1) != YP_TRUE) { 14026236Swpaul yp_error("failed to update timestamp in %s/%s", domptr, map); 14126236Swpaul (void)(dbp->close)(dbp); 14226236Swpaul return(ERR_DBASE); 14326236Swpaul } 14426236Swpaul 14526236Swpaul (void)(dbp->close)(dbp); 14626236Swpaul return(yp_domake(map, domptr)); 14726236Swpaul} 148