ypxfr.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * CDDL HEADER START
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * The contents of this file are subject to the terms of the
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Common Development and Distribution License, Version 1.0 only
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * (the "License"). You may not use this file except in compliance
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * with the License.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * or http://www.opensolaris.org/os/licensing.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * See the License for the specific language governing permissions
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * and limitations under the License.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * When distributing Covered Code, include this CDDL HEADER in each
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * If applicable, add the following below this CDDL HEADER, with the
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * fields enclosed by brackets "[]" replaced with your own identifying
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * information: Portions Copyright [yyyy] [name of copyright owner]
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * CDDL HEADER END
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Use is subject to license terms.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/* All Rights Reserved */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Portions of this source code were derived from Berkeley
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * under license from the Regents of the University of
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * California.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#pragma ident "%Z%%M% %I% %E% SMI"
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * This is a user command which gets a NIS data base from some running
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * server, and gets it to the local site by using the normal NIS client
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * enumeration functions. The map is copied to a temp name, then the real
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * map is removed and the temp map is moved to the real name. ypxfr then
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * sends a "YPPROC_CLEAR" message to the local server to insure that he will
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * not hold a removed map open, so serving an obsolete version.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * ypxfr [ -h <host> ] [ -d <domainname> ]
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * [ -s <domainname> ] [-f] [-c] [-C tid prot name] map
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * If the host is ommitted, ypxfr will attempt to discover the master by
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * using normal NIS services. If it can't get the record, it will use
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * the address of the callback, if specified. If the host is specified
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * as an internet address, no NIS services need to be locally available.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * If the domain is not specified, the default domain of the local machine
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * is used.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * If the -f flag is used, the transfer will be done even if the master's
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * copy is not newer than the local copy.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China * The -c flag suppresses the YPPROC_CLEAR request to the local ypserv. It
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * may be used if ypserv isn't currently running to suppress the error message.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * The -C flag is used to pass callback information to ypxfr when it is
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * activated by ypserv. The callback information is used to send a
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * yppushresp_xfr message with transaction id "tid" to a yppush process
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * speaking a transient protocol number "prot". The yppush program is
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * running on the host "name".
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * The -s option is used to specify a source domain which may be
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * different from the destination domain, for transfer of maps
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * that are identical in different domains (e.g. services.byname)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <ndbm.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#undef NULL
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#define DATUM
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <stdio.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <errno.h>
43439c96b8398c01c375889c79bed72d78fb4c39hx#include <time.h>
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China#include <ctype.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <netdb.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <netconfig.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <netdir.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <rpc/rpc.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/file.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/stat.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <dirent.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <rpcsvc/ypclnt.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <rpcsvc/yp_prot.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <unistd.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <stdlib.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <rpcsvc/nis.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include "ypdefs.h"
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include "yp_b.h"
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include "shim.h"
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include "yptol.h"
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhxUSE_YP_MASTER_NAME
c533a883a71cff9ff32df1c53c31201e1cbf371fhxUSE_YP_SECURE
c533a883a71cff9ff32df1c53c31201e1cbf371fhxUSE_YP_INTERDOMAIN
c533a883a71cff9ff32df1c53c31201e1cbf371fhxUSE_YP_LAST_MODIFIED
c533a883a71cff9ff32df1c53c31201e1cbf371fhxUSE_YPDBPATH
c533a883a71cff9ff32df1c53c31201e1cbf371fhxUSE_DBM
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#define PARANOID 1 /* make sure maps have the right # entries */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#define CALLINTER_TRY 10 /* Seconds between callback tries */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#define CALLTIMEOUT CALLINTER_TRY*6 /* Total timeout for callback */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhxDBM *db;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/* ypxfr never uses N2L mode */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool_t yptol_mode = FALSE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint debug = FALSE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint treepush = FALSE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#define TREEPUSH 1
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint defwrite = TRUE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar *domain = NULL;
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar *source = NULL;
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar *map = NULL;
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar *master = NULL;
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar *pushhost = NULL;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * The name of the xfer peer as specified as a
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * -h option, -C name option or from querying the NIS
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxstruct dom_binding master_server; /* To talk to above */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxunsigned int master_prog_vers; /* YPVERS (barfs at YPOLDVERS !) */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar *master_name = NULL; /* Map's master as contained in the map */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxunsigned *master_version = NULL; /* Order number as contained in the map */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar *master_ascii_version; /* ASCII order number as contained in the map */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool fake_master_version = FALSE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * TRUE only if there's no order number in
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * the map, and the user specified -f
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool force = FALSE; /* TRUE iff user specified -f flag */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool logging = FALSE; /* TRUE iff no tty, but log file exists */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool check_count = FALSE; /* TRUE causes counts to be checked */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool send_clear = TRUE; /* FALSE iff user specified -c flag */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool callback = FALSE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * TRUE iff -C flag set. tid, proto and name
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * will be set to point to the command line args.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool secure_map = FALSE; /* TRUE if there is yp_secure in the map */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool interdomain_map = FALSE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * TRUE if there is yp_interdomain in either
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * the local or the master version of the map
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint interdomain_sz = 0; /* Size of the interdomain value */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#define UDPINTER_TRY 10 /* Seconds between tries for udp */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#define UDPTIMEOUT UDPINTER_TRY*4 /* Total timeout for udp */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#define CALLINTER_TRY 10 /* Seconds between callback tries */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#define CALLTIMEOUT CALLINTER_TRY*6 /* Total timeout for callback */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxstruct timeval udp_timeout = { UDPTIMEOUT, 0};
c533a883a71cff9ff32df1c53c31201e1cbf371fhxstruct timeval tcp_timeout = { 180, 0}; /* Timeout for map enumeration */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar *interdomain_value; /* place to store the interdomain value */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar *tid;
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar *proto;
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint entry_count; /* counts entries in the map */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar logfile[] = "/var/yp/ypxfr.log";
c533a883a71cff9ff32df1c53c31201e1cbf371fhxstatic char err_usage[] =
c533a883a71cff9ff32df1c53c31201e1cbf371fhx"Usage:\n\
c533a883a71cff9ff32df1c53c31201e1cbf371fhxypxfr [-f] [ -h host ] [ -d domainname ]\n\
c533a883a71cff9ff32df1c53c31201e1cbf371fhx [ -s domainname ] [-c] [-C tid prot servname ] map\n\n\
c533a883a71cff9ff32df1c53c31201e1cbf371fhxwhere\n\
c533a883a71cff9ff32df1c53c31201e1cbf371fhx -f forces transfer even if the master's copy is not newer.\n\
c533a883a71cff9ff32df1c53c31201e1cbf371fhx host is the server from where the map should be transfered\n\
c533a883a71cff9ff32df1c53c31201e1cbf371fhx -d domainname is specified if other than the default domain\n\
c533a883a71cff9ff32df1c53c31201e1cbf371fhx -s domainname is a source for the map that is same across domains\n\
c533a883a71cff9ff32df1c53c31201e1cbf371fhx -c inhibits sending a \"Clear map\" message to the local ypserv.\n\
c533a883a71cff9ff32df1c53c31201e1cbf371fhx -C is for use only by ypserv to pass callback information.\n";
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar err_bad_args[] =
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "%s argument is bad.\n";
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar err_cant_get_kname[] =
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "Can't get %s back from system call.\n";
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar err_null_kname[] =
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "%s hasn't been set on this machine.\n";
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar err_bad_hostname[] = "hostname";
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar err_bad_mapname[] = "mapname";
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar err_bad_domainname[] = "domainname";
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar err_udp_failure[] =
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "Can't set up a udp connection to ypserv on host %s.\n";
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar yptempname_prefix[] = "ypxfr_map.";
c533a883a71cff9ff32df1c53c31201e1cbf371fhxchar ypbkupname_prefix[] = "ypxfr_bkup.";
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvoid get_command_line_args();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool bind_to_server();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool ping_server();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool get_private_recs();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool get_order();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool get_v1order();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool get_v2order();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool get_misc_recs();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool get_master_name();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool get_v1master_name();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool get_v2master_name();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvoid find_map_master();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool move_map();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxunsigned get_local_version();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvoid mkfilename();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvoid mk_tmpname();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool get_map();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool add_private_entries();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool new_mapfiles();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvoid del_mapfiles();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvoid set_output();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvoid logprintf();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool send_ypclear();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvoid xfr_exit();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvoid send_callback();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint ypall_callback();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint map_yperr_to_pusherr();
c533a883a71cff9ff32df1c53c31201e1cbf371fhxextern CLIENT *__yp_clnt_create_rsvdport();
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool_t is_yptol_mode();
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing Chinaextern int errno;
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China/*
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China * This is the mainline for the ypxfr process.
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China */
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvoid
c533a883a71cff9ff32df1c53c31201e1cbf371fhxmain(argc, argv)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int argc;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char **argv;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx static char default_domain_name[YPMAXDOMAIN];
c533a883a71cff9ff32df1c53c31201e1cbf371fhx static unsigned big = 0xffffffff;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int status;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx set_output();
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Inter-process lock synchronization structure. Since slave servers
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * get their maps from another NIS server rather than LDAP they can
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * never run in N2L mode. We thus do not have to init the update
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * locking mechanism.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (init_lock_map() == FALSE) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx exit(1);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx get_command_line_args(argc, argv);
43439c96b8398c01c375889c79bed72d78fb4c39hx
43439c96b8398c01c375889c79bed72d78fb4c39hx if (!domain) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!getdomainname(default_domain_name, YPMAXDOMAIN)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx domain = default_domain_name;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(err_cant_get_kname,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx err_bad_domainname);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx xfr_exit(YPPUSH_RSRC);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (strlen(domain) == 0) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(err_null_kname,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx err_bad_domainname);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx xfr_exit(YPPUSH_RSRC);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (!source)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx source = domain;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!master) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx find_map_master();
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * if we were unable to get the master name, either from
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * the -h option or from -C "name" option or from NIS,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * we are doomed !
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!master) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx xfr_exit(YPPUSH_MADDR);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!bind_to_server(master, &master_server,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx &master_prog_vers, &status)) {
43439c96b8398c01c375889c79bed72d78fb4c39hx xfr_exit(status);
43439c96b8398c01c375889c79bed72d78fb4c39hx }
43439c96b8398c01c375889c79bed72d78fb4c39hx
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (!get_private_recs(&status)) {
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China xfr_exit(status);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (!master_version) {
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (force) {
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China master_version = &big;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China fake_master_version = TRUE;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China } else {
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China logprintf(
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China"Can't get order number for map %s from server at %s: use the -f flag.\n",
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China map, master);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China xfr_exit(YPPUSH_FORCE);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (!move_map(&status)) {
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China xfr_exit(status);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (send_clear && !send_ypclear(&status)) {
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China xfr_exit(status);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (logging) {
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China logprintf("Transferred map %s from %s (%d entries).\n",
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China map, master, entry_count);
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China xfr_exit(YPPUSH_SUCC);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China /* NOTREACHED */
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China}
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China/*
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China * This decides whether we're being run interactively or not, and, if not,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * whether we're supposed to be logging or not. If we are logging, it sets
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * up stderr to point to the log file, and sets the "logging"
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * variable. If there's no logging, the output goes in the bit bucket.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Logging output differs from interactive output in the presence of a
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * timestamp, present only in the log file. stderr is reset, too, because it
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * it's used by various library functions, including clnt_perror.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvoid
c533a883a71cff9ff32df1c53c31201e1cbf371fhxset_output()
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (!isatty(1)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (access(logfile, W_OK)) {
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan (void) freopen("/dev/null", "w", stderr);
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan } else {
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan (void) freopen(logfile, "a", stderr);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer logging = TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * This constructs a logging record.
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China */
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing Chinavoid
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing Chinalogprintf(arg1, arg2, arg3, arg4, arg5, arg6, arg7)
6f12def440a1ce798ab128210a43414d173669f0pengcheng chen - Sun Microsystems - Beijing China/*VARARGS*/
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China{
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China struct timeval t;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China
c533a883a71cff9ff32df1c53c31201e1cbf371fhx fseek(stderr, 0, 2);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (logging) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) gettimeofday(&t, NULL);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) fprintf(stderr, "%19.19s: ", ctime(&t.tv_sec));
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) fprintf(stderr, (char *)arg1, arg2, arg3, arg4, arg5,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx arg6, arg7);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx fflush(stderr);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * This does the command line argument processing.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvoid
c533a883a71cff9ff32df1c53c31201e1cbf371fhxget_command_line_args(argc, argv)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int argc;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char **argv;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx argv++;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (argc < 2) {
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China logprintf(err_usage);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx xfr_exit(YPPUSH_BADARGS);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx while (--argc) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if ((*argv)[0] == '-') {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx switch ((*argv)[1]) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case 'f': {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx force = TRUE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx argv++;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case 'D': {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx debug = TRUE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx argv++;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case 'T': {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx treepush = TRUE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx argv++;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case 'P': {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx check_count = TRUE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx argv++;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case 'W': {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx defwrite = FALSE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx argv++;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case 'c': {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx send_clear = FALSE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx argv++;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case 'h': {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (argc > 1) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx argv++;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx argc--;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx master = *argv;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx argv++;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (strlen(master) > 256) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx err_bad_args,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx err_bad_hostname);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx xfr_exit(YPPUSH_BADARGS);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(err_usage);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx xfr_exit(YPPUSH_BADARGS);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'd':
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan if (argc > 1) {
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan argv++;
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan argc--;
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan domain = *argv;
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan argv++;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (strlen(domain) > YPMAXDOMAIN) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx err_bad_args,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx err_bad_domainname);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx xfr_exit(YPPUSH_BADARGS);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(err_usage);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx xfr_exit(YPPUSH_BADARGS);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case 's':
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (argc > 1) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx argv++;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx argc--;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx source = *argv;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx argv++;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (strlen(source) > YPMAXDOMAIN) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx err_bad_args,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx err_bad_domainname);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx xfr_exit(YPPUSH_BADARGS);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(err_usage);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx xfr_exit(YPPUSH_BADARGS);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China break;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China case 'C':
d62cb7fff63265824a8e6725a3bcef698f6134c9hx if (argc > 3) {
d62cb7fff63265824a8e6725a3bcef698f6134c9hx callback = TRUE;
d62cb7fff63265824a8e6725a3bcef698f6134c9hx tid = *(++argv);
d62cb7fff63265824a8e6725a3bcef698f6134c9hx proto = *(++argv);
d62cb7fff63265824a8e6725a3bcef698f6134c9hx pushhost = *(++argv);
d62cb7fff63265824a8e6725a3bcef698f6134c9hx if (strlen(pushhost) > 256) {
d62cb7fff63265824a8e6725a3bcef698f6134c9hx logprintf(err_bad_args, err_bad_hostname);
09539a3c2da6fef054f5306232ef0480de261eabpengcheng chen - Sun Microsystems - Beijing China
09539a3c2da6fef054f5306232ef0480de261eabpengcheng chen - Sun Microsystems - Beijing China xfr_exit(YPPUSH_BADARGS);
09539a3c2da6fef054f5306232ef0480de261eabpengcheng chen - Sun Microsystems - Beijing China }
09539a3c2da6fef054f5306232ef0480de261eabpengcheng chen - Sun Microsystems - Beijing China argc -= 3;
09539a3c2da6fef054f5306232ef0480de261eabpengcheng chen - Sun Microsystems - Beijing China argv++;
d40f4da491abdcae192eb797766f5f44772a832fpengcheng chen - Sun Microsystems - Beijing China } else {
d40f4da491abdcae192eb797766f5f44772a832fpengcheng chen - Sun Microsystems - Beijing China logprintf(err_usage);
d40f4da491abdcae192eb797766f5f44772a832fpengcheng chen - Sun Microsystems - Beijing China xfr_exit(YPPUSH_BADARGS);
d62cb7fff63265824a8e6725a3bcef698f6134c9hx }
d40f4da491abdcae192eb797766f5f44772a832fpengcheng chen - Sun Microsystems - Beijing China break;
d62cb7fff63265824a8e6725a3bcef698f6134c9hx
d40f4da491abdcae192eb797766f5f44772a832fpengcheng chen - Sun Microsystems - Beijing China case 'b': {
d62cb7fff63265824a8e6725a3bcef698f6134c9hx interdomain_map = TRUE;
d62cb7fff63265824a8e6725a3bcef698f6134c9hx interdomain_value = "";
d62cb7fff63265824a8e6725a3bcef698f6134c9hx interdomain_sz = 0;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx argv++;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx default: {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(err_usage);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx xfr_exit(YPPUSH_BADARGS);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!map) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx map = *argv;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx argv++;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (strlen(map) > YPMAXMAP) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(err_bad_args,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx err_bad_mapname);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx xfr_exit(YPPUSH_BADARGS);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(err_usage);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx xfr_exit(YPPUSH_BADARGS);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!map) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(err_usage);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx xfr_exit(YPPUSH_BADARGS);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * This tries to get the master name for the named map, from any
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * server's version, using the vanilla NIS client interface. If we get a
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * name back, the global "master" gets pointed to it.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvoid
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfind_map_master()
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China{
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China int err;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (err = __yp_master_rsvdport(source, map, &master)) {
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China logprintf("Can't get master of %s. Reason: %s.\n", map,
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China yperr_string(err));
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China yp_unbind(source);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China}
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China#ifdef TREEPUSH
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing Chinachk_treepush(name)
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing Chinachar *name;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China{
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China char inmap[256];
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China char inkey[256];
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China int inkeylen;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China char *outval;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China int outvallen;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China int err;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China outval = NULL;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China inkey[0] = 0;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China strcpy(inmap, "ypslaves.");
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China strcat(inmap, name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx gethostname(inkey, 256);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China inkeylen = strlen(inkey);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China err = yp_match(source, inmap, inkey, inkeylen, &outval, &outvallen);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx yp_unbind(source);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China return (err);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China}
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China#endif
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China/*
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China * This sets up a udp connection to speak the correct program and version
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China * to a NIS server. vers is set to YPVERS, doesn't give a damn about
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China * YPOLDVERS.
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China */
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing Chinabool
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbind_to_server(host, pdomb, vers, status)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char *host;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct dom_binding *pdomb;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx unsigned int *vers;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int *status;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (ping_server(host, pdomb, YPVERS, status)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *vers = YPVERS;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (TRUE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * This sets up a UDP channel to a server which is assumed to speak an input
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China * version of YPPROG. The channel is tested by pinging the server. In all
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China * error cases except "Program Version Number Mismatch", the error is
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * reported, and in all error cases, the client handle is destroyed and the
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * socket associated with the channel is closed.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool
c533a883a71cff9ff32df1c53c31201e1cbf371fhxping_server(host, pdomb, vers, status)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char *host;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct dom_binding *pdomb;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx unsigned int vers;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China int *status;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx enum clnt_stat rpc_stat;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if ((pdomb->dom_client = __yp_clnt_create_rsvdport(host, YPPROG, vers,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx 0, 0, 0)) != 0) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * if we are on a c2 system, we should only accept data
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * from a server which is on a reserved port.
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China */
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China /*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * NUKE this for 5.0DR.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * if (issecure() &&
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * (pdomb->dom_server_addr.sin_family != AF_INET ||
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * pdomb->dom_server_addr.sin_port >= IPPORT_RESERVED)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * clnt_destroy(pdomb->dom_client);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * close(pdomb->dom_socket);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * (void) logprintf("bind_to_server: \
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * server is not using a privileged port\n");
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * *status = YPPUSH_YPERR;
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China * return (FALSE);
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China * }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx rpc_stat = clnt_call(pdomb->dom_client, YPBINDPROC_NULL,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx xdr_void, 0, xdr_void, 0, udp_timeout);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (rpc_stat == RPC_SUCCESS) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (TRUE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx clnt_destroy(pdomb->dom_client);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (rpc_stat != RPC_PROGVERSMISMATCH) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) clnt_perror(pdomb->dom_client,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "ypxfr: bind_to_server clnt_call error");
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *status = YPPUSH_RPC;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf("bind_to_server __clnt_create_rsvd error");
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) clnt_pcreateerror("");
c533a883a71cff9ff32df1c53c31201e1cbf371fhx fflush(stderr);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *status = YPPUSH_RPC;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * This gets values for the YP_LAST_MODIFIED and YP_MASTER_NAME keys from the
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * master server's version of the map. Values are held in static variables
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * here. In the success cases, global pointer variables are set to point at
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * the local statics.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool
c533a883a71cff9ff32df1c53c31201e1cbf371fhxget_private_recs(pushstat)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int *pushstat;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx static char anumber[20];
c533a883a71cff9ff32df1c53c31201e1cbf371fhx static unsigned number;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx static char name[YPMAXPEER + 1];
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int status;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China status = 0;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China if (get_order(anumber, &number, &status)) {
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China master_version = &number;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx master_ascii_version = anumber;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (debug) fprintf(stderr,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "ypxfr: Master Version is %s\n", master_ascii_version);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China if (status != 0) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = status;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (debug) fprintf(stderr,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "ypxfr: Couldn't get map's master version number, \
c533a883a71cff9ff32df1c53c31201e1cbf371fhx status was %d\n", status);
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China return (FALSE);
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (get_master_name(name, &status)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx master_name = name;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (debug) fprintf(stderr,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "ypxfr: Maps master is '%s'\n", master_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (status != 0) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = status;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (debug) fprintf(stderr,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "ypxfr: Couldn't get map's master name, status was %d\n",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx status);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx master_name = master;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (debug)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx fprintf(stderr,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "ypxfr: Getting private records from master.\n");
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China if (get_misc_recs(&status)) {
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (debug)
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China fprintf(stderr,
43439c96b8398c01c375889c79bed72d78fb4c39hx "ypxfr: Masters map %s secure and %s an interdomain map.\n",
43439c96b8398c01c375889c79bed72d78fb4c39hx (secure_map) ? "is" : "is not",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (interdomain_map) ? "is" : "is not");
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (status != 0) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = status;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (debug)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx fprintf(stderr,
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China "ypxfr: Couldn't get state of secure and interdomain flags in map.\n");
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (TRUE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * This gets the map's order number from the master server
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing Chinabool
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing Chinaget_order(an, n, pushstat)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char *an;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China unsigned *n;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China int *pushstat;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (master_prog_vers == YPVERS) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (get_v2order(an, n, pushstat));
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China } else
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China return (FALSE);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China}
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing Chinabool
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing Chinaget_v2order(an, n, pushstat)
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China char *an;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx unsigned *n;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int *pushstat;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct ypreq_nokey req;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct ypresp_order resp;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int retval;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx req.domain = source;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China req.map = map;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Get the map''s order number, null-terminate it and store it,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * and convert it to binary and store it again.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx retval = FALSE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if ((enum clnt_stat) clnt_call(master_server.dom_client,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx YPPROC_ORDER, (xdrproc_t)xdr_ypreq_nokey, (char *)&req,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (xdrproc_t)xdr_ypresp_order, (char *)&resp,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx udp_timeout) == RPC_SUCCESS) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (resp.status == YP_TRUE) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx sprintf(an, "%d", resp.ordernum);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *n = resp.ordernum;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx retval = TRUE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else if (resp.status != YP_BADDB) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = ypprot_err(resp.status);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!logging) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "(info) Can't get order number from ypserv at %s. Reason: %s.\n",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx master, yperr_string(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx ypprot_err(resp.status)));
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx CLNT_FREERES(master_server.dom_client,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (xdrproc_t)xdr_ypresp_order,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (char *)&resp);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_RPC;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf("ypxfr(get_v2order) RPC call to %s failed", master);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx clnt_perror(master_server.dom_client, "");
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (retval);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Pick up the state of the YP_SECURE and YP_INTERDOMAIN records from the
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * master. Only works on 4.0 V2 masters that will match a YP_ private key
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * when asked to explicitly.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool
c533a883a71cff9ff32df1c53c31201e1cbf371fhxget_misc_recs(pushstat)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int *pushstat;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct ypreq_key req;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct ypresp_val resp;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int retval;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx req.domain = source;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx req.map = map;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China req.keydat.dptr = yp_secure;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China req.keydat.dsize = yp_secure_sz;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China resp.valdat.dptr = NULL;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx resp.valdat.dsize = 0;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China /*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Get the value of the IS_SECURE key in the map.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx retval = FALSE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (debug)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx fprintf(stderr, "ypxfr: Checking masters secure key.\n");
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if ((enum clnt_stat) clnt_call(master_server.dom_client,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx YPPROC_MATCH, (xdrproc_t)xdr_ypreq_key, (char *)&req,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (xdrproc_t)xdr_ypresp_val, (char *)&resp,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx udp_timeout) == RPC_SUCCESS) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (resp.status == YP_TRUE) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (debug)
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China fprintf(stderr, "ypxfr: SECURE\n");
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China secure_map = TRUE;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China retval = TRUE;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China } else if ((resp.status != YP_NOKEY) &&
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China (resp.status != YP_VERS) &&
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (resp.status != YP_NOMORE)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = ypprot_err(resp.status);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!logging) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "(info) Can't get secure flag from ypserv at %s. Reason: %s.\n",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx master, yperr_string(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx ypprot_err(resp.status)));
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx CLNT_FREERES(master_server.dom_client,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (xdrproc_t)xdr_ypresp_val,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (char *)&resp);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_RPC;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf("ypxfr(get_misc_recs) RPC call to %s failed", master);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx clnt_perror(master_server.dom_client, "");
d62cb7fff63265824a8e6725a3bcef698f6134c9hx }
d62cb7fff63265824a8e6725a3bcef698f6134c9hx
d62cb7fff63265824a8e6725a3bcef698f6134c9hx if (debug)
d62cb7fff63265824a8e6725a3bcef698f6134c9hx fprintf(stderr, "ypxfr: Checking masters INTERDOMAIN key.\n");
d62cb7fff63265824a8e6725a3bcef698f6134c9hx req.keydat.dptr = yp_interdomain;
d62cb7fff63265824a8e6725a3bcef698f6134c9hx req.keydat.dsize = yp_interdomain_sz;
d62cb7fff63265824a8e6725a3bcef698f6134c9hx
d40f4da491abdcae192eb797766f5f44772a832fpengcheng chen - Sun Microsystems - Beijing China resp.valdat.dptr = NULL;
d40f4da491abdcae192eb797766f5f44772a832fpengcheng chen - Sun Microsystems - Beijing China resp.valdat.dsize = 0;
d40f4da491abdcae192eb797766f5f44772a832fpengcheng chen - Sun Microsystems - Beijing China
d40f4da491abdcae192eb797766f5f44772a832fpengcheng chen - Sun Microsystems - Beijing China /*
d62cb7fff63265824a8e6725a3bcef698f6134c9hx * Get the value of the INTERDOMAIN key in the map.
d62cb7fff63265824a8e6725a3bcef698f6134c9hx */
d62cb7fff63265824a8e6725a3bcef698f6134c9hx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if ((enum clnt_stat) clnt_call(master_server.dom_client,
d62cb7fff63265824a8e6725a3bcef698f6134c9hx YPPROC_MATCH, (xdrproc_t)xdr_ypreq_key, (char *)&req,
43439c96b8398c01c375889c79bed72d78fb4c39hx (xdrproc_t)xdr_ypresp_val, (char *)&resp,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx udp_timeout) == RPC_SUCCESS) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (resp.status == YP_TRUE) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (debug)
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China fprintf(stderr, "ypxfr: INTERDOMAIN\n");
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China interdomain_map = TRUE;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China interdomain_value = (char *)malloc(resp.valdat.dsize+1);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China (void) memmove(interdomain_value, resp.valdat.dptr,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx resp.valdat.dsize);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *(interdomain_value+resp.valdat.dsize) = '\0';
c533a883a71cff9ff32df1c53c31201e1cbf371fhx interdomain_sz = resp.valdat.dsize;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx retval = TRUE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else if ((resp.status != YP_NOKEY) &&
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (resp.status != YP_VERS) &&
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (resp.status != YP_NOMORE)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = ypprot_err(resp.status);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!logging) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "(info) Can't get interdomain flag from ypserv at %s. Reason: %s.\n",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx master, yperr_string(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx ypprot_err(resp.status)));
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China CLNT_FREERES(master_server.dom_client,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (xdrproc_t)xdr_ypresp_val,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (char *)&resp);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_RPC;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf("ypxfr(get_misc_recs) RPC call to %s failed", master);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx clnt_perror(master_server.dom_client, "");
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China return (retval);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China}
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China/*
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China * This gets the map's master name from the master server
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool
c533a883a71cff9ff32df1c53c31201e1cbf371fhxget_master_name(name, pushstat)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char *name;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int *pushstat;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (master_prog_vers == YPVERS) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (get_v2master_name(name, pushstat));
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool
c533a883a71cff9ff32df1c53c31201e1cbf371fhxget_v2master_name(name, pushstat)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char *name;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int *pushstat;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China struct ypreq_nokey req;
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China struct ypresp_master resp;
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China int retval;
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China req.domain = source;
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China req.map = map;
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China resp.master = NULL;
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China retval = FALSE;
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China if ((enum clnt_stat) clnt_call(master_server.dom_client,
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China YPPROC_MASTER, (xdrproc_t)xdr_ypreq_nokey, (char *)&req,
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China (xdrproc_t)xdr_ypresp_master, (char *)&resp,
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China udp_timeout) == RPC_SUCCESS) {
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China if (resp.status == YP_TRUE) {
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China strcpy(name, resp.master);
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China retval = TRUE;
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China } else if (resp.status != YP_BADDB) {
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China *pushstat = ypprot_err(resp.status);
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China if (!logging) {
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China logprintf(
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China"(info) Can't get master name from ypserv at %s. Reason: %s.\n",
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China master, yperr_string(
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China ypprot_err(resp.status)));
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China }
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China }
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China CLNT_FREERES(master_server.dom_client,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (xdrproc_t)xdr_ypresp_master,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (char *)&resp);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_RPC;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "ypxfr(get_v2master_name) RPC call to %s failed", master);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx clnt_perror(master_server.dom_client, "");
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (retval);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * This does the work of transferring the map.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool
c533a883a71cff9ff32df1c53c31201e1cbf371fhxmove_map(pushstat)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int *pushstat;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx unsigned local_version;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char map_name[MAXNAMLEN + 1];
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char tmp_name[MAXNAMLEN + 1];
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char bkup_name[MAXNAMLEN + 1];
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char an[11];
c533a883a71cff9ff32df1c53c31201e1cbf371fhx unsigned n;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx datum key;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx datum val;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int hgstatus;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx mkfilename(map_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!force) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx local_version = get_local_version(map_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (debug) fprintf(stderr,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "ypxfr: Local version of map '%s' is %d\n",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx map_name, local_version);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (local_version >= *master_version) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "Map %s at %s is not more recent than local.\n",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx map, master);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_AGE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx mk_tmpname(yptempname_prefix, tmp_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!new_mapfiles(tmp_name)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "Can't create temp map %s.\n", tmp_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_FILE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if ((hgstatus = ypxfrd_getdbm(tmp_name, master, source, map)) < 0)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx"(info) %s %s %s ypxfrd getdbm failed (reason = %d) -- using ypxfr\n",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx master, domain, map, hgstatus);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx db = dbm_open(tmp_name, O_RDWR + O_CREAT + O_TRUNC, 0644);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (db == NULL) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "Can't dbm init temp map %s.\n", tmp_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx del_mapfiles(tmp_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_DBM;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (defwrite) dbm_setdefwrite(db);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!get_map(tmp_name, pushstat)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx del_mapfiles(tmp_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!add_private_entries(tmp_name)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx del_mapfiles(tmp_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_DBM;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Decide whether the map just transferred is a secure map.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * If we already know the local version was secure, we do not
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * need to check this version.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!secure_map) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx key.dptr = yp_secure;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx key.dsize = yp_secure_sz;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx val = dbm_fetch(db, key);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (val.dptr != NULL) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx secure_map = TRUE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (dbm_close_status(db) < 0) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "Can't do dbm close operation on temp map %s.\n",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx tmp_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx del_mapfiles(tmp_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_DBM;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!get_order(an, &n, pushstat)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (n != *master_version) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "Version skew at %s while transferring map %s.\n",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx master, map);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx del_mapfiles(tmp_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_SKEW;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (check_count)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!count_mismatch(tmp_name, entry_count)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx del_mapfiles(tmp_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_DBM;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /* touch up the map */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx db = dbm_open(tmp_name, 2, 0644);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (db == NULL) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "Can't dbm init temp map %s.\n", tmp_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx del_mapfiles(tmp_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_DBM;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!add_private_entries(tmp_name)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx del_mapfiles(tmp_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_DBM;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Decide whether the map just transferred is a secure map.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * If we already know the local version was secure, we do not
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * need to check this version.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!secure_map) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx key.dptr = yp_secure;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx key.dsize = yp_secure_sz;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx val = dbm_fetch(db, key);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (val.dptr != NULL) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx secure_map = TRUE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (dbm_close_status(db) < 0) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "Can't do dbm close operation on temp map %s.\n",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx tmp_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx del_mapfiles(tmp_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_DBM;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (lock_map(map_name) == 0) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx del_mapfiles(tmp_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf("Lock error on %s\n", map_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_FILE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!check_map_existence(map_name)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!rename_map(tmp_name, map_name, secure_map)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx del_mapfiles(tmp_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "Rename error: couldn't mv %s to %s.\n",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx tmp_name, map_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_FILE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx unlock_map(map_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx mk_tmpname(ypbkupname_prefix, bkup_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!rename_map(map_name, bkup_name, secure_map)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) rename_map(bkup_name, map_name, secure_map);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "Rename error: check that old %s is still intact.\n",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx map_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx del_mapfiles(tmp_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_FILE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx unlock_map(map_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (rename_map(tmp_name, map_name, secure_map)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx del_mapfiles(bkup_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx del_mapfiles(tmp_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) rename_map(bkup_name, map_name, secure_map);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "Rename error: check that old %s is still intact.\n",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx map_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_FILE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx unlock_map(map_name);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China if (unlock_map(map_name) == 0)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (TRUE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * This tries to get the order number out of the local version of the map.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * If the attempt fails for any version, the function will return "0"
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxunsigned
c533a883a71cff9ff32df1c53c31201e1cbf371fhxget_local_version(name)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char *name;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx datum key;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx datum val;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char number[11];
c533a883a71cff9ff32df1c53c31201e1cbf371fhx DBM *db;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!check_map_existence(name)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (0);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (debug) fprintf(stderr,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "ypxfr: Map does exist, checking version now.\n");
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if ((db = dbm_open(name, 0, 0)) == 0) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (0);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx key.dptr = yp_last_modified;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx key.dsize = yp_last_modified_sz;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx val = dbm_fetch(db, key);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!val.dptr) { /* Check to see if dptr is NULL */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (0);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (val.dsize == 0 || val.dsize > 10) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (0);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /* Now save this value while we have it available */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) memmove(number, val.dptr, val.dsize);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx number[val.dsize] = '\0';
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Now check to see if it is 'secure'. If we haven't already
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * determined that it is secure in get_private_recs() then we check
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * the local map here.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!secure_map) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx key.dptr = yp_secure;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx key.dsize = yp_secure_sz;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx val = dbm_fetch(db, key);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx secure_map = (val.dptr != NULL);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Now check to see if interdomain requests are made of the local
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * map. Keep the value around if they are.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!interdomain_map) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx key.dptr = yp_interdomain;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx key.dsize = yp_interdomain_sz;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx val = dbm_fetch(db, key);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (interdomain_map = (val.dptr != NULL)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx interdomain_value = (char *)malloc(val.dsize+1);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) memmove(interdomain_value, val.dptr, val.dsize);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *(interdomain_value+val.dsize) = '\0';
c533a883a71cff9ff32df1c53c31201e1cbf371fhx interdomain_sz = val.dsize;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China /* finish up */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) dbm_close_status(db);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return ((unsigned)atoi(number));
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * This constructs a file name for a map, minus its dbm_dir
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * or dbm_pag extensions
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvoid
c533a883a71cff9ff32df1c53c31201e1cbf371fhxmkfilename(ppath)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char *ppath;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx bool_t yptol_mode;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int len;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /* Work out if we are in yptol mode */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx yptol_mode = is_yptol_mode();
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx len = strlen(domain) + strlen(map) + strlen(ypdbpath) + 3;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (yptol_mode)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx len += strlen(NTOL_PREFIX);
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China if (len > (MAXNAMLEN + 1)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf("Map name string too long.\n");
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) strcpy(ppath, ypdbpath);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) strcat(ppath, "/");
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) strcat(ppath, domain);
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China (void) strcat(ppath, "/");
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China if (yptol_mode)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) strcat(ppath, NTOL_PREFIX);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) strcat(ppath, map);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * This returns a temporary name for a map transfer minus its dbm_dir or
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * dbm_pag extensions.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvoid
c533a883a71cff9ff32df1c53c31201e1cbf371fhxmk_tmpname(prefix, xfr_name)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char *prefix;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char *xfr_name;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char xfr_anumber[10];
c533a883a71cff9ff32df1c53c31201e1cbf371fhx long xfr_number;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!xfr_name) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx xfr_number = getpid();
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) sprintf(xfr_anumber, "%d", xfr_number);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) strcpy(xfr_name, ypdbpath);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) strcat(xfr_name, "/");
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) strcat(xfr_name, domain);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) strcat(xfr_name, "/");
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) strcat(xfr_name, prefix);
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China (void) strcat(xfr_name, map);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) strcat(xfr_name, ".");
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) strcat(xfr_name, xfr_anumber);
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * This deletes the .pag and .dir files which implement a map.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Note: No error checking is done here for a garbage input file name or for
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * failed unlink operations.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvoid
c533a883a71cff9ff32df1c53c31201e1cbf371fhxdel_mapfiles(basename)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char *basename;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char dbfilename[MAXNAMLEN + 1];
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!basename) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx strcpy(dbfilename, basename);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx strcat(dbfilename, dbm_pag);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx unlink(dbfilename);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx strcpy(dbfilename, basename);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx strcat(dbfilename, dbm_dir);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx unlink(dbfilename);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * This creates <pname>.dir and <pname>.pag
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool
c533a883a71cff9ff32df1c53c31201e1cbf371fhxnew_mapfiles(pname)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char *pname;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char dbfile[MAXNAMLEN + 1];
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int f;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int len;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!pname || ((len = strlen(pname)) == 0) ||
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (len + 5) > (MAXNAMLEN + 1)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx errno = 0;
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China (void) strcpy(dbfile, pname);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) strcat(dbfile, dbm_dir);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if ((f = open(dbfile, (O_WRONLY | O_CREAT | O_TRUNC), 0600)) >= 0) {
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China (void) close(f);
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China (void) strcpy(dbfile, pname);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) strcat(dbfile, dbm_pag);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if ((f = open(dbfile, (O_WRONLY | O_CREAT | O_TRUNC),
c533a883a71cff9ff32df1c53c31201e1cbf371fhx 0600)) >= 0) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (void) close(f);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (TRUE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhxcount_callback(status)
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China int status;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (status != YP_TRUE) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (status != YP_NOMORE) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "Error from ypserv on %s (ypall_callback) = %s.\n",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx master, yperr_string(ypprot_err(status)));
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (TRUE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx entry_count++;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China * This counts the entries in the dbm file after the transfer to
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * make sure that the dbm file was built correctly.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Returns TRUE if everything is OK, FALSE if they mismatch.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxcount_mismatch(pname, oldcount)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char *pname;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int oldcount;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx datum key;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx DBM *db;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#ifdef REALLY_PARANOID
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China struct ypall_callback cbinfo;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China struct ypreq_nokey allreq;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx enum clnt_stat s;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct dom_binding domb;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx datum value;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#endif /* REALLY_PARANOID */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
ff3124eff995e6cd8ebd8c6543648e0670920034ff entry_count = 0;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx db = dbm_open(pname, 0, 0);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (db) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx for (key = dbm_firstkey(db);
ff3124eff995e6cd8ebd8c6543648e0670920034ff key.dptr != NULL; key = dbm_nextkey(db))
c533a883a71cff9ff32df1c53c31201e1cbf371fhx entry_count++;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx dbm_close_status(db);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (oldcount != entry_count) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "*** Count mismatch in dbm file %s: old=%d, new=%d ***\n",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx map, oldcount, entry_count);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#ifdef REALLY_PARANOID
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if ((domb.dom_client = __yp_clnt_create_rsvdport(master, YPPROG,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx master_prog_vers,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "tcp6", 0, 0)) == 0 &&
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (domb.dom_client = __yp_clnt_create_rsvdport(master, YPPROG,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx master_prog_vers,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "tcp", 0, 0)) == 0) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx clnt_pcreateerror("ypxfr (mismatch) - TCP channel "
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "create failure");
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (master_prog_vers == YPVERS) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int tmpstat;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx allreq.domain = source;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx allreq.map = map;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx cbinfo.foreach = count_callback;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx tmpstat = 0;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx cbinfo.data = (char *)&tmpstat;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China
c533a883a71cff9ff32df1c53c31201e1cbf371fhx entry_count = 0;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx s = clnt_call(domb.dom_client, YPPROC_ALL, xdr_ypreq_nokey,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx &allreq, xdr_ypall, &cbinfo, tcp_timeout);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (tmpstat == 0) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (s == RPC_SUCCESS) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx clnt_perror(domb.dom_client,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "ypxfr (get_map/all) - RPC clnt_call (TCP) failure");
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf("Wrong version number!\n");
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx clnt_destroy(domb.dom_client);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx close(domb.dom_socket);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx entry_count += 2; /* add in YP_entries */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (oldcount != entry_count) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "*** Count mismatch after enumerate %s: old=%d, new=%d ***\n",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx map, oldcount, entry_count);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#endif /* REALLY_PARANOID */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (TRUE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * This sets up a TCP connection to the master server, and either gets
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * ypall_callback to do all the work of writing it to the local dbm file
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * (if the ypserv is current version), or does it itself for an old ypserv.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxbool
c533a883a71cff9ff32df1c53c31201e1cbf371fhxget_map(pname, pushstat)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char *pname;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int *pushstat;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct dom_binding domb;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx enum clnt_stat s;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct ypreq_nokey allreq;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct ypall_callback cbinfo;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx bool retval = FALSE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int tmpstat;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int recvsiz = 24 * 1024;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct netconfig *nconf;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int fd;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct netbuf *svcaddr;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char *netid[] = { "tcp6", "tcp" };
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int i, lastnetid = (sizeof (netid)/sizeof (netid[0])) - 1;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx svcaddr = (struct netbuf *)calloc(1, sizeof (struct netbuf));
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (! svcaddr)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx svcaddr->maxlen = 32;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx svcaddr->len = 32;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx svcaddr->buf = (char *)malloc(32);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (! svcaddr->buf) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx free(svcaddr);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx for (i = 0; i <= lastnetid; i++) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx fd = RPC_ANYFD;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if ((nconf = getnetconfigent(netid[i])) == NULL) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (i != lastnetid)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx continue;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf("ypxfr: tcp transport not supported\n");
c533a883a71cff9ff32df1c53c31201e1cbf371fhx free(svcaddr->buf);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx free(svcaddr);
43439c96b8398c01c375889c79bed72d78fb4c39hx return (FALSE);
43439c96b8398c01c375889c79bed72d78fb4c39hx }
43439c96b8398c01c375889c79bed72d78fb4c39hx if (rpcb_getaddr(YPPROG, master_prog_vers, nconf, svcaddr,
43439c96b8398c01c375889c79bed72d78fb4c39hx master) == FALSE) {
43439c96b8398c01c375889c79bed72d78fb4c39hx freenetconfigent(nconf);
43439c96b8398c01c375889c79bed72d78fb4c39hx if (i != lastnetid)
43439c96b8398c01c375889c79bed72d78fb4c39hx continue;
43439c96b8398c01c375889c79bed72d78fb4c39hx logprintf("ypxfr: could not get %s address\n", master);
43439c96b8398c01c375889c79bed72d78fb4c39hx free(svcaddr->buf);
43439c96b8398c01c375889c79bed72d78fb4c39hx free(svcaddr);
43439c96b8398c01c375889c79bed72d78fb4c39hx return (FALSE);
43439c96b8398c01c375889c79bed72d78fb4c39hx }
43439c96b8398c01c375889c79bed72d78fb4c39hx if ((domb.dom_client = __nis_clnt_create(fd, nconf, 0, svcaddr,
43439c96b8398c01c375889c79bed72d78fb4c39hx 0, YPPROG, master_prog_vers, recvsiz, 0)) == 0) {
43439c96b8398c01c375889c79bed72d78fb4c39hx freenetconfigent(nconf);
43439c96b8398c01c375889c79bed72d78fb4c39hx if (i != lastnetid)
43439c96b8398c01c375889c79bed72d78fb4c39hx continue;
43439c96b8398c01c375889c79bed72d78fb4c39hx clnt_pcreateerror(
43439c96b8398c01c375889c79bed72d78fb4c39hx "ypxfr (get_map) - TCP channel create failure");
43439c96b8398c01c375889c79bed72d78fb4c39hx *pushstat = YPPUSH_RPC;
43439c96b8398c01c375889c79bed72d78fb4c39hx free(svcaddr->buf);
43439c96b8398c01c375889c79bed72d78fb4c39hx free(svcaddr);
43439c96b8398c01c375889c79bed72d78fb4c39hx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx entry_count = 0;
43439c96b8398c01c375889c79bed72d78fb4c39hx if (master_prog_vers == YPVERS) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx allreq.domain = source;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx allreq.map = map;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx cbinfo.foreach = ypall_callback;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx tmpstat = 0;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx cbinfo.data = (char *)&tmpstat;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China s = clnt_call(domb.dom_client, YPPROC_ALL,
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China (xdrproc_t)xdr_ypreq_nokey,
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China (char *)&allreq, (xdrproc_t)xdr_ypall, (char *)&cbinfo,
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China tcp_timeout);
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China if (tmpstat == 0) {
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (s == RPC_SUCCESS) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx retval = TRUE;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China } else {
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China clnt_perror(domb.dom_client,
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China "ypxfr (get_map/all) - RPC clnt_call (TCP) failure");
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China *pushstat = YPPUSH_RPC;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China }
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China } else {
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China *pushstat = tmpstat;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China }
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China } else
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China retval = FALSE; /* barf again at YPOLDVERS */
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing Chinacleanup:
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China clnt_destroy(domb.dom_client);
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China return (retval);
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China}
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China/*
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China * This sticks each key-value pair into the current map. It returns FALSE as
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China * long as it wants to keep getting called back, and TRUE on error conditions
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China * and "No more k-v pairs".
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China */
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing Chinaint
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing Chinaypall_callback(status, key, kl, val, vl, pushstat)
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China int status;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China char *key;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China int kl;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China char *val;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China int vl;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China int *pushstat;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China{
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China datum keydat;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx datum valdat;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx datum test;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China if (status != YP_TRUE) {
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China if (status != YP_NOMORE) {
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China logprintf(
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China "Error from ypserv on %s (ypall_callback) = %s.\n",
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China master, yperr_string(ypprot_err(status)));
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China *pushstat = map_yperr_to_pusherr(status);
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China }
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China return (TRUE);
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China }
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China keydat.dptr = key;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China keydat.dsize = kl;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China valdat.dptr = val;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China valdat.dsize = vl;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China entry_count++;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China/* way too many fetches */
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China#ifdef PARANOID
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China test = dbm_fetch(db, keydat);
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China if (test.dptr != NULL) {
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China logprintf("Duplicate key %s in map %s\n", key, map);
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China *pushstat = YPPUSH_DBM;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China return (TRUE);
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China }
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China#endif /* PARANOID */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (dbm_store(db, keydat, valdat, 0) < 0) {
43439c96b8398c01c375889c79bed72d78fb4c39hx logprintf(
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China "Can't do dbm store into temp map %s.\n", map);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_DBM;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (TRUE);
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China }
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China#ifdef PARANOID
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China test = dbm_fetch(db, keydat);
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China if (test.dptr == NULL) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf("Key %s was not inserted into dbm file %s\n",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx key, map);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *pushstat = YPPUSH_DBM;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (TRUE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#endif /* PARANOID */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (dbm_error(db)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf("Key %s dbm_error raised in file %s\n",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx key, map);
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China *pushstat = YPPUSH_DBM;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China return (TRUE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * This maps a YP_xxxx error code into a YPPUSH_xxxx error code
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China */
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing Chinaint
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing Chinamap_yperr_to_pusherr(yperr)
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China int yperr;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int reason;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx switch (yperr) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case YP_NOMORE:
c533a883a71cff9ff32df1c53c31201e1cbf371fhx reason = YPPUSH_SUCC;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China break;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China case YP_NOMAP:
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China reason = YPPUSH_NOMAP;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China break;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China case YP_NODOM:
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China reason = YPPUSH_NODOM;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China break;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China case YP_NOKEY:
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China reason = YPPUSH_YPERR;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China break;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China case YP_BADARGS:
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China reason = YPPUSH_BADARGS;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China break;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China case YP_BADDB:
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China reason = YPPUSH_YPERR;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China break;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China default:
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China reason = YPPUSH_XFRERR;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China break;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (reason);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China/*
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China * This writes the last-modified and master entries into the new dbm file
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing Chinabool
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing Chinaadd_private_entries(pname)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx char *pname;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China{
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China datum key;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China datum val;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China if (!fake_master_version) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx key.dptr = yp_last_modified;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx key.dsize = yp_last_modified_sz;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx val.dptr = master_ascii_version;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China val.dsize = strlen(master_ascii_version);
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China if (dbm_store(db, key, val, 1) < 0) {
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China logprintf(
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China "Can't do dbm store into temp map %s.\n",
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China pname);
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China return (FALSE);
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China }
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China entry_count++;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China }
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China if (master_name) {
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China key.dptr = yp_master_name;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China key.dsize = yp_master_name_sz;
43439c96b8398c01c375889c79bed72d78fb4c39hx val.dptr = master_name;
43439c96b8398c01c375889c79bed72d78fb4c39hx val.dsize = strlen(master_name);
43439c96b8398c01c375889c79bed72d78fb4c39hx if (dbm_store(db, key, val, 1) < 0) {
43439c96b8398c01c375889c79bed72d78fb4c39hx logprintf(
43439c96b8398c01c375889c79bed72d78fb4c39hx "Can't do dbm store into temp map %s.\n",
43439c96b8398c01c375889c79bed72d78fb4c39hx pname);
43439c96b8398c01c375889c79bed72d78fb4c39hx return (FALSE);
43439c96b8398c01c375889c79bed72d78fb4c39hx }
43439c96b8398c01c375889c79bed72d78fb4c39hx entry_count++;
43439c96b8398c01c375889c79bed72d78fb4c39hx }
43439c96b8398c01c375889c79bed72d78fb4c39hx
43439c96b8398c01c375889c79bed72d78fb4c39hx if (interdomain_map) {
43439c96b8398c01c375889c79bed72d78fb4c39hx key.dptr = yp_interdomain;
43439c96b8398c01c375889c79bed72d78fb4c39hx key.dsize = yp_interdomain_sz;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx val.dptr = interdomain_value;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx val.dsize = interdomain_sz;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (dbm_store(db, key, val, 1) < 0) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "Can't do dbm store into temp map %s.\n",
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China pname);
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China return (FALSE);
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China }
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China entry_count++;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (secure_map) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx key.dptr = yp_secure;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China key.dsize = yp_secure_sz;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China val.dptr = yp_secure;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China val.dsize = yp_secure_sz;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China if (dbm_store(db, key, val, 1) < 0) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx logprintf(
c533a883a71cff9ff32df1c53c31201e1cbf371fhx "Can't do dbm store into temp map %s.\n",
c533a883a71cff9ff32df1c53c31201e1cbf371fhx pname);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (FALSE);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China entry_count++;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China return (TRUE);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China}
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China/*
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China * This sends a YPPROC_CLEAR message to the local ypserv process.
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China */
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing Chinabool
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing Chinasend_ypclear(pushstat)
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China int *pushstat;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China{
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China struct dom_binding domb;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China char local_host_name[256];
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China unsigned int progvers;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China int status;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (gethostname(local_host_name, 256)) {
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China logprintf("Can't get local machine name.\n");
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China *pushstat = YPPUSH_RSRC;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China return (FALSE);
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (!bind_to_server(local_host_name, &domb,
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China &progvers, &status)) {
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China *pushstat = YPPUSH_CLEAR;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China return (FALSE);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if ((enum clnt_stat) clnt_call(domb.dom_client,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx YPPROC_CLEAR, xdr_void, 0, xdr_void, 0,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx udp_timeout) != RPC_SUCCESS) {
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China logprintf(
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China "Can't send ypclear message to ypserv on the local machine.\n");
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China xfr_exit(YPPUSH_CLEAR);
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China }
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China return (TRUE);
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China}
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China/*
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China * This decides if send_callback has to get called, and does the process exit.
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China */
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing Chinavoid
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing Chinaxfr_exit(status)
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China int status;
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China{
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China if (callback) {
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China send_callback(&status);
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China }
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China if (status == YPPUSH_SUCC) {
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China#ifdef TREEPUSH
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China if (treepush) {
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China if (debug)
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China execlp("./yppush", "yppush", "-T", map, 0);
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China execlp("/usr/etc/yp/yppush", "yppush", "-T", map, 0);
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China perror("yppush");
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#endif
c533a883a71cff9ff32df1c53c31201e1cbf371fhx exit(0);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx exit(1);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * This sets up a UDP connection to the yppush process which contacted our
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * parent ypserv, and sends him a status on the requested transfer.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvoid
c533a883a71cff9ff32df1c53c31201e1cbf371fhxsend_callback(status)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int *status;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct yppushresp_xfr resp;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct dom_binding domb;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China resp.transid = (unsigned long) atoi(tid);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China resp.status = (unsigned long) *status;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx udp_timeout.tv_sec = CALLTIMEOUT;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if ((domb.dom_client = __yp_clnt_create_rsvdport(pushhost,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (ulong_t)atoi(proto),
c533a883a71cff9ff32df1c53c31201e1cbf371fhx YPPUSHVERS,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx 0, 0, 0)) == NULL) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *status = YPPUSH_RPC;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China return;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China }
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China if ((enum clnt_stat) clnt_call(domb.dom_client,
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China YPPUSHPROC_XFRRESP, (xdrproc_t)xdr_yppushresp_xfr,
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China (char *)&resp, xdr_void, 0,
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China udp_timeout) != RPC_SUCCESS) {
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China *status = YPPUSH_RPC;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China return;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China }
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China}
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China/*
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China * FUNCTION: is_yptol_mode();
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China *
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China * DESCRIPTION: Determines if we should run in N2L or traditional mode based
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China * on the presence of the N2L mapping file.
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China *
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China * This is a copy of a function from libnisdb. If more than this
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China * one function become required it may be worth linking the
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China * entire lib.
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China *
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China * INPUTS: Nothing
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China *
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China * OUTPUTS: TRUE = Run in N2L mode
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China * FALSE = Run in traditional mode.
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China */
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing Chinabool_t
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing Chinais_yptol_mode()
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China{
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China struct stat filestat;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China if (stat(NTOL_MAP_FILE, &filestat) != -1)
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China return (TRUE);
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China return (FALSE);
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China}
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China