/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* * DESCRIPTION: Contains helper functions for N2L */ /* * Includes. WE WANT TO USE REAL DBM FUNCTIONS SO DO NOT INCLUDE SHIM_HOOKS.H. */ #include <unistd.h> #include <syslog.h> #include <ndbm.h> #include <sys/systeminfo.h> #include <errno.h> #include <strings.h> #include "ypsym.h" #include "ypdefs.h" #include "shim.h" #include "yptol.h" #include "stdio.h" #include "../ldap_util.h" /* Enable standard YP code features defined in ypdefs.h */ USE_YP_PREFIX USE_YP_MASTER_NAME USE_YP_LAST_MODIFIED USE_YP_INPUT_FILE USE_YP_OUTPUT_NAME USE_YP_DOMAIN_NAME USE_YP_SECURE USE_YP_INTERDOMAIN USE_DBM /* * FUNCTION : alloc_temp_names() * * DESCRIPTION: Creates the set of temporary names for update files. It is * the caller responsibility to free these. * * GIVEN : Name of map (fully qualified) * * RETURNS : SUCCESS with all names allocated. * FAILURE with no names allocated. */ suc_code alloc_temp_names(char *name, char **temp_entries, char **temp_ttl) { char *myself = "alloc_temp_names"; *temp_entries = (char *)am(myself, strlen(name) + strlen(TEMP_POSTFIX) + 1); if (NULL == *temp_entries) { return (FAILURE); } *temp_ttl = (char *)am(myself, strlen(TEMP_POSTFIX) + strlen(name) + strlen(TTL_POSTFIX) + 1); if (NULL == *temp_ttl) { sfree(*temp_entries); return (FAILURE); } strcpy(*temp_entries, name); strcat(*temp_entries, TEMP_POSTFIX); strcpy(*temp_ttl, name); strcat(*temp_ttl, TTL_POSTFIX); strcat(*temp_ttl, TEMP_POSTFIX); return (SUCCESS); } /* * FUNCTION : addpair() * * DESCRIPTION: Adds a single string entry to a dbm database. This is a copy of * a function from makedbm but is useful enough to be put into * shared code. * * GIVEN: Database handle * Key * Value * * RETURNS : SUCCESS = Value written * FAILURE = Value not written. */ suc_code addpair(DBM *fdb, char *str1, char *str2) { datum key; datum content; key.dptr = str1; key.dsize = strlen(str1); content.dptr = str2; content.dsize = strlen(str2); errno = 0; if (dbm_store(fdb, key, content, DBM_REPLACE) != 0) { logmsg(MSG_NOTIMECHECK, LOG_ERR, "Problem storing %.*s %.*s " "(errno=%d)", key.dptr, content.dptr, errno); return (FAILURE); } return (SUCCESS); } /* * FUNCTION : dump_datum() * * DESCRIPTION: Prints out a datum as a text string with no line feed. */ void dump_datum(datum *dat) { int i; if (NULL == dat) { printf("NULL datum"); return; } if (NULL == dat->dptr) { printf("NULL dptr"); return; } for (i = 0; i < dat->dsize; i++) putchar(dat->dptr[i]); } /* * FUNCTION : update_timestamp() * * DESCRIPTION: Adds, or updates, a maps last modified timestamp. * * GIVEN : Pointer to an open DBM file. * * RETURNS : SUCCESS = Entry created * FAILURE = Entry not created */ suc_code update_timestamp(DBM *db) { char time_string[MAX_ASCII_ORDER_NUMBER_LENGTH]; struct timeval now; if (0 != gettimeofday(&now, NULL)) { logmsg(MSG_NOTIMECHECK, LOG_ERR, "Could not get time of day"); return (FAILURE); } sprintf(time_string, "%010ld", (long)now.tv_sec); if (SUCCESS != addpair(db, yp_last_modified, time_string)) return (FAILURE); return (SUCCESS); }