+struct safe_preinit_data
+{
+ int (*preinit)(struct afb_api_x3 *);
+ struct afb_api_x3 *api;
+ int result;
+};
+
+static void safe_preinit(int sig, void *closure)
+{
+ struct safe_preinit_data *spd = closure;
+ if (!sig)
+ spd->result = spd->preinit(spd->api);
+ else {
+ spd->result = -1;
+ errno = EFAULT;
+ }
+}
+
+int afb_api_v3_safe_preinit(struct afb_api_x3 *api, int (*preinit)(struct afb_api_x3 *))
+{
+ struct safe_preinit_data spd;
+
+ spd.preinit = preinit;
+ spd.api = api;
+ sig_monitor(60, safe_preinit, &spd);
+ return spd.result;
+}
+