Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 20 Jul 2012 21:47:25 +0000
From:      exxo@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r239628 - in soc2012/exxo/freebsd-head: include/rpcsvc usr.bin/ypwhich
Message-ID:  <20120720214725.B1F66106566B@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: exxo
Date: Fri Jul 20 21:47:24 2012
New Revision: 239628
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=239628

Log:
  Update YPBIND protocol v2 -> v3. Fix ypwhich accordingly and provide backward compatibility

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

Modified: soc2012/exxo/freebsd-head/include/rpcsvc/yp.x
==============================================================================
--- soc2012/exxo/freebsd-head/include/rpcsvc/yp.x	Fri Jul 20 19:35:20 2012	(r239627)
+++ soc2012/exxo/freebsd-head/include/rpcsvc/yp.x	Fri Jul 20 21:47:24 2012	(r239628)
@@ -196,7 +196,8 @@
 };
  
 struct ypbind_binding {
-    opaque ypbind_binding_addr[4]; /* In network order */
+    unsigned char ypbind_binding_family;
+    opaque ypbind_binding_addr[16]; /* In network order */
     opaque ypbind_binding_port[2]; /* In network order */
 };   
 
@@ -223,6 +224,28 @@
 	unsigned ypsetdom_vers;
 };
 
+/* Backward compatibility for YPBIND protocol version 2 */
+#ifdef YPBIND_COMPAT_V2
+
+struct ypbind_binding_v2 {
+    opaque ypbind_binding_addr[4]; /* In network order */
+    opaque ypbind_binding_port[2]; /* In network order */
+};   
+
+union ypbind_resp_v2 switch (ypbind_resptype ypbind_status) {
+case YPBIND_FAIL_VAL:
+        unsigned ypbind_error;
+case YPBIND_SUCC_VAL:
+        ypbind_binding_v2 ypbind_bindinfo;
+};     
+
+struct ypbind_setdom_v2 {
+	domainname ypsetdom_domain;
+	ypbind_binding_v2 ypsetdom_binding;
+	unsigned ypsetdom_vers;
+};
+
+#endif
 
 /*
  * NIS v1 support for backwards compatibility
@@ -371,7 +394,7 @@
 
 		void
 		YPBINDPROC_SETDOM(ypbind_setdom) = 2;
-	} = 2;
+	} = 3;
 } = 100007;
 
 #endif

Modified: soc2012/exxo/freebsd-head/include/rpcsvc/yp_prot.h
==============================================================================
--- soc2012/exxo/freebsd-head/include/rpcsvc/yp_prot.h	Fri Jul 20 19:35:20 2012	(r239627)
+++ soc2012/exxo/freebsd-head/include/rpcsvc/yp_prot.h	Fri Jul 20 21:47:24 2012	(r239628)
@@ -199,7 +199,7 @@
 struct dom_binding {
 	struct dom_binding *dom_pnext;
 	char dom_domain[YPMAXDOMAIN + 1];
-	struct sockaddr_storage dom_server_addr;
+	struct sockaddr_storage dom_server_addr; /* TODO impact of changing this ? */
 	u_short dom_server_port;
 	int dom_socket;
 	CLIENT *dom_client;
@@ -222,7 +222,8 @@
  */
 
 #define YPBINDPROG		((u_long)100007)
-#define YPBINDVERS		((u_long)2)
+#define YPBINDVERS		((u_long)3)
+#define YPBINDVERS_2		((u_long)2)
 #define YPBINDVERS_ORIG		((u_long)1)
 
 /* ypbind procedure numbers */
@@ -272,6 +273,30 @@
 #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
+
+struct ypbind_binding_v2 {
+	struct in_addr	ypbind_binding_addr;
+	u_short		ypbind_binding_port;
+};
+
+struct ypbind_resp_v2 {
+	enum ypbind_resptype ypbind_status;
+	union {
+		u_int ypbind_error;
+		struct ypbind_binding_v2 ypbind_bindinfo;
+	} ypbind_respbody;
+};
+
+struct ypbind_setdom_v2 {
+	char ypsetdom_domain[YPMAXDOMAIN + 1];
+	struct ypbind_binding_v2 ypsetdom_binding;
+	u_int ypsetdom_vers;
+};
+
+#endif
+
 /*
  * YPPUSH PROTOCOL:
  *
@@ -323,6 +348,7 @@
 bool_t	xdr_ypresp_val(XDR *, struct ypresp_val *);
 bool_t	xdr_ypresp_key_val(XDR *, struct ypresp_key_val *);
 bool_t	xdr_ypbind_resp(XDR *, struct ypbind_resp *);
+bool_t	xdr_ypbind_resp_v2(XDR *, struct ypbind_resp_v2 *);
 bool_t	xdr_ypbind_setdom(XDR *, struct ypbind_setdom *);
 bool_t	xdr_yp_inaddr(XDR *, struct inaddr *);
 bool_t	xdr_ypmap_parms(XDR *, struct ypmap_parms *);

Modified: soc2012/exxo/freebsd-head/usr.bin/ypwhich/Makefile
==============================================================================
--- soc2012/exxo/freebsd-head/usr.bin/ypwhich/Makefile	Fri Jul 20 19:35:20 2012	(r239627)
+++ soc2012/exxo/freebsd-head/usr.bin/ypwhich/Makefile	Fri Jul 20 21:47:24 2012	(r239628)
@@ -1,12 +1,14 @@
 #	from: @(#)Makefile	5.8 (Berkeley) 7/28/90
 # $FreeBSD$
 
+.include <bsd.own.mk>
+
 PROG=	ypwhich
 
 WARNS?=	2
 
 .if ${MK_INET6_SUPPORT} != "no"
-CFLAGS+= -DINET6
+CFLAGS+= -DINET6 -DYPBIND_COMPAT_V2
 .endif
 
 .include <bsd.prog.mk>

Modified: soc2012/exxo/freebsd-head/usr.bin/ypwhich/ypwhich.c
==============================================================================
--- soc2012/exxo/freebsd-head/usr.bin/ypwhich/ypwhich.c	Fri Jul 20 19:35:20 2012	(r239627)
+++ soc2012/exxo/freebsd-head/usr.bin/ypwhich/ypwhich.c	Fri Jul 20 21:47:24 2012	(r239628)
@@ -83,26 +83,36 @@
 	exit(ERR_USAGE);
 }
 
-#define ypb_family ypbr.ypbind_respbody.ypbind_bindinfo.ypbind_binding_family
-#define ypb_addr ypbr.ypbind_respbody.ypbind_bindinfo.ypbind_binding_addr
+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
 # define ADDRSTRLEN INET_ADDRSTRLEN
 #endif
 
-/*
- * Like yp_bind except can query a specific host
- */
-static int
-bind_host(char *dom, const char *host)
+static void
+print_addr(union ypb_resp *ypbr, int version)
 {
 	struct hostent *hent = NULL;
-	struct ypbind_resp ypbr;
-	struct timeval tv;
-	CLIENT *client;
-	int r;
 	char str[ADDRSTRLEN];
+	int family;
 	size_t len;
 	union {
 		struct in_addr	in;
@@ -111,9 +121,46 @@
 #endif
 	} ss_addr;
 
+#ifdef YPBIND_COMPAT_V2
+	if (version == YPBINDVERS_2) {
+		family = AF_INET;
+		len = sizeof(ss_addr.in);
+		bcopy(&ypbr->ypb_addr_v2, &ss_addr, len);
+	}
+	else /* YPBINDVERS */
+#endif
+	{
+		family = ypbr->ypb_family;
+#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);
+	}
+	hent = gethostbyaddr((char *)&ss_addr, len, family);
+	if (hent)
+		printf("%s\n", hent->h_name);
+	else
+		printf("%s\n", inet_ntop(family, &ss_addr, str, ADDRSTRLEN));
+}
+
+/*
+ * Like yp_bind except can query a specific host
+ */
+static int
+bind_host(char *dom, const char *host)
+{
+	union ypb_resp ypbr;
+	struct timeval tv;
+	CLIENT *client;
+	int r;
+	int version = YPBINDVERS;
+
 	tv.tv_sec = 15;
 	tv.tv_usec = 0;
-	client = clnt_create_timed(host, YPBINDPROG, YPBINDVERS, "udp", &tv);
+	client = clnt_create_timed(host, YPBINDPROG, version, "udp", &tv);
 	if (client == NULL) {
 		warnx("can't clnt_create_timed: %s", yperr_string(YPERR_YPBIND));
 		return (YPERR_YPBIND);
@@ -123,32 +170,31 @@
 	tv.tv_usec = 0;
 	r = clnt_call(client, YPBINDPROC_DOMAIN,
 		(xdrproc_t)xdr_domainname, &dom,
-		(xdrproc_t)xdr_ypbind_resp, &ypbr, tv);
+		(xdrproc_t)xdr_ypbind_resp, &ypbr.resp, tv);
+#ifdef YPBIND_COMPAT_V2
+	if (r == RPC_PROGVERSMISMATCH) {
+		fprintf(stderr, "Warning: %s, fallback in V2 compatibility mode\n", clnt_sperrno(r));
+		version = YPBINDVERS_2;
+		if (clnt_control(client, CLSET_VERS, &version) == TRUE)
+			r = clnt_call(client, YPBINDPROC_DOMAIN,
+				(xdrproc_t)xdr_domainname, &dom,
+				(xdrproc_t)xdr_ypbind_resp_v2, &ypbr.resp2, tv); /* TODO libc must define YPBIND_COMPAT_V2 */
+	}	    
+#endif
 	if (r != RPC_SUCCESS) {
 		warnx("can't clnt_call: %s", yperr_string(YPERR_YPBIND));
 		clnt_destroy(client);
 		return (YPERR_YPBIND);
 	} else {
-		if (ypbr.ypbind_status != YPBIND_SUCC_VAL) {
+		if (ypbr.ypb_status != YPBIND_SUCC_VAL) {
 			warnx("can't yp_bind: reason: %s",
-				ypbinderr_string(ypbr.ypbind_respbody.ypbind_error));
+				ypbinderr_string(ypbr.ypb_error));
 			clnt_destroy(client);
 			return (r);
 		}
 	}
 	clnt_destroy(client);
-	bcopy(&ypb_addr, &ss_addr, sizeof(ss_addr));
-#ifdef INET6
-	if (ypb_family == AF_INET6)
-		len = sizeof(ss_addr.in6);
-	else /* AF_INET */
-#endif
-		len = sizeof(ss_addr.in);
-	hent = gethostbyaddr((char *)&ss_addr, len, ypb_family);
-	if (hent)
-		printf("%s\n", hent->h_name);
-	else
-		printf("%s\n", inet_ntop(ypb_family, &ss_addr, str, ADDRSTRLEN));
+	print_addr(&ypbr, version);
 	return (0);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120720214725.B1F66106566B>