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>