-static join_func_t *jf_list;
-static void **jf_list_extra;
-static unsigned int jf_size = 0, jf_used = 0;
+void
+jf_free_ehf(struct eh_func *ehf)
+{
+ if (ehf->extra != NULL)
+ free(ehf->extra);
+}
+
+DEFINE_EH_FUNC_LIST(jf_list, EH_ADD_TAIL, jf_free_ehf);
+
+int
+jf_wrapper(void *extra, void *callextra)
+{
+ struct funcargs *fa = (struct funcargs *)extra;
+ struct modeNode *mNode = (struct modeNode *)callextra;
+ struct userNode *user = mNode->user;
+
+ ((join_func_t)fa->func)(mNode, fa->extra);
+
+ if (user->dead)
+ return EH_STOP;
+
+ return EH_CONT;
+}
+
+void
+reg_join_func_pos(join_func_t handler, void *extra, int pos)
+{
+ struct funcargs *fa = malloc(sizeof(struct funcargs));
+
+ fa->func = (void *)handler;
+ fa->extra = extra;
+
+ reg_hook_func_pos(&jf_list, jf_wrapper, (void *)fa, pos);
+}