+struct datachunk
+ZOOM_connection_option_getl(c, key, len)
+ ZOOM_connection c
+ const char* key
+ int &len
+ CODE:
+ RETVAL.data = (char*) ZOOM_connection_option_getl(c, key, &len);
+ RETVAL.len = len;
+ OUTPUT:
+ RETVAL
+ len
+
+void
+ZOOM_connection_option_set(c, key, val)
+ ZOOM_connection c
+ const char *key
+ const char *val
+
+# In ZOOM-C, the `val' parameter is const char*. However, our typemap
+# treats this as T_PV, i.e. it's "known" that it points to a
+# NUL-terminated string. Instead, then, I here use opaquechar*, which
+# is an opaque pointer. The underlying C function can then use this
+# along with `len' to Do The Right Thing.
+#
+void
+ZOOM_connection_option_setl(c, key, val, len)
+ ZOOM_connection c
+ const char* key
+ opaquechar* val
+ int len
+
+# The reference parameters, `cp' and `addinfo', need to already have
+# values when this function is called, otherwise an "uninitialised
+# value" warning is generated. As far as I can see, there is no way
+# around this: no way to specify in a prototype that an argument is
+# allowed to be undefined, for example. Since these function will
+# never be called directly by well-behaved client code, but only by
+# our own wrapper classes, I think we can live with that.
+#
+# The poxing about with cpp and caddinfo is due to Perl XS's lack of
+# support for const char**, but who can blame it? If you ask me, the
+# whole "const" thing was well-intentioned by ghastly mistake.
+#