Use our own xdr_int64() for all 64 bit types.
authorRonnie Sahlberg <ronniesahlberg@gmail.com>
Sat, 17 Nov 2012 18:01:34 +0000 (05:01 +1100)
committerRonnie Sahlberg <ronniesahlberg@gmail.com>
Sat, 17 Nov 2012 18:14:43 +0000 (10:14 -0800)
Oh dear.  It is really difficult for rpc and tirpc implementors to get
64 bit types right. Sigh.

I am tired of fighting broken ti-rpc libraries under linux and others
that do random corruption on xdr_u_quad_t and friends
so lets just override that shit and replace it with our own, non-broken,
implementation of a 64 bit xdr accessor.

examples/Makefile.am
nfs/Makefile.am
nfs/nfs.x
nlm/Makefile.am
nlm/nlm.x

index 314807b5cfa2a486cbc5c661adb7a9179843ea8d..878ac1abb73cb95c8c9ad66eec020b95c6d2ecc2 100644 (file)
@@ -8,7 +8,7 @@ AM_CPPFLAGS = \
        -I../portmap \
        "-D_U_=__attribute__((unused))"
 
-AM_LDFLAGS = ../lib/.libs/libnfs.la
+AM_LDFLAGS = ../lib/.libs/libnfs.la -lpopt
 
 nfsclient_async_SOURCES = nfsclient-async.c
 
index 50523690069b886f5dbbdb5afc1f90db89407840..51b8d928fb0fcd9b6ea2df2217c79a98d5ff5c7b 100644 (file)
@@ -15,6 +15,34 @@ $(nfs_GENERATED) : nfs-stamp
 nfs-stamp : nfs.x
        rm -f $(nfs_GENERATED)
        rpcgen -h @RPCGENFLAGS@ $< > libnfs-raw-nfs.h
-       rpcgen -c @RPCGENFLAGS@ $< | sed -e "s/#include \".*nfs.h\"/#include \"libnfs-raw-nfs.h\"/" > libnfs-raw-nfs.c
+       rpcgen -c @RPCGENFLAGS@ $< | sed -e "s/#include \".*nfs.h\"/#include \"libnfs-raw-nfs.h\"/" -e "s/^xdr_uint64/static xdr_uint64_broken/" > libnfs-raw-nfs.c
+       echo "" >> libnfs-raw-nfs.c
+       echo "xdr_uint64 (XDR *xdrs, uint64 *objp)" >> libnfs-raw-nfs.c
+       echo "{" >> libnfs-raw-nfs.c
+       echo "  uint32_t i;" >> libnfs-raw-nfs.c
+       echo "" >> libnfs-raw-nfs.c
+       echo "        switch (xdrs->x_op) {" >> libnfs-raw-nfs.c
+       echo "        case XDR_DECODE:" >> libnfs-raw-nfs.c
+       echo "          if (!xdr_u_int (xdrs, &i))" >> libnfs-raw-nfs.c
+       echo "                  return FALSE;" >> libnfs-raw-nfs.c
+       echo "          *objp = i;" >> libnfs-raw-nfs.c
+       echo "          *objp <<= 32;" >> libnfs-raw-nfs.c
+       echo "" >> libnfs-raw-nfs.c
+       echo "          if (!xdr_u_int (xdrs, &i))" >> libnfs-raw-nfs.c
+       echo "                  return FALSE;" >> libnfs-raw-nfs.c
+       echo "          *objp |= i;" >> libnfs-raw-nfs.c
+       echo "" >> libnfs-raw-nfs.c
+       echo "          return TRUE;" >> libnfs-raw-nfs.c
+       echo "  case XDR_ENCODE:" >> libnfs-raw-nfs.c
+       echo "          i = ((*objp) >> 32) & 0xffffffff;" >> libnfs-raw-nfs.c
+       echo "          if (!xdr_u_int (xdrs, &i))" >> libnfs-raw-nfs.c
+       echo "                  return FALSE;" >> libnfs-raw-nfs.c
+       echo "" >> libnfs-raw-nfs.c
+       echo "          i = ((*objp)      ) & 0xffffffff;" >> libnfs-raw-nfs.c
+       echo "          if (!xdr_u_int (xdrs, &i))" >> libnfs-raw-nfs.c
+       echo "                  return FALSE;" >> libnfs-raw-nfs.c
+       echo "          return TRUE;" >> libnfs-raw-nfs.c
+       echo "  }" >> libnfs-raw-nfs.c
+       echo "}" >> libnfs-raw-nfs.c
        touch nfs-stamp
        
index c259aa6e3cf3ff6dc7b96f3d34dc60b095f1951c..6e2d7a47d6bd9f044cfd762565bea6a1eec4615d 100644 (file)
--- a/nfs/nfs.x
+++ b/nfs/nfs.x
@@ -7,8 +7,7 @@ const NFS3_COOKIEVERFSIZE = 8;
 
 typedef opaque cookieverf3[NFS3_COOKIEVERFSIZE];
 
-
-/*unsigned hyper can be overridden by giving rpcgen -DU_INT64_PLATTFORM_TYPE="foo" - for plattforms
+/*unsigned hyper can be overridden by giving rpcgen -DU_INT64_PLATTFORM_TYPE="
   where rpcgen doesn't know anything about hyper
   default to unsigned hyper as of rfc 1813 */
 #ifndef U_INT64_PLATTFORM_TYPE
@@ -16,6 +15,7 @@ typedef opaque cookieverf3[NFS3_COOKIEVERFSIZE];
 #endif/*U_INT64_PLATTFORM_TYPE*/
 
 typedef U_INT64_PLATTFORM_TYPE uint64;
+
 typedef uint64 cookie3;
 
 struct nfs_fh3 {
index 7ec82da9710533d605b3a5f1510a5b5550aec7ea..0873dda10bdad54494ae9de4a42846d3f7a847e7 100644 (file)
@@ -15,6 +15,6 @@ $(nlm_GENERATED) : nlm-stamp
 nlm-stamp : nlm.x
        rm -f $(nlm_GENERATED)
        rpcgen -h @RPCGENFLAGS@ $< > libnfs-raw-nlm.h
-       rpcgen -c @RPCGENFLAGS@ $< | sed -e "s/#include \".*nlm.h\"/#include \"libnfs-raw-nlm.h\"/" > libnfs-raw-nlm.c
+       rpcgen -c @RPCGENFLAGS@ $< | sed -e "s/#include \".*nlm.h\"/#include \"libnfs-raw-nlm.h\"/" -e "s/^xdr_uint64/static xdr_uint64_broken/" > libnfs-raw-nlm.c
        touch nlm-stamp
        
index 4ca86218e8be8cc64f6b39ba429adae3da053693..8ec6614ddb8ac714d8580b2235d1b7a0175504fc 100644 (file)
--- a/nlm/nlm.x
+++ b/nlm/nlm.x
@@ -1,5 +1,6 @@
 /* based on rfc1813 and wireshark */
 
+typedef unsigned hyper uint64;
 
 struct nlm_fh4 {
        opaque       data<>;
@@ -28,8 +29,8 @@ struct nlm4_holder {
        bool           exclusive;
        unsigned int   svid;
        nlm4_oh        oh;
-       unsigned hyper l_offset;
-       unsigned hyper l_len;
+       uint64         l_offset;
+       uint64         l_len;
 };
 
 const NLM_MAXNAME = 256;
@@ -38,8 +39,8 @@ struct nlm4_lock {
        struct nlm_fh4 fh;
        nlm4_oh        oh;
        unsigned int   svid;
-       unsigned hyper l_offset;
-       unsigned hyper l_len;
+       uint64         l_offset;
+       uint64         l_len;
 };
 
 struct nlm4_share {