#include <rpc/rpc.h>
#include "vm_basic_types.h"
+#include "util.h"
/*
* Helper macros for iterating over an rpcgen-generated array. Given a struct S:
(cnt))
#endif
+/*
+ * Macros for assigning to XDR optional strings, opaque fields, and
+ * optional opaque fields.
+ *
+ * Usage:
+ * // XDR
+ * struct MyFoo { string *foo; };
+ * struct MyBar { opaque bar; };
+ * struct MyOptBar { opaque *bar; };
+ *
+ * // C
+ * char buf[] = { 0xca, 0xfe, 0xba, 0xbe, 0x80, 0x08 };
+ *
+ * MyFoo foo;
+ * XDRUTIL_STRING_OPT(&foo.foo, "Hello, world!");
+ *
+ * MyBar bar;
+ * XDRUTIL_OPAQUE(&bar.bar, buf, sizeof buf);
+ *
+ * MyOptBar obar;
+ * XDRUTIL_OPAQUE_OPT(&obar.bar, buf, sizeof buf);
+ */
+
+#define XDRUTIL_STRING_OPT(ptr, src) do { \
+ (ptr) = Util_SafeMalloc(sizeof *(ptr)); \
+ *(ptr) = Util_SafeStrdup((src)); \
+} while (0)
+
+#define XDRUTIL_OPAQUE(ptr, src, srcSize) do { \
+ struct { u_int len; char *val; } __opaque_temp = {(srcSize), NULL}; \
+ ASSERT_ON_COMPILE(sizeof(*(ptr)) == sizeof(__opaque_temp)); \
+ \
+ __opaque_temp.val = Util_SafeMalloc((srcSize)); \
+ memcpy(__opaque_temp.val, (src), (srcSize)); \
+ memcpy(ptr, &__opaque_temp, sizeof __opaque_temp); \
+} while (0)
+
+#define XDRUTIL_OPAQUE_OPT(ptr, src, srcSize) do { \
+ *(ptr) = Util_SafeMalloc(sizeof (struct { u_len; void*; })); \
+ XDRUTIL_OPAQUE(*(ptr), (src), (srcSize)); \
+} while(0)
+
void *
XdrUtil_ArrayAppend(void **array, u_int *arrayLen, size_t elemSz, u_int elemCnt);