socsvn commit: r239628 - in soc2012/exxo/freebsd-head:
include/rpcsvc usr.bin/ypwhich
exxo at FreeBSD.org
exxo at FreeBSD.org
Fri Jul 20 21:47:27 UTC 2012
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);
}
More information about the svn-soc-all
mailing list