X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/46fb2b4bbe3a0a8516ab04cfafa895a882c70f86..5d99dbf06a14904944f5593c63705934bdfdcfb7:/rpc/marshall.cc diff --git a/rpc/marshall.cc b/rpc/marshall.cc index 5c2b10c..b8371cf 100644 --- a/rpc/marshall.cc +++ b/rpc/marshall.cc @@ -1,114 +1,28 @@ #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(); +MARSHALL_RAW_NETWORK_ORDER_AS(bool, uint8_t) +MARSHALL_RAW_NETWORK_ORDER(uint8_t) +MARSHALL_RAW_NETWORK_ORDER(int8_t) +MARSHALL_RAW_NETWORK_ORDER(uint16_t) +MARSHALL_RAW_NETWORK_ORDER(int16_t) +MARSHALL_RAW_NETWORK_ORDER(uint32_t) +MARSHALL_RAW_NETWORK_ORDER(int32_t) +MARSHALL_RAW_NETWORK_ORDER_AS(size_t, uint32_t) +MARSHALL_RAW_NETWORK_ORDER(uint64_t) +MARSHALL_RAW_NETWORK_ORDER(int64_t) + +marshall & operator<<(marshall &m, const string &s) { + m << (uint32_t)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 -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(x); return u; } -unmarshall & operator>>(unmarshall &u, int16_t &x) { u.rawbytes(x); return u; } -unmarshall & operator>>(unmarshall &u, uint32_t &x) { u.rawbytes(x); return u; } -unmarshall & operator>>(unmarshall &u, int32_t &x) { u.rawbytes(x); return u; } -unmarshall & operator>>(unmarshall &u, size_t &x) { uint32_t xx; u.rawbytes(xx); x = xx; return u; } -unmarshall & operator>>(unmarshall &u, uint64_t &x) { u.rawbytes(x); return u; } -unmarshall & operator>>(unmarshall &u, int64_t &x) { u.rawbytes(x); return u; } - unmarshall & operator>>(unmarshall &u, string &s) { - unsigned sz = u.grab(); - if(u.ok()) - u.rawbytes(s, sz); + uint32_t sz = u.grab(); + if (u.ok()) { + s.resize(sz); + u.rawbytes(&s[0], sz); + } return u; }