socsvn commit: r240004 - in soc2012/exxo/freebsd-head:
include/rpcsvc usr.bin/ypwhich usr.sbin/ypbind
exxo at FreeBSD.org
exxo at FreeBSD.org
Thu Aug 2 01:21:01 UTC 2012
Author: exxo
Date: Thu Aug 2 01:20:58 2012
New Revision: 240004
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=240004
Log:
ypbind/ypwhich updated, adding yp_utils
Added:
soc2012/exxo/freebsd-head/include/rpcsvc/yp_utils.h
Modified:
soc2012/exxo/freebsd-head/include/rpcsvc/yp.x
soc2012/exxo/freebsd-head/include/rpcsvc/yp_prot.h
soc2012/exxo/freebsd-head/usr.bin/ypwhich/Makefile
soc2012/exxo/freebsd-head/usr.bin/ypwhich/ypwhich.c
soc2012/exxo/freebsd-head/usr.sbin/ypbind/Makefile
soc2012/exxo/freebsd-head/usr.sbin/ypbind/yp_ping.c
soc2012/exxo/freebsd-head/usr.sbin/ypbind/yp_ping.h
soc2012/exxo/freebsd-head/usr.sbin/ypbind/ypbind.c
Modified: soc2012/exxo/freebsd-head/include/rpcsvc/yp.x
==============================================================================
--- soc2012/exxo/freebsd-head/include/rpcsvc/yp.x Thu Aug 2 00:00:34 2012 (r240003)
+++ soc2012/exxo/freebsd-head/include/rpcsvc/yp.x Thu Aug 2 01:20:58 2012 (r240004)
@@ -223,8 +223,6 @@
ypbind_binding ypsetdom_binding;
unsigned ypsetdom_vers;
};
-%#define ypsetdom_addr ypsetdom_binding.ypbind_binding_addr
-%#define ypsetdom_port ypsetdom_binding.ypbind_binding_port
/* Backward compatibility for YPBIND protocol version 2 */
#ifdef YPBIND_COMPAT_V2
@@ -249,17 +247,8 @@
unsigned ypsetdom_vers;
};
-%#define yprespv2_error ypbind_resp_v2_u.ypbind_error
-%#define yprespv2_addr ypbind_resp_v2_u.ypbind_bindinfo.ypbind_binding_addr
-%#define yprespv2_port ypbind_resp_v2_u.ypbind_bindinfo.ypbind_binding_port
-
#endif
-%#define ypresp_error ypbind_resp_u.ypbind_error
-%#define ypresp_family ypbind_resp_u.ypbind_bindinfo.ypbind_binding_family
-%#define ypresp_addr ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr
-%#define ypresp_port ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port
-
/*
* NIS v1 support for backwards compatibility
*/
Modified: soc2012/exxo/freebsd-head/include/rpcsvc/yp_prot.h
==============================================================================
--- soc2012/exxo/freebsd-head/include/rpcsvc/yp_prot.h Thu Aug 2 00:00:34 2012 (r240003)
+++ soc2012/exxo/freebsd-head/include/rpcsvc/yp_prot.h Thu Aug 2 01:20:58 2012 (r240004)
@@ -296,17 +296,8 @@
u_int ypsetdom_vers;
};
-#define yprespv2_error ypbind_resp_v2_u.ypbind_error
-#define yprespv2_addr ypbind_resp_v2_u.ypbind_bindinfo.ypbind_binding_addr
-#define yprespv2_port ypbind_resp_v2_u.ypbind_bindinfo.ypbind_binding_port
-
#endif
-#define ypresp_error ypbind_resp_u.ypbind_error
-#define ypresp_family ypbind_resp_u.ypbind_bindinfo.ypbind_binding_family
-#define ypresp_addr ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr
-#define ypresp_port ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port
-
/*
* YPPUSH PROTOCOL:
*
Added: soc2012/exxo/freebsd-head/include/rpcsvc/yp_utils.h
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2012/exxo/freebsd-head/include/rpcsvc/yp_utils.h Thu Aug 2 01:20:58 2012 (r240004)
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) TODO
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: soc2012/exxo/freebsd-head/include/rpcsvc/yp_prot.h 239957 2012-07-31 16:20:04Z exxo $
+ */
+
+#ifndef _RPCSVC_YP_UTILS_H_
+#define _RPCSVC_YP_UTILS_H_
+
+/* YPBIND facilities
+ *
+ * This file should be included after <rpcsvc/yp_prot.h> or <rpcsvc/yp.h>
+ * It provides facilities to deal with YPBIND protocols
+ */
+
+#define ypresp_status ypbind_status
+#define ypsetdom_family ypsetdom_binding.ypbind_binding_family
+
+#ifdef _RPCSVC_YP_PROT_H_ /* if used with yp_prot.h */
+
+# define ypresp_family ypbind_respbody.ypbind_bindinfo.ypbind_binding_family
+# define ypresp_error ypbind_respbody.ypbind_error
+# define ypresp_addr ypbind_respbody.ypbind_bindinfo.ypbind_binding_addr
+# define ypresp_port ypbind_respbody.ypbind_bindinfo.ypbind_binding_port
+
+#elif defined(_YP_H_RPCGEN) /* if used with yp.h */
+
+# define ypsetdom_addr ypsetdom_binding.ypbind_binding_addr
+# define ypsetdom_port ypsetdom_binding.ypbind_binding_port
+
+# define ypresp_family ypbind_resp_u.ypbind_bindinfo.ypbind_binding_family
+# define ypresp_error ypbind_resp_u.ypbind_error
+# define ypresp_addr ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr
+# define ypresp_port ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port
+# define ypresp_error_v2 ypbind_resp_v2_u.ypbind_error
+# define ypresp_addr_v2 ypbind_resp_v2_u.ypbind_bindinfo.ypbind_binding_addr
+# define ypresp_port_v2 ypbind_resp_v2_u.ypbind_bindinfo.ypbind_binding_port
+
+#endif
+
+union ypbf_resp {
+ struct {
+ enum ypbind_resptype status;
+ u_int error;
+ } header;
+ struct ypbind_resp resp;
+#ifdef YPBIND_COMPAT_V2
+ struct ypbind_resp_v2 resp2;
+#endif
+};
+#define ypbf_rstatus header.status
+#define ypbf_rerror header.error
+#define ypbf_rfamily resp.ypresp_family
+#define ypbf_raddr resp.ypresp_addr
+#define ypbf_rport resp.ypresp_port
+#ifdef YPBIND_COMPAT_V2
+# ifdef _RPCSVC_YP_PROT_H_ /* yp_prot.h */
+# define ypbf_raddr_v2 resp2.ypresp_addr
+# define ypbf_rport_v2 resp2.ypresp_port
+# elif defined(_YP_H_RPCGEN) /* yp.h */
+# define ypbf_raddr_v2 resp2.ypresp_addr_v2
+# define ypbf_rport_v2 resp2.ypresp_port_v2
+# endif
+#endif
+
+union ypbf_setdom {
+ char ypsetdom_domain[YPMAXDOMAIN + 1];
+ struct ypbind_setdom setdom;
+#ifdef YPBIND_COMPAT_V2
+ struct ypbind_setdom_v2 setdom2;
+#endif
+};
+#define ypbf_sdomain ypsetdom_domain
+#define ypbf_sfamily setdom.ypsetdom_family
+#define ypbf_saddr setdom.ypsetdom_addr
+#define ypbf_sport setdom.ypsetdom_port
+#define ypbf_svers setdom.ypsetdom_vers
+#ifdef YPBIND_COMPAT_V2
+# define ypbf_saddr_v2 setdom2.ypsetdom_addr
+# define ypbf_sport_v2 setdom2.ypsetdom_port
+# define ypbf_svers_v2 setdom2.ypsetdom_vers
+#endif
+
+#endif /* _RPCSVC_YP_UTILS_H_ */
Modified: soc2012/exxo/freebsd-head/usr.bin/ypwhich/Makefile
==============================================================================
--- soc2012/exxo/freebsd-head/usr.bin/ypwhich/Makefile Thu Aug 2 00:00:34 2012 (r240003)
+++ soc2012/exxo/freebsd-head/usr.bin/ypwhich/Makefile Thu Aug 2 01:20:58 2012 (r240004)
@@ -7,8 +7,9 @@
WARNS?= 2
+CFLAGS += -DYPBIND_COMPAT_V2
.if ${MK_INET6_SUPPORT} != "no"
-CFLAGS+= -DINET6 -DYPBIND_COMPAT_V2
+CFLAGS += -DINET6
.endif
.include <bsd.prog.mk>
Modified: soc2012/exxo/freebsd-head/usr.bin/ypwhich/ypwhich.c
==============================================================================
--- soc2012/exxo/freebsd-head/usr.bin/ypwhich/ypwhich.c Thu Aug 2 00:00:34 2012 (r240003)
+++ soc2012/exxo/freebsd-head/usr.bin/ypwhich/ypwhich.c Thu Aug 2 01:20:58 2012 (r240004)
@@ -37,6 +37,7 @@
#include <rpc/rpc.h>
#include <rpc/xdr.h>
#include <rpcsvc/yp_prot.h>
+#include <rpcsvc/yp_utils.h>
#include <rpcsvc/ypclnt.h>
#include <netinet/in.h>
@@ -83,24 +84,6 @@
exit(ERR_USAGE);
}
-union ypb_resp {
- struct {
- enum ypbind_resptype status;
- u_int error;
- } header;
- struct ypbind_resp resp;
-#ifdef YPBIND_COMPAT_V2
- struct ypbind_resp_v2 resp2;
-#endif
-};
-#define ypb_status header.status
-#define ypb_error header.error
-#define ypb_family resp.ypbind_respbody.ypbind_bindinfo.ypbind_binding_family
-#define ypb_addr resp.ypbind_respbody.ypbind_bindinfo.ypbind_binding_addr
-#ifdef YPBIND_COMPAT_V2
-# define ypb_addr_v2 resp2.ypbind_respbody.ypbind_bindinfo.ypbind_binding_addr
-#endif
-
#ifdef INET6
# define ADDRSTRLEN INET6_ADDRSTRLEN
#else
@@ -108,7 +91,7 @@
#endif
static void
-print_addr(const union ypb_resp *ypbr, int version)
+print_addr(const union ypbf_resp *ypbr, int version)
{
struct hostent *hent = NULL;
char str[ADDRSTRLEN];
@@ -125,19 +108,19 @@
if (version == YPBINDVERS_2) {
family = AF_INET;
len = sizeof(ss_addr.in);
- bcopy(&ypbr->ypb_addr_v2, &ss_addr, len);
+ bcopy(&ypbr->ypbf_raddr_v2, &ss_addr, len);
}
else /* YPBINDVERS */
#endif
{
- family = ypbr->ypb_family;
+ family = ypbr->ypbf_rfamily;
#ifdef INET6
if (family == AF_INET6)
len = sizeof(ss_addr.in6);
else /* AF_INET */
#endif
len = sizeof(ss_addr.in);
- bcopy(&ypbr->ypb_addr, &ss_addr, len);
+ bcopy(&ypbr->ypbf_raddr, &ss_addr, len);
}
hent = gethostbyaddr((char *)&ss_addr, len, family);
if (hent)
@@ -152,7 +135,7 @@
static int
bind_host(char *dom, const char *host)
{
- union ypb_resp ypbr;
+ union ypbf_resp ypbr;
struct timeval tv;
CLIENT *client;
int r;
@@ -186,9 +169,9 @@
clnt_destroy(client);
return (YPERR_YPBIND);
} else {
- if (ypbr.ypb_status != YPBIND_SUCC_VAL) {
+ if (ypbr.ypbf_rstatus != YPBIND_SUCC_VAL) {
warnx("can't yp_bind: reason: %s",
- ypbinderr_string(ypbr.ypb_error));
+ ypbinderr_string(ypbr.ypbf_rerror));
clnt_destroy(client);
return (r);
}
Modified: soc2012/exxo/freebsd-head/usr.sbin/ypbind/Makefile
==============================================================================
--- soc2012/exxo/freebsd-head/usr.sbin/ypbind/Makefile Thu Aug 2 00:00:34 2012 (r240003)
+++ soc2012/exxo/freebsd-head/usr.sbin/ypbind/Makefile Thu Aug 2 01:20:58 2012 (r240004)
@@ -1,11 +1,16 @@
# from: @(#)Makefile 5.8 (Berkeley) 7/28/90
# $FreeBSD$
+.include <bsd.own.mk>
+
PROG= ypbind
MAN= ypbind.8
SRCS= ypbind.c yp_ping.c
-CFLAGS+= -DDAEMON
+CFLAGS += -DDAEMON -DYPBIND_COMPAT_V2
+.if ${MK_INET6_SUPPORT} != "no"
+CFLAGS += -DINET6
+.endif
WARNS?= 2
Modified: soc2012/exxo/freebsd-head/usr.sbin/ypbind/yp_ping.c
==============================================================================
--- soc2012/exxo/freebsd-head/usr.sbin/ypbind/yp_ping.c Thu Aug 2 00:00:34 2012 (r240003)
+++ soc2012/exxo/freebsd-head/usr.sbin/ypbind/yp_ping.c Thu Aug 2 01:20:58 2012 (r240004)
@@ -275,36 +275,36 @@
static int
rpc_init(struct transport *tsp)
{
- static timeval timenull;
+ static struct timeval timenull;
int async = TRUE;
int dontblock = 1;
int validtransp = 0;
int i;
for (i = 0; i < TSP_LEN; ++i) {
- if (tsp[i]->any == NULL)
+ if (tsp[i].any == NULL)
continue;
#ifdef INET6
if (i == V6) {
- tsp[i]->sock = socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP);
- tsp[i]->addr.len = sizeof(struct sockaddr_in6);
+ tsp[i].sock = socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP);
+ tsp[i].addr.len = sizeof(struct sockaddr_in6);
}
else /* V4 */
#endif
{
- tsp[i]->sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
- tsp[i]->addr.len = sizeof(struct sockaddr_in);
+ tsp[i].sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ tsp[i].addr.len = sizeof(struct sockaddr_in);
}
- if (tsp[i]->sock < 0)
+ if (tsp[i].sock < 0)
return (1);
- tsp[i]->addr.buf = tsp[i]->any;
- tsp[i]->clnt = clnt_dg_create(tsp[i]->sock, &tsp[i]->addr, YPPROG, YPVERS, 0, 0);
- if (tsp[i]->clnt == NULL)
+ tsp[i].addr.buf = tsp[i].any;
+ tsp[i].clnt = clnt_dg_create(tsp[i].sock, &tsp[i].addr, YPPROG, YPVERS, 0, 0);
+ if (tsp[i].clnt == NULL)
return (1);
- tsp[i]->clnt->cl_auth = authsys_create_default();
- clnt_control(tsp[i]->clnt, CLSET_TIMEOUT, (char *)&timenull);
- clnt_control(tsp[i]->clnt, CLSET_ASYNC, (char *)&async);
- ioctl(tsp[i]->sock, FIONBIO, &dontblock);
+ tsp[i].clnt->cl_auth = authsys_create_default();
+ clnt_control(tsp[i].clnt, CLSET_TIMEOUT, (char *)&timenull);
+ clnt_control(tsp[i].clnt, CLSET_ASYNC, (char *)&async);
+ ioctl(tsp[i].sock, FIONBIO, &dontblock);
++validtransp;
}
return (!validtransp);
@@ -316,16 +316,16 @@
int i;
for (i = 0; i < TSP_LEN; ++i) {
- if (tsp[i]->clnt) {
- auth_destroy(tsp[i]->clnt->cl_auth);
- clnt_destroy(tsp[i]->clnt);
- tsp[i]->clnt = NULL;
- }
- tsp[i]->xid_lookup = 0;
- tsp[i]->any = NULL;
- close(tsp[i]->sock);
- tsp[i]->sock = -1;
- tsp[i]->addr.buf = NULL;
+ if (tsp[i].clnt) {
+ auth_destroy(tsp[i].clnt->cl_auth);
+ clnt_destroy(tsp[i].clnt);
+ tsp[i].clnt = NULL;
+ }
+ tsp[i].xid_lookup = 0;
+ tsp[i].any = NULL;
+ close(tsp[i].sock);
+ tsp[i].sock = -1;
+ tsp[i].addr.buf = NULL;
}
}
Modified: soc2012/exxo/freebsd-head/usr.sbin/ypbind/yp_ping.h
==============================================================================
--- soc2012/exxo/freebsd-head/usr.sbin/ypbind/yp_ping.h Thu Aug 2 00:00:34 2012 (r240003)
+++ soc2012/exxo/freebsd-head/usr.sbin/ypbind/yp_ping.h Thu Aug 2 01:20:58 2012 (r240004)
@@ -14,8 +14,8 @@
#define ss_family(x) (((struct sockaddr *) x)->sa_family)
#define ss_to_sinaddr(x) ((char *) &((struct sockaddr_in *) x)->sin_addr)
#define ss_to_sin6addr(x) ((char *) &((struct sockaddr_in6 *) x)->sin6_addr)
-#define ss_to_sinport(x) ((u_short) ((struct sockaddr_in *) x)->sin_port)
-#define ss_to_sin6port(x) ((u_short) ((struct sockaddr_in6 *) x)->sin6_port)
+#define ss_to_sinport(x) (((struct sockaddr_in *) x)->sin_port)
+#define ss_to_sin6port(x) (((struct sockaddr_in6 *) x)->sin6_port)
static inline int
ss_extract(const struct sockaddr_storage *ss, int *family, char **addr, size_t *len)
Modified: soc2012/exxo/freebsd-head/usr.sbin/ypbind/ypbind.c
==============================================================================
--- soc2012/exxo/freebsd-head/usr.sbin/ypbind/ypbind.c Thu Aug 2 00:00:34 2012 (r240003)
+++ soc2012/exxo/freebsd-head/usr.sbin/ypbind/ypbind.c Thu Aug 2 01:20:58 2012 (r240004)
@@ -57,11 +57,13 @@
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
+#include <stdarg.h>
#include <rpc/pmap_clnt.h>
#include <rpc/pmap_prot.h>
#include <rpc/pmap_rmt.h>
#include <rpc/rpc_com.h>
#include <rpcsvc/yp.h>
+#include <rpcsvc/yp_utils.h>
#include <rpcsvc/ypclnt.h>
#include "yp_ping.h"
@@ -80,7 +82,7 @@
struct _dom_binding {
struct _dom_binding *dom_pnext;
char dom_domain[YPMAXDOMAIN + 1];
- struct sockaddr_storage dom_server_addr; /* TODO */
+ struct sockaddr_storage dom_server_addr;
long int dom_vers;
int dom_lockfd;
#ifdef YPBIND_COMPAT_V2
@@ -96,22 +98,26 @@
#define WRITEFD ypdb->dom_pipe_fds[1]
#define BROADFD broad_domain->dom_pipe_fds[1]
-extern bool_t xdr_domainname(), xdr_ypbind_resp();
+extern bool_t xdr_domainname();
extern bool_t xdr_ypreq_key(), xdr_ypresp_val();
-extern bool_t xdr_ypbind_setdom();
+extern bool_t xdr_ypbind_setdom(), xdr_ypbind_setdom_v2();
+extern bool_t xdr_ypbind_resp(), xdr_ypbind_resp_v2();
+void *ypbindproc_null(SVCXPRT *, void *, const rpcvers_t);
+void *ypbindproc_setdom(SVCXPRT *, const union ypbf_setdom *, const rpcvers_t);
+char *ypbindproc_domain(SVCXPRT *, domainname *, const rpcvers_t);
+void ypbindprog(struct svc_req *, register SVCXPRT *);
+void reaper(int);
+void terminate(int);
void checkwork(void);
-void *ypbindproc_null_2_yp(SVCXPRT *, void *, CLIENT *);
-void *ypbindproc_setdom_2_yp(SVCXPRT *, struct ypbind_setdom *, CLIENT *);
-void rpc_received(char *, struct sockaddr_in *, int);
+void handle_children(struct _dom_binding *);
+int tell_parent(char *, const struct sockaddr_storage *);
+bool_t broadcast_result(bool_t *, const struct netbuf *, const struct netconfig *);
void broadcast(struct _dom_binding *);
int ping(struct _dom_binding *);
-int tell_parent(char *, struct sockaddr_in *);
-void handle_children(struct _dom_binding *);
-void reaper(int);
-void terminate(int);
+void rpc_received(char *, const struct sockaddr_storage *, int);
+int verify(const struct sockaddr_storage *);
void yp_restricted_mode(char *);
-int verify(struct in_addr);
char *domain_name;
struct _dom_binding *ypbindlist;
@@ -155,38 +161,166 @@
#define MAX_RETRIES 30
#endif
-#define CLOSE_LKS 1
-#define FREE_DOMB 2
-
int retries = 0;
int children = 0;
int domains = 0;
int yplockfd;
fd_set fdsr;
+#define CLOSE_LKS 1
+#define FREE_DOMB 2
+
+static int
+create_domb_file(const struct _dom_binding *ypdb, const char *binding_dir)
+{
+ char path[MAXPATHLEN];
+ int fd;
+
+ sprintf(path, "%s/%s.%ld", binding_dir,
+ ypdb->dom_domain, ypdb->dom_vers);
+#ifdef O_SHLOCK
+ if ((fd = open(path, O_CREAT|O_SHLOCK|O_RDWR|O_TRUNC, 0644)) == -1) {
+ (void)mkdir(binding_dir, 0755);
+ if ((fd = open(path, O_CREAT|O_SHLOCK|O_RDWR|O_TRUNC, 0644)) == -1)
+ return (-1);
+ }
+#else
+ if ((fd = open(path, O_CREAT|O_RDWR|O_TRUNC, 0644)) == -1) {
+ (void)mkdir(binding_dir, 0755);
+ if ((fd = open(path, O_CREAT|O_RDWR|O_TRUNC, 0644)) == -1)
+ return (-1);
+ }
+ flock(fd, LOCK_SH);
+#endif
+ return (fd);
+}
+
+static void
+register_domb(struct _dom_binding *ypdb, const struct sockaddr_storage *addr)
+{
+ struct iovec iov[2];
+ struct ypbind_resp ybr;
+ int family;
+ u_short port;
+
+ if (ypdb->dom_lockfd != -1)
+ close(ypdb->dom_lockfd);
+
+ ypdb->dom_lockfd = create_domb_file(ypdb, BINDINGDIR);
+ if (ypdb->dom_lockfd == -1)
+ return;
+
+ port = __rpcb_getport("127.0.0.1", CONNLESS_TSP, YPBINDPROG, YPBINDVERS);
+ iov[0].iov_base = (char *)&port;
+ iov[0].iov_len = sizeof(port);
+ iov[1].iov_base = (char *)&ybr;
+ iov[1].iov_len = sizeof(ybr);
+
+ family = ss_family(addr);
+ bzero(&ybr, sizeof(ybr));
+ ybr.ypresp_status = YPBIND_SUCC_VAL;
+ ybr.ypresp_family = family;
+ *(u_short *)&ybr.ypresp_port = *ss_getport(addr);
+#ifdef INET6
+ if (family == AF_INET6)
+ bcopy(ss_to_sin6addr(addr), (char *) ybr.ypresp_addr, sizeof(struct in6_addr));
+ else
+#endif
+ bcopy(ss_to_sinaddr(addr), (char *) ybr.ypresp_addr, sizeof(struct in_addr));
+
+ if (writev(ypdb->dom_lockfd, iov, 2) != iov[0].iov_len + iov[1].iov_len) {
+ syslog(LOG_WARNING, "write: %m");
+ close(ypdb->dom_lockfd);
+ ypdb->dom_lockfd = -1;
+ }
+}
+
+#ifdef YPBIND_COMPAT_V2
+static void
+register_domb_v2(struct _dom_binding *ypdb, const struct sockaddr_storage *addr)
+{
+ struct iovec iov[2];
+ struct ypbind_resp_v2 ybr;
+ int family;
+ u_short port;
+
+ if (ypdb->dom_lockfd_v2 != -1)
+ close(ypdb->dom_lockfd_v2);
+
+ ypdb->dom_lockfd_v2 = create_domb_file(ypdb, BINDINGDIR_V2);
+ if (ypdb->dom_lockfd_v2 == -1)
+ return;
+
+ port = __rpcb_getport("127.0.0.1", CONNLESS_TSP, YPBINDPROG, YPBINDVERS_2);
+ iov[0].iov_base = (char *)&port;
+ iov[0].iov_len = sizeof(port);
+ iov[1].iov_base = (char *)&ybr;
+ iov[1].iov_len = sizeof(ybr);
+
+ family = ss_family(addr);
+ bzero(&ybr, sizeof(ybr));
+ if (family != AF_INET) { /* AF_INET6 is not supported in version 2 */
+ ybr.ypresp_status = YPBIND_FAIL_VAL;
+ ybr.ypresp_error_v2 = YPBIND_ERR_FAMILY;
+ }
+ else {
+ ybr.ypresp_status = YPBIND_SUCC_VAL;
+ bcopy(ss_to_sinaddr(addr), (char *) ybr.ypresp_addr_v2, sizeof(struct in_addr));
+ *(u_short *)&ybr.ypresp_port_v2 = ss_to_sinport(addr);
+ }
+
+ if (writev(ypdb->dom_lockfd_v2, iov, 2) != iov[0].iov_len + iov[1].iov_len) {
+ syslog(LOG_WARNING, "write: %m");
+ close(ypdb->dom_lockfd_v2);
+ ypdb->dom_lockfd_v2 = -1;
+ }
+}
+#endif
+
+static void
+unregister_domb(struct _dom_binding *ypdb, unsigned char mode)
+{
+ char path[MAXPATHLEN];
+
+ sprintf(path, "%s/%s.%ld", BINDINGDIR,
+ ypdb->dom_domain, YPVERS);
+ if ( (mode & CLOSE_LKS))
+ close(ypdb->dom_lockfd);
+ unlink(path);
+#ifdef YPBIND_COMPAT_V2
+ sprintf(path, "%s/%s.%ld", BINDINGDIR_V2,
+ ypdb->dom_domain, YPVERS);
+ if ( (mode & CLOSE_LKS))
+ close(ypdb->dom_lockfd_v2);
+ unlink(path);
+#endif
+ if ( (mode & FREE_DOMB)) {
+ free(ypdb);
+ domains--;
+ }
+}
+
void *
-ypbindproc_null_2_yp(SVCXPRT *transp, void *argp, CLIENT *clnt)
+ypbindproc_null(SVCXPRT *transp, void *argp, const rpcvers_t version)
{
- static char res;
+ static const char res;
- bzero(&res, sizeof(res));
- return &res;
+ return ((void *) &res);
}
-struct ypbind_resp *
-ypbindproc_domain_2_yp(SVCXPRT *transp, domainname *argp, CLIENT *clnt)
+char *
+ypbindproc_domain(SVCXPRT *transp, domainname *argp, const rpcvers_t version)
{
- static struct ypbind_resp res;
+ static union ypbf_resp res;
struct _dom_binding *ypdb;
+ int family;
- bzero(&res, sizeof res);
- res.ypbind_status = YPBIND_FAIL_VAL;
- res.ypbind_resp_u.ypbind_error = YPBIND_ERR_NOSERV;
+ res.ypbf_rstatus = YPBIND_FAIL_VAL;
+ res.ypbf_rerror = YPBIND_ERR_NOSERV;
if (strchr(*argp, '/')) {
- syslog(LOG_WARNING, "Domain name '%s' has embedded slash -- \
-rejecting.", *argp);
- return(&res);
+ syslog(LOG_WARNING, "Domain name '%s' has embedded slash -- rejecting.", *argp);
+ return((char *) &res);
}
for (ypdb = ypbindlist; ypdb; ypdb = ypdb->dom_pnext) {
@@ -197,20 +331,19 @@
if (ypdb == NULL) {
if (yp_restricted) {
syslog(LOG_NOTICE, "Running in restricted mode -- request to bind domain \"%s\" rejected.\n", *argp);
- return (&res);
+ return ((char *) &res);
}
if (domains >= MAX_DOMAINS) {
- syslog(LOG_WARNING, "domain limit (%d) exceeded",
- MAX_DOMAINS);
- res.ypbind_resp_u.ypbind_error = YPBIND_ERR_RESC;
- return (&res);
+ syslog(LOG_WARNING, "domain limit (%d) exceeded", MAX_DOMAINS);
+ res.ypbf_rerror = YPBIND_ERR_RESC;
+ return ((char *) &res);
}
ypdb = (struct _dom_binding *)malloc(sizeof *ypdb);
if (ypdb == NULL) {
syslog(LOG_WARNING, "malloc: %m");
- res.ypbind_resp_u.ypbind_error = YPBIND_ERR_RESC;
- return (&res);
+ res.ypbf_rerror = YPBIND_ERR_RESC;
+ return ((char *) &res);
}
bzero(ypdb, sizeof *ypdb);
strncpy(ypdb->dom_domain, *argp, sizeof ypdb->dom_domain);
@@ -227,111 +360,186 @@
domains++;
}
- if (ping(ypdb)) {
- return (&res);
- }
+ if (ping(ypdb))
+ return ((char *) &res);
- res.ypbind_status = YPBIND_SUCC_VAL;
- res.ypbind_resp_u.ypbind_error = 0; /* Success */
- *(u_int32_t *)&res.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr =
- ypdb->dom_server_addr.sin_addr.s_addr;
- *(u_short *)&res.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port =
- ypdb->dom_server_addr.sin_port;
- /*printf("domain %s at %s/%d\n", ypdb->dom_domain,
- inet_ntoa(ypdb->dom_server_addr.sin_addr),
- ntohs(ypdb->dom_server_addr.sin_port));*/
- return (&res);
+ res.ypbf_rstatus = YPBIND_SUCC_VAL;
+ res.ypbf_rerror = 0; /* Success */
+ family = ss_family(&ypdb->dom_server_addr);
+#ifdef YPBIND_COMPAT_V2
+ if (version == YPBINDVERS_2) {
+ if (family != AF_INET) { /* AF_INET6 is not supported in version 2 */
+ res.ypbf_rstatus = YPBIND_FAIL_VAL;
+ res.ypbf_rerror = YPBIND_ERR_FAMILY;
+ }
+ else {
+ bcopy(ss_to_sinaddr(&ypdb->dom_server_addr), (char *) res.ypbf_raddr_v2, sizeof(struct in_addr));
+ *(u_short *)&res.ypbf_rport_v2 = ss_to_sinport(&ypdb->dom_server_addr);
+ }
+ }
+ else
+#endif
+ {
+ res.ypbf_rfamily = family;
+ *(u_short *)&res.ypbf_rport = *ss_getport(&ypdb->dom_server_addr);
+#ifdef INET6
+ if (family == AF_INET6)
+ bcopy(ss_to_sin6addr(&ypdb->dom_server_addr), (char *) res.ypbf_raddr, sizeof(struct in6_addr));
+ else
+#endif
+ bcopy(ss_to_sinaddr(&ypdb->dom_server_addr), (char *) res.ypbf_raddr, sizeof(struct in_addr));
+ }
+ return ((char *) &res);
}
-void *
-ypbindproc_setdom_2_yp(SVCXPRT *transp, ypbind_setdom *argp, CLIENT *clnt)
+static int
+is_loopback(const char *buf, size_t len)
{
- struct sockaddr_in *fromsin, bindsin;
- static char *result = NULL;
+ int ret = 0;
- if (strchr(argp->ypsetdom_domain, '/')) {
- syslog(LOG_WARNING, "Domain name '%s' has embedded slash -- \
-rejecting.", argp->ypsetdom_domain);
- return(NULL);
- }
- fromsin = svc_getcaller(transp);
-
- switch (ypsetmode) {
- case YPSET_LOCAL:
- if (fromsin->sin_addr.s_addr != htonl(INADDR_LOOPBACK)) {
- svcerr_noprog(transp);
- return(NULL);
- }
+ switch (len) {
+ case sizeof(struct sockaddr_in) :
+ if (((struct sockaddr_in *) buf)->sin_addr.s_addr == htonl(INADDR_LOOPBACK))
+ ret = 1;
break;
- case YPSET_ALL:
+#ifdef INET6
+ case sizeof(struct sockaddr_in6) :
+ if (IN6_IS_ADDR_LOOPBACK(&((struct sockaddr_in6 *) buf)->sin6_addr))
+ ret = 1;
break;
- case YPSET_NO:
- default:
- svcerr_noprog(transp);
- return(NULL);
+#endif
+ default :
+ ret = -1;
}
+ return (ret);
+}
- if (ntohs(fromsin->sin_port) >= IPPORT_RESERVED) {
- svcerr_noprog(transp);
- return(NULL);
- }
+void *
+ypbindproc_setdom(SVCXPRT *transp, const union ypbf_setdom *argp, const rpcvers_t version)
+{
+ struct sockaddr_storage bindaddr;
+ static char *result = NULL;
+ struct netbuf *addr;
+ int r;
- if (argp->ypsetdom_vers != YPVERS) {
- svcerr_noprog(transp);
- return(NULL);
+ struct sockaddr_in * const sin = (struct sockaddr_in *) &bindaddr;
+#ifdef INET6
+ struct sockaddr_in6 * const sin6 = (struct sockaddr_in6 *) &bindaddr;
+#endif
+
+ if (strchr(argp->ypbf_sdomain, '/')) {
+ syslog(LOG_WARNING, "Domain name '%s' has embedded slash -- rejecting.", argp->ypbf_sdomain);
+ return (NULL);
+ }
+ addr = svc_getrpccaller(transp);
+ r = is_loopback(addr->buf, addr->len);
+ if (r < 0) {
+ syslog(LOG_WARNING, "Query from an unsupported address -- rejecting.");
+ return (NULL);
}
+ if ((ypsetmode == YPSET_LOCAL && r == 0) || ypsetmode != YPSET_ALL)
+ goto err;
+
+ /* It's ok to consider addr.buf as a sockaddr_storage structure
+ * ss_* macros never deal with its real representation */
+ if (ntohs(*ss_getport(addr->buf)) >= IPPORT_RESERVED)
+ goto err;
- bzero(&bindsin, sizeof bindsin);
- bindsin.sin_family = AF_INET;
- bindsin.sin_addr.s_addr = *(u_int32_t *)argp->ypsetdom_binding.ypbind_binding_addr;
- bindsin.sin_port = *(u_short *)argp->ypsetdom_binding.ypbind_binding_port;
- rpc_received(argp->ypsetdom_domain, &bindsin, 1);
+ bzero(&bindaddr, sizeof(bindaddr));
+#ifdef YPBIND_COMPAT_V2
+ if (version == YPBINDVERS_2) {
+ if (argp->ypbf_svers_v2 != YPVERS)
+ goto err;
+
+ sin->sin_family = AF_INET;
+ sin->sin_len = sizeof(struct sockaddr_in);
+ bcopy(argp->ypbf_saddr_v2, &sin->sin_addr, sizeof(struct in_addr));
+ sin->sin_port = *(u_short *)&argp->ypbf_sport_v2;
+ }
+ else
+#endif
+ {
+ if (argp->ypbf_svers != YPVERS)
+ goto err;
+
+ switch (argp->ypbf_sfamily) {
+ case AF_INET :
+ sin->sin_family = AF_INET;
+ sin->sin_len = sizeof(struct sockaddr_in);
+ bcopy(argp->ypbf_saddr, &sin->sin_addr, sizeof(struct in_addr));
+ sin->sin_port = *(u_short *)&argp->ypbf_sport;
+ break;
+#ifdef INET6
+ case AF_INET6 :
+ sin6->sin6_family = AF_INET6;
+ sin6->sin6_len = sizeof(struct sockaddr_in6);
+ bcopy(argp->ypbf_saddr, &sin6->sin6_addr, sizeof(struct in6_addr));
+ sin6->sin6_port = *(u_short *)&argp->ypbf_sport;
+ break;
+#endif
+ default :
+ syslog(LOG_WARNING, "Request an unsupported family -- rejecting.");
+ return (NULL);
+ }
+ }
+ rpc_received((char *) argp->ypbf_sdomain, &bindaddr, 1);
return((void *) &result);
+
+err:
+ svcerr_noprog(transp);
+ return (NULL);
}
void
-ypbindprog_2(struct svc_req *rqstp, register SVCXPRT *transp)
+ypbindprog(struct svc_req *rqstp, register SVCXPRT *transp)
{
+ typedef char *(*funcptr)();
union {
- domainname ypbindproc_domain_2_arg;
- struct ypbind_setdom ypbindproc_setdom_2_arg;
+ domainname domain;
+ union ypbf_setdom setdom_arg;
} argument;
- struct authunix_parms *creds;
+ struct authsys_parms *creds;
char *result;
+ const rpcvers_t version = rqstp->rq_vers;
bool_t (*xdr_argument)(), (*xdr_result)();
- char *(*local)();
+ funcptr local;
switch (rqstp->rq_proc) {
case YPBINDPROC_NULL:
xdr_argument = xdr_void;
xdr_result = xdr_void;
- local = (char *(*)()) ypbindproc_null_2_yp;
+ local = (funcptr) ypbindproc_null;
break;
case YPBINDPROC_DOMAIN:
xdr_argument = xdr_domainname;
- xdr_result = xdr_ypbind_resp;
- local = (char *(*)()) ypbindproc_domain_2_yp;
+ if (version == YPBINDVERS_2)
+ xdr_result = xdr_ypbind_resp_v2;
+ else
+ xdr_result = xdr_ypbind_resp;
+ local = (funcptr) ypbindproc_domain;
break;
case YPBINDPROC_SETDOM:
switch (rqstp->rq_cred.oa_flavor) {
- case AUTH_UNIX:
- creds = (struct authunix_parms *)rqstp->rq_clntcred;
+ case AUTH_SYS:
+ creds = (struct authsys_parms *) rqstp->rq_clntcred;
if (creds->aup_uid != 0) {
svcerr_auth(transp, AUTH_BADCRED);
return;
}
break;
default:
- svcerr_auth(transp, AUTH_TOOWEAK);
+ svcerr_weakauth(transp);
return;
}
-
- xdr_argument = xdr_ypbind_setdom;
+ if (version == YPBINDVERS_2)
+ xdr_argument = xdr_ypbind_setdom_v2;
+ else
+ xdr_argument = xdr_ypbind_setdom;
xdr_result = xdr_void;
- local = (char *(*)()) ypbindproc_setdom_2_yp;
+ local = (funcptr) ypbindproc_setdom;
break;
default:
@@ -343,7 +551,7 @@
svcerr_decode(transp);
return;
}
- result = (*local)(transp, &argument, rqstp);
+ result = (*local)(transp, &argument, version);
if (result != NULL &&
!svc_sendreply(transp, (xdrproc_t)xdr_result, result)) {
svcerr_systemerr(transp);
@@ -402,136 +610,6 @@
va_end(args);
}
-static int
-create_domb_file(const struct _dom_binding *ypdb, const char *binding_dir)
-{
- char path[MAXPATHLEN];
- int fd;
-
- sprintf(path, "%s/%s.%ld", binding_dir,
- ypdb->dom_domain, ypdb->dom_vers);
-#ifdef O_SHLOCK
- if ((fd = open(path, O_CREAT|O_SHLOCK|O_RDWR|O_TRUNC, 0644)) == -1) {
- (void)mkdir(binding_dir, 0755);
- if ((fd = open(path, O_CREAT|O_SHLOCK|O_RDWR|O_TRUNC, 0644)) == -1)
- return (-1);
- }
-#else
- if ((fd = open(path, O_CREAT|O_RDWR|O_TRUNC, 0644)) == -1) {
- (void)mkdir(binding_dir, 0755);
- if ((fd = open(path, O_CREAT|O_RDWR|O_TRUNC, 0644)) == -1)
- return (-1);
- }
- flock(fd, LOCK_SH);
-#endif
- return (fd);
-}
-
-static void
-register_domb(struct _dom_binding *ypdb, const struct sockaddr_storage *addr)
-{
- struct iovec iov[2];
- struct ypbind_resp ybr;
- int family;
- u_short port;
-
- if (ypdb->dom_lockfd != -1)
- close(ypdb->dom_lockfd);
-
- ypdb->dom_lockfd = create_domb_file(ypdb, BINDINGDIR);
- if (ypdb->dom_lockfd == -1)
- return;
-
- port = __rpcb_getport("127.0.0.1", CONNLESS_TSP, YPBINDPROG, YPBINDVERS);
- iov[0].iov_base = (char *)&port
- iov[0].iov_len = sizeof(port);
- iov[1].iov_base = (char *)&ybr;
- iov[1].iov_len = sizeof(ybr);
-
- family = ss_family(addr);
- bzero(&ybr, sizeof(ybr));
- ybr.ypbind_status = YPBIND_SUCC_VAL;
- ybr.ypresp_family = family;
- *(u_short *)&ybr.ypresp_port = *ss_getport(addr);
-#ifdef INET6
- if (family == AF_INET6)
- bcopy(ss_to_sin6addr(addr), (char *) ybr.ypresp_addr, sizeof(struct in6_addr));
- else
-#endif
- bcopy(ss_to_sinaddr(addr), (char *) ybr.ypresp_addr, sizeof(struct in_addr));
-
- if (writev(ypdb->dom_lockfd, iov, 2) != iov[0].iov_len + iov[1].iov_len) {
- syslog(LOG_WARNING, "write: %m");
- close(ypdb->dom_lockfd);
- ypdb->dom_lockfd = -1;
- }
-}
-
-#ifdef YPBIND_COMPAT_V2
-static void
-register_domb_v2(struct _dom_binding *ypdb, const struct sockaddr_storage *addr)
-{
- struct iovec iov[2];
- struct ypbind_resp_v2 ybr;
- int family;
- u_short port;
-
- if (ypdb->dom_lockfd_v2 != -1)
- close(ypdb->dom_lockfd_v2);
-
- ypdb->dom_lockfd_v2 = create_domb_file(ypdb, BINDINGDIR_V2);
- if (ypdb->dom_lockfd_v2 == -1)
- return;
-
- port = __rpcb_getport("127.0.0.1", CONNLESS_TSP, YPBINDPROG, YPBINDVERS_2);
- iov[0].iov_base = (char *)&port
- iov[0].iov_len = sizeof(port);
- iov[1].iov_base = (char *)&ybr;
- iov[1].iov_len = sizeof(ybr);
-
- family = ss_family(addr);
- bzero(&ybr, sizeof(ybr));
- if (family != AF_INET) { /* AF_INET6 is not supported in version 2 */
- ybr2.ypbind_status = YPBIND_FAIL_VAL;
- ybr2.yprespv2_error = YPBIND_ERR_FAMILY;
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-soc-all
mailing list