Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/libexec/ypxfr/ypxfr_getmap.c
34856 views
1
/*-
2
* SPDX-License-Identifier: BSD-4-Clause
3
*
4
* Copyright (c) 1995
5
* Bill Paul <[email protected]>. All rights reserved.
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
* 3. All advertising materials mentioning features or use of this software
16
* must display the following acknowledgement:
17
* This product includes software developed by Bill Paul.
18
* 4. Neither the name of the author nor the names of any co-contributors
19
* may be used to endorse or promote products derived from this software
20
* without specific prior written permission.
21
*
22
* THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
23
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
* ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR CONTRIBUTORS BE LIABLE
26
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32
* SUCH DAMAGE.
33
*/
34
35
#include <sys/cdefs.h>
36
#include <stdio.h>
37
#include <time.h>
38
#include <sys/types.h>
39
#include <rpc/rpc.h>
40
#include <rpc/xdr.h>
41
#include <rpcsvc/yp.h>
42
#include "ypxfr_extern.h"
43
44
extern bool_t xdr_ypresp_all_seq(XDR *, unsigned long *);
45
46
extern int (*ypresp_allfn)();
47
extern void *ypresp_data;
48
extern DB *specdbp;
49
extern enum ypstat yp_errno;
50
51
/*
52
* This is largely the same as yp_all() except we do the transfer
53
* from a specific server without the aid of ypbind(8). We need to
54
* be able to specify the source host explicitly since ypxfr may
55
* only transfer maps from the NIS master server for any given domain.
56
* However, if we use the libc version of yp_all(), we could end up
57
* talking to one of the slaves instead. We do need to dig into libc
58
* a little though, since it contains the magic XDR function we need.
59
*/
60
int
61
ypxfr_get_map(char *map, char *domain, char *host,
62
int (*callback)(int, char *, int, char *, int, char*))
63
{
64
CLIENT *clnt;
65
ypreq_nokey req;
66
unsigned long status;
67
struct timeval timeout;
68
69
timeout.tv_usec = 0;
70
timeout.tv_sec = 10;
71
72
/* YPPROC_ALL is a TCP service */
73
if ((clnt = clnt_create(host, YPPROG, YPVERS, "tcp")) == NULL) {
74
yp_error("%s", clnt_spcreateerror("failed to \
75
create tcp handle"));
76
yp_errno = (enum ypstat)YPXFR_YPERR;
77
return(1);
78
}
79
80
req.domain = domain;
81
req.map = map;
82
ypresp_allfn = callback;
83
ypresp_data = NULL;
84
85
(void)clnt_call(clnt, YPPROC_ALL, (xdrproc_t)xdr_ypreq_nokey, &req,
86
(xdrproc_t)xdr_ypresp_all_seq, &status, timeout);
87
88
clnt_destroy(clnt);
89
90
if (status == YP_NOMORE)
91
return(0);
92
93
if (status != YP_TRUE) {
94
yp_errno = (enum ypstat)YPXFR_YPERR;
95
return(1);
96
}
97
98
return(0);
99
}
100
101