--- /dev/null
+#include "types.h"
+#include "marshall.h"
+
+marshall &
+operator<<(marshall &m, uint8_t x) {
+ m.rawbyte(x);
+ return m;
+}
+
+marshall &
+operator<<(marshall &m, uint16_t x) {
+ x = hton(x);
+ m.rawbytes((char *)&x, 2);
+ return m;
+}
+
+marshall &
+operator<<(marshall &m, uint32_t x) {
+ x = hton(x);
+ m.rawbytes((char *)&x, 4);
+ return m;
+}
+
+marshall & operator<<(marshall &m, int32_t x) { return m << (uint32_t) x; }
+marshall & operator<<(marshall &m, int8_t x) { return m << (uint8_t)x; }
+marshall & operator<<(marshall &m, bool x) { return m << (uint8_t)x; }
+marshall & operator<<(marshall &m, int16_t x) { return m << (uint16_t)x; }
+marshall & operator<<(marshall &m, uint64_t x) { return m << (uint32_t)(x>>32) << (uint32_t)x; }
+
+marshall &
+operator<<(marshall &m, const string &s) {
+ m << (unsigned int) s.size();
+ m.rawbytes(s.data(), s.size());
+ return m;
+}
+
+void marshall::pack_req_header(const request_header &h) {
+ size_t saved_sz = index_;
+ //leave the first 4-byte empty for channel to fill size of pdu
+ index_ = sizeof(rpc_sz_t);
+ *this << h.xid << h.proc << h.clt_nonce << h.srv_nonce << h.xid_rep;
+ index_ = saved_sz;
+}
+
+void marshall::pack_reply_header(const reply_header &h) {
+ size_t saved_sz = index_;
+ //leave the first 4-byte empty for channel to fill size of pdu
+ index_ = sizeof(rpc_sz_t);
+ *this << h.xid << h.ret;
+ index_ = saved_sz;
+}
+
+// take the contents from another unmarshall object
+void
+unmarshall::take_in(unmarshall &another)
+{
+ if(buf_)
+ free(buf_);
+ another.take_buf(&buf_, &sz_);
+ index_ = RPC_HEADER_SZ;
+ ok_ = sz_ >= RPC_HEADER_SZ?true:false;
+}
+
+inline bool
+unmarshall::ensure(size_t n) {
+ if (index_+n > sz_)
+ ok_ = false;
+ return ok_;
+}
+
+inline uint8_t
+unmarshall::rawbyte()
+{
+ if (!ensure(1))
+ return 0;
+ return (uint8_t)buf_[index_++];
+}
+
+void
+unmarshall::rawbytes(string &ss, size_t n)
+{
+ VERIFY(ensure(n));
+ ss.assign(buf_+index_, n);
+ index_ += n;
+}
+
+template <class T>
+void
+unmarshall::rawbytes(T &t)
+{
+ const size_t n = sizeof(T);
+ VERIFY(ensure(n));
+ memcpy(&t, buf_+index_, n);
+ t = ntoh(t);
+ index_ += n;
+}
+
+unmarshall & operator>>(unmarshall &u, bool &x) { x = (bool)u.rawbyte(); return u; }
+unmarshall & operator>>(unmarshall &u, uint8_t &x) { x = u.rawbyte(); return u; }
+unmarshall & operator>>(unmarshall &u, int8_t &x) { x = (int8_t)u.rawbyte(); return u; }
+unmarshall & operator>>(unmarshall &u, uint16_t &x) { u.rawbytes<uint16_t>(x); return u; }
+unmarshall & operator>>(unmarshall &u, int16_t &x) { u.rawbytes<int16_t>(x); return u; }
+unmarshall & operator>>(unmarshall &u, uint32_t &x) { u.rawbytes<uint32_t>(x); return u; }
+unmarshall & operator>>(unmarshall &u, int32_t &x) { u.rawbytes<int32_t>(x); return u; }
+unmarshall & operator>>(unmarshall &u, size_t &x) { uint32_t xx; u.rawbytes<uint32_t>(xx); x = xx; return u; }
+unmarshall & operator>>(unmarshall &u, uint64_t &x) { u.rawbytes<uint64_t>(x); return u; }
+unmarshall & operator>>(unmarshall &u, int64_t &x) { u.rawbytes<int64_t>(x); return u; }
+
+unmarshall & operator>>(unmarshall &u, string &s) {
+ unsigned sz = u.grab<unsigned>();
+ if(u.ok())
+ u.rawbytes(s, sz);
+ return u;
+}
return 0;
}
-marshall &
-operator<<(marshall &m, uint8_t x) {
- m.rawbyte(x);
- return m;
-}
-
-marshall &
-operator<<(marshall &m, uint16_t x) {
- x = hton(x);
- m.rawbytes((char *)&x, 2);
- return m;
-}
-
-marshall &
-operator<<(marshall &m, uint32_t x) {
- x = hton(x);
- m.rawbytes((char *)&x, 4);
- return m;
-}
-
-marshall & operator<<(marshall &m, int32_t x) { return m << (uint32_t) x; }
-marshall & operator<<(marshall &m, int8_t x) { return m << (uint8_t)x; }
-marshall & operator<<(marshall &m, bool x) { return m << (uint8_t)x; }
-marshall & operator<<(marshall &m, int16_t x) { return m << (uint16_t)x; }
-marshall & operator<<(marshall &m, uint64_t x) { return m << (uint32_t)(x>>32) << (uint32_t)x; }
-
-marshall &
-operator<<(marshall &m, const string &s) {
- m << (unsigned int) s.size();
- m.rawbytes(s.data(), s.size());
- return m;
-}
-
-void marshall::pack_req_header(const request_header &h) {
- size_t saved_sz = index_;
- //leave the first 4-byte empty for channel to fill size of pdu
- index_ = sizeof(rpc_sz_t);
- *this << h.xid << h.proc << h.clt_nonce << h.srv_nonce << h.xid_rep;
- index_ = saved_sz;
-}
-
-void marshall::pack_reply_header(const reply_header &h) {
- size_t saved_sz = index_;
- //leave the first 4-byte empty for channel to fill size of pdu
- index_ = sizeof(rpc_sz_t);
- *this << h.xid << h.ret;
- index_ = saved_sz;
-}
-
-// take the contents from another unmarshall object
-void
-unmarshall::take_in(unmarshall &another)
-{
- if(buf_)
- free(buf_);
- another.take_buf(&buf_, &sz_);
- index_ = RPC_HEADER_SZ;
- ok_ = sz_ >= RPC_HEADER_SZ?true:false;
-}
-
-inline bool
-unmarshall::ensure(size_t n) {
- if (index_+n > sz_)
- ok_ = false;
- return ok_;
-}
-
-inline uint8_t
-unmarshall::rawbyte()
-{
- if (!ensure(1))
- return 0;
- return (uint8_t)buf_[index_++];
-}
-
-void
-unmarshall::rawbytes(string &ss, size_t n)
-{
- VERIFY(ensure(n));
- ss.assign(buf_+index_, n);
- index_ += n;
-}
-
-template <class T>
-void
-unmarshall::rawbytes(T &t)
-{
- const size_t n = sizeof(T);
- VERIFY(ensure(n));
- memcpy(&t, buf_+index_, n);
- t = ntoh(t);
- index_ += n;
-}
-
-unmarshall & operator>>(unmarshall &u, bool &x) { x = (bool)u.rawbyte(); return u; }
-unmarshall & operator>>(unmarshall &u, uint8_t &x) { x = u.rawbyte(); return u; }
-unmarshall & operator>>(unmarshall &u, int8_t &x) { x = (int8_t)u.rawbyte(); return u; }
-unmarshall & operator>>(unmarshall &u, uint16_t &x) { u.rawbytes<uint16_t>(x); return u; }
-unmarshall & operator>>(unmarshall &u, int16_t &x) { u.rawbytes<int16_t>(x); return u; }
-unmarshall & operator>>(unmarshall &u, uint32_t &x) { u.rawbytes<uint32_t>(x); return u; }
-unmarshall & operator>>(unmarshall &u, int32_t &x) { u.rawbytes<int32_t>(x); return u; }
-unmarshall & operator>>(unmarshall &u, size_t &x) { uint32_t xx; u.rawbytes<uint32_t>(xx); x = xx; return u; }
-unmarshall & operator>>(unmarshall &u, uint64_t &x) { u.rawbytes<uint64_t>(x); return u; }
-unmarshall & operator>>(unmarshall &u, int64_t &x) { u.rawbytes<int64_t>(x); return u; }
-unmarshall & operator>>(unmarshall &u, string &s) {
- unsigned sz = u.grab<unsigned>();
- if(u.ok())
- u.rawbytes(s, sz);
- return u;
-}
-
bool operator<(const sockaddr_in &a, const sockaddr_in &b){
return ((a.sin_addr.s_addr < b.sin_addr.s_addr) ||
((a.sin_addr.s_addr == b.sin_addr.s_addr) &&