+struct twimap_export
+{
+ char* name;
+ int acl;
+ struct twimap_ops ops;
+};
+
+#define twinode_getdata(inode, type) \
+ ({ \
+ struct twifs_node* twinode = (struct twifs_node*)(inode)->data; \
+ assert(twinode); \
+ (type) twinode->data; \
+ })
+
+#define EXPORT_TWIFS_PLUGIN(label, plg_init) \
+ export_ldga_el(twiplugin_inits, label, ptr_t, plg_init)
+
+#define __twifs_export_base(name_, acl_) \
+ .name=stringify(name_), .acl=(acl_)
+
+#define twifs_node_ro(name_, acl_) \
+ struct twifs_export __twifs_exp_##name_ = \
+ { __twifs_export_base(name_, acl_), \
+ .ops = { .read = __twifs_read_##name_ }}
+
+#define twifs_node_rw(name_, acl_) \
+ struct twifs_export __twifs_exp_##name_ = \
+ { __twifs_export_base(name_, acl_), \
+ .ops = { .read = __twifs_read_##name_, \
+ .write = __twifs_write_##name_ }}
+
+#define twimap_value_export(name_, acl_) \
+ struct twimap_export __twimap_exp_##name_ = \
+ { __twifs_export_base(name_, acl_), \
+ .ops = { .read = __twimap_read_##name_ }}
+
+#define twimap_list_export(name_, acl_) \
+ struct twimap_export __twimap_exp_##name_ = \
+ { __twifs_export_base(name_, acl_), \
+ .ops = { .read = __twimap_read_##name_, \
+ .go_next = __twimap_gonext_##name_, \
+ .reset = __twimap_reset_##name_, }}
+
+#define twifs_export(parent, name_, data_) \
+ twifs_basic_node_from(parent, &__twifs_exp_##name_, data_)
+
+#define twimap_export(parent, name_, data_) \
+ twifs_mapped_node_from(parent, &__twimap_exp_##name_, data_)
+
+#define twifs_export_ro(parent, name_, acl_, data_) \
+ ({ \
+ twifs_node_ro(name_, acl_); \
+ twifs_export(parent, name_, data_); \
+ })
+
+#define twimap_export_value(parent, name_, acl_, data_) \
+ ({ \
+ twimap_value_export(name_, acl_); \
+ twimap_export(parent, name_, data_); \
+ })
+
+#define twimap_export_list(parent, name_, acl_, data_) \
+ ({ \
+ twimap_list_export(name_, acl_); \
+ twimap_export(parent, name_, data_); \
+ })
+
+void
+twifs_register_plugins();