/* * Routines within this files are Copyright Colten Edwards 1996 * Aka panasync on irc. * Thanks to Shiek and Flier for helpful hints and suggestions. As well * as code in some cases. */ #define __modules_c #include "irc.h" static char cvsrevision[] = "$Id: modules.c,v 1.1.1.1 2003/04/11 01:09:07 dan Exp $"; CVS_REVISION(modules_c) #include "struct.h" #include "alias.h" #include "encrypt.h" #include "commands.h" #include "dcc.h" #include "input.h" #include "ircaux.h" #include "flood.h" #include "hook.h" #include "list.h" #include "output.h" #include "log.h" #include "ctcp.h" #include "cdcc.h" #include "misc.h" #include "module.h" #include "names.h" #include "hash2.h" #include "vars.h" #include "screen.h" #include "parse.h" #include "server.h" #include "timer.h" #include "status.h" #include "window.h" #include "tcl_bx.h" #include "ircterm.h" #define MAIN_SOURCE #include "modval.h" IrcVariableDll *dll_variable = NULL; extern void *default_output_function; extern DCC_dllcommands dcc_dllcommands; extern void *default_status_output_function; Function_ptr global_table[NUMBER_OF_GLOBAL_FUNCTIONS] = { NULL }; Function_ptr *global = global_table; char *_modname_ = NULL; #ifdef WANT_DLL #ifdef NO_DLFCN_H # include "../include/dlfcn.h" #else #if defined(HPUX) #include #else # include #endif #endif #ifndef RTLD_NOW # define RTLD_NOW 1 #endif #ifndef RTLD_GLOBAL # define RTLD_GLOBAL 0 #endif Packages *install_pack = NULL; #endif /* WANT_DLL */ extern int BX_read_sockets(); extern int identd; extern int doing_notice; extern char *sent_nick, *last_sent_msg_body; extern int (*dcc_open_func) (int, int, unsigned long, int); extern int (*dcc_output_func) (int, int, char *, int); extern int (*dcc_input_func) (int, int, char *, int, int); extern int (*dcc_close_func) (int, unsigned long, int); int (*serv_open_func) (int, unsigned long, int); extern int (*serv_output_func) (int, int, char *, int); extern int (*serv_input_func) (int, char *, int, int, int); extern int (*serv_close_func) (int, unsigned long, int); extern int (*check_ext_mail_status)(void); extern char *(*check_ext_mail)(void); int BX_check_module_version(unsigned long); #ifdef GUI extern char *lastclicklinedata; extern int contextx, contexty; extern int guiipc[2]; #endif void null_function(void) { } void init_global_functions(void) { static int already_done = 0; if (already_done) return; already_done++; /* ircaux.c */ global_table[MODULE_VERSION_CHECK] = (Function_ptr) BX_check_module_version; global_table[VSNPRINTF] = (Function_ptr) vsnprintf; global_table[SNPRINTF] = (Function_ptr) snprintf; global_table[NEW_MALLOC] = (Function_ptr) n_malloc; global_table[NEW_FREE] = (Function_ptr) n_free; global_table[NEW_REALLOC] = (Function_ptr) n_realloc; global_table[MALLOC_STRCPY] = (Function_ptr) n_malloc_strcpy; global_table[MALLOC_STR2CPY] = (Function_ptr) BX_malloc_str2cpy; global_table[M_3DUP] = (Function_ptr) BX_m_3dup; global_table[M_OPENDUP] = (Function_ptr) BX_m_opendup; global_table[M_S3CAT] = (Function_ptr) BX_m_s3cat; global_table[M_S3CAT_S] = (Function_ptr) BX_m_s3cat_s; global_table[M_3CAT] = (Function_ptr) BX_m_3cat; global_table[UPPER] = (Function_ptr) BX_upper; global_table[LOWER] = (Function_ptr) BX_lower; global_table[STRISTR] = (Function_ptr) BX_stristr; global_table[RSTRISTR] = (Function_ptr) BX_rstristr; global_table[WORD_COUNT] = (Function_ptr) BX_word_count; global_table[REMOVE_TRAILING_SPACES] = (Function_ptr) BX_remove_trailing_spaces; global_table[MY_STRICMP] = (Function_ptr) BX_my_stricmp; global_table[MY_STRNICMP] = (Function_ptr) BX_my_strnicmp; global_table[MY_STRNSTR] = (Function_ptr) BX_my_strnstr; global_table[CHOP] = (Function_ptr) BX_chop; global_table[STRMCPY] = (Function_ptr) BX_strmcpy; global_table[STRMCAT] = (Function_ptr) BX_strmcat; global_table[SCANSTR] = (Function_ptr) BX_scanstr; global_table[EXPAND_TWIDDLE] = (Function_ptr) BX_expand_twiddle; global_table[CHECK_NICKNAME] = (Function_ptr) BX_check_nickname; global_table[SINDEX] = (Function_ptr) BX_sindex; global_table[RSINDEX] = (Function_ptr) BX_rsindex; global_table[ISNUMBER] = (Function_ptr) BX_is_number; global_table[RFGETS] = (Function_ptr) BX_rfgets; global_table[PATH_SEARCH] = (Function_ptr) BX_path_search; global_table[DOUBLE_QUOTE] = (Function_ptr) BX_double_quote; global_table[IRCPANIC] = (Function_ptr) BX_ircpanic; global_table[END_STRCMP] = (Function_ptr) BX_end_strcmp; global_table[BEEP_EM] = (Function_ptr) BX_beep_em; global_table[UZFOPEN] = (Function_ptr) BX_uzfopen; global_table[FUNC_GET_TIME] = (Function_ptr) BX_get_time; global_table[TIME_DIFF] = (Function_ptr) BX_time_diff; global_table[TIME_TO_NEXT_MINUTE] = (Function_ptr) BX_time_to_next_minute; global_table[PLURAL] = (Function_ptr) BX_plural; global_table[MY_CTIME] = (Function_ptr) BX_my_ctime; global_table[LTOA] = (Function_ptr) BX_my_ltoa; global_table[STRFORMAT] = (Function_ptr) BX_strformat; global_table[MATCHINGBRACKET] = (Function_ptr) BX_MatchingBracket; global_table[PARSE_NUMBER] = (Function_ptr) BX_parse_number; global_table[SPLITW] = (Function_ptr) BX_splitw; global_table[UNSPLITW] = (Function_ptr) BX_unsplitw; global_table[M_2DUP] = (Function_ptr) BX_m_2dup; global_table[M_E3CAT] = (Function_ptr) BX_m_e3cat; global_table[CHECK_VAL] = (Function_ptr) BX_check_val; global_table[ON_OFF] = (Function_ptr) BX_on_off; global_table[STREXTEND] = (Function_ptr) BX_strextend; global_table[STRFILL] = (Function_ptr) BX_strfill; global_table[EMPTY_FUNC] = (Function_ptr) BX_empty; global_table[REMOVE_BRACKETS] = (Function_ptr) BX_remove_brackets; global_table[MY_ATOL] = (Function_ptr) BX_my_atol; global_table[M_DUPCHAR] = (Function_ptr) BX_m_dupchar; global_table[STREQ] = (Function_ptr) BX_streq; global_table[STRIEQ] = (Function_ptr) BX_strieq; global_table[STRMOPENCAT] = (Function_ptr) BX_strmopencat; global_table[OV_STRCPY] = (Function_ptr) BX_ov_strcpy; global_table[STRIP_CONTROL] = (Function_ptr) BX_strip_control; global_table[FIGURE_OUT_ADDRESS] = (Function_ptr) BX_figure_out_address; global_table[STRNRCHR] = (Function_ptr) BX_strnrchr; global_table[MASK_DIGITS] = (Function_ptr) BX_mask_digits; global_table[CCSPAN] = (Function_ptr) BX_ccspan; global_table[CHARCOUNT] = (Function_ptr) BX_charcount; global_table[STRPCAT] = (Function_ptr) BX_strpcat; global_table[STRCPY_NOCOLORCODES] = (Function_ptr) BX_strcpy_nocolorcodes; global_table[CRYPTIT] = (Function_ptr) BX_cryptit; global_table[STRIPDEV] = (Function_ptr) BX_stripdev; global_table[MANGLE_LINE] = (Function_ptr) BX_mangle_line; global_table[MALLOC_STRCAT] = (Function_ptr) n_malloc_strcat; global_table[M_STRDUP] = (Function_ptr) n_m_strdup; global_table[M_STRCAT_UES] = (Function_ptr) n_m_strcat_ues; global_table[M_STRNDUP] = (Function_ptr) n_m_strndup; global_table[MALLOC_SPRINTF] = (Function_ptr) BX_malloc_sprintf; global_table[M_SPRINTF] = (Function_ptr) BX_m_sprintf; global_table[NEXT_ARG] = (Function_ptr) BX_next_arg; global_table[NEW_NEXT_ARG] = (Function_ptr) BX_new_next_arg; global_table[NEW_NEW_NEXT_ARG] = (Function_ptr) BX_new_new_next_arg; global_table[LAST_ARG] = (Function_ptr) BX_last_arg; global_table[NEXT_IN_COMMA_LIST] = (Function_ptr) BX_next_in_comma_list; global_table[RANDOM_NUMBER] = (Function_ptr) BX_random_number; /* words.c reg.c */ global_table[SEARCH] = (Function_ptr) BX_search; global_table[MOVE_TO_ABS_WORD] = (Function_ptr) BX_move_to_abs_word; global_table[MOVE_WORD_REL] = (Function_ptr) BX_move_word_rel; global_table[EXTRACT] = (Function_ptr) BX_extract; global_table[EXTRACT2] = (Function_ptr) BX_extract2; global_table[WILD_MATCH] = (Function_ptr) BX_wild_match; /* list.c */ global_table[ADD_TO_LIST] = (Function_ptr) BX_add_to_list; global_table[ADD_TO_LIST_EXT] = (Function_ptr) BX_add_to_list_ext; global_table[FIND_IN_LIST] = (Function_ptr) BX_find_in_list; global_table[FIND_IN_LIST_EXT] = (Function_ptr) BX_find_in_list_ext; global_table[REMOVE_FROM_LIST_] = (Function_ptr) BX_remove_from_list; global_table[REMOVE_FROM_LIST_EXT] = (Function_ptr) BX_remove_from_list_ext; global_table[REMOVEWILD_FROM_LIST] = (Function_ptr) BX_removewild_from_list; global_table[LIST_LOOKUP] = (Function_ptr) BX_list_lookup; global_table[LIST_LOOKUP_EXT] = (Function_ptr) BX_list_lookup_ext; /* alist.c */ global_table[ADD_TO_ARRAY] = (Function_ptr) BX_add_to_array; global_table[REMOVE_FROM_ARRAY] = (Function_ptr) BX_remove_from_array; global_table[ARRAY_POP] = (Function_ptr) BX_array_pop; global_table[REMOVE_ALL_FROM_ARRAY] = (Function_ptr) BX_remove_all_from_array; global_table[ARRAY_LOOKUP] = (Function_ptr) BX_array_lookup; global_table[FIND_ARRAY_ITEM] = (Function_ptr) BX_find_array_item; global_table[FIND_FIXED_ARRAY_ITEM] = (Function_ptr) BX_find_fixed_array_item; /* server.c */ global_table[SEND_TO_SERVER] = (Function_ptr) BX_send_to_server; global_table[QUEUE_SEND_TO_SERVER] = (Function_ptr) BX_queue_send_to_server; global_table[MY_SEND_TO_SERVER] = (Function_ptr) BX_my_send_to_server; /* connecting to the server */ global_table[GET_CONNECTED] = (Function_ptr) BX_get_connected; global_table[CONNECT_TO_SERVER_BY_REFNUM]=(Function_ptr) BX_connect_to_server_by_refnum; global_table[CLOSE_SERVER] = (Function_ptr) BX_close_server; global_table[IS_SERVER_CONNECTED] = (Function_ptr) BX_is_server_connected; global_table[FLUSH_SERVER] = (Function_ptr) BX_flush_server; global_table[SERVER_IS_CONNECTED] = (Function_ptr) BX_server_is_connected; global_table[IS_SERVER_OPEN] = (Function_ptr) BX_is_server_open; global_table[CLOSE_ALL_SERVER] = (Function_ptr) BX_close_all_server; /* server file reading */ global_table[READ_SERVER_FILE] = (Function_ptr) BX_read_server_file; global_table[ADD_TO_SERVER_LIST] = (Function_ptr) BX_add_to_server_list; global_table[BUILD_SERVER_LIST] = (Function_ptr) BX_build_server_list; global_table[DISPLAY_SERVER_LIST] = (Function_ptr) BX_display_server_list; global_table[CREATE_SERVER_LIST] = (Function_ptr) BX_create_server_list; global_table[PARSE_SERVER_INFO] = (Function_ptr) BX_parse_server_info; global_table[SERVER_LIST_SIZE] = (Function_ptr) BX_server_list_size; /* misc server/nickname functions */ global_table[FIND_SERVER_REFNUM] = (Function_ptr) BX_find_server_refnum; global_table[FIND_IN_SERVER_LIST] = (Function_ptr) BX_find_in_server_list; global_table[PARSE_SERVER_INDEX] = (Function_ptr) BX_parse_server_index; global_table[GET_SERVER_REDIRECT] = (Function_ptr) BX_get_server_redirect; global_table[SET_SERVER_REDIRECT] = (Function_ptr) BX_set_server_redirect; global_table[CHECK_SERVER_REDIRECT] = (Function_ptr) BX_check_server_redirect; global_table[FUDGE_NICKNAME] = (Function_ptr) BX_fudge_nickname; global_table[RESET_NICKNAME] = (Function_ptr) BX_reset_nickname; /* various set server struct functions */ global_table[SET_SERVER_COOKIE] = (Function_ptr) BX_set_server_cookie; global_table[SET_SERVER_FLAG] = (Function_ptr) BX_set_server_flag; global_table[SET_SERVER_MOTD] = (Function_ptr) BX_set_server_motd; global_table[SET_SERVER_OPERATOR] = (Function_ptr) BX_set_server_operator; global_table[SET_SERVER_ITSNAME] = (Function_ptr) BX_set_server_itsname; global_table[SET_SERVER_VERSION] = (Function_ptr) BX_set_server_version; global_table[SET_SERVER_LAG] = (Function_ptr) BX_set_server_lag; global_table[SET_SERVER_PASSWORD] = (Function_ptr) BX_set_server_password; global_table[SET_SERVER_NICKNAME] = (Function_ptr) BX_set_server_nickname; global_table[SET_SERVER2_8] = (Function_ptr) BX_set_server2_8; global_table[SET_SERVER_AWAY] = (Function_ptr) BX_set_server_away; /* various get server struct functions */ global_table[GET_SERVER_COOKIE] = (Function_ptr) BX_get_server_cookie; global_table[GET_SERVER_NICKNAME] = (Function_ptr) BX_get_server_nickname; global_table[GET_SERVER_NAME] = (Function_ptr) BX_get_server_name; global_table[GET_SERVER_ITSNAME] = (Function_ptr) BX_get_server_itsname; global_table[GET_SERVER_MOTD] = (Function_ptr) BX_get_server_motd; global_table[GET_SERVER_OPERATOR] = (Function_ptr) BX_get_server_operator; global_table[GET_SERVER_VERSION] = (Function_ptr) BX_get_server_version; global_table[GET_SERVER_FLAG] = (Function_ptr) BX_get_server_flag; global_table[GET_POSSIBLE_UMODES] = (Function_ptr) BX_get_possible_umodes; global_table[GET_SERVER_PORT] = (Function_ptr) BX_get_server_port; global_table[GET_SERVER_LAG] = (Function_ptr) BX_get_server_lag; global_table[GET_SERVER2_8] = (Function_ptr) BX_get_server2_8; global_table[GET_UMODE] = (Function_ptr) BX_get_umode; global_table[GET_SERVER_AWAY] = (Function_ptr) BX_get_server_away; global_table[GET_SERVER_NETWORK] = (Function_ptr) BX_get_server_network; global_table[GET_PENDING_NICKNAME] = (Function_ptr) BX_get_pending_nickname; global_table[SERVER_DISCONNECT] = (Function_ptr) BX_server_disconnect; global_table[GET_SERVER_LIST] = (Function_ptr) BX_get_server_list; global_table[GET_SERVER_CHANNELS] = (Function_ptr) BX_get_server_channels; global_table[SET_SERVER_LAST_CTCP_TIME] = (Function_ptr) BX_set_server_last_ctcp_time; global_table[GET_SERVER_LAST_CTCP_TIME] = (Function_ptr) BX_get_server_last_ctcp_time; global_table[SET_SERVER_TRACE_FLAG] = (Function_ptr) BX_set_server_trace_flag; global_table[GET_SERVER_TRACE_FLAG] = (Function_ptr) BX_get_server_trace_flag; global_table[SET_SERVER_STAT_FLAG] = (Function_ptr) BX_set_server_stat_flag; global_table[GET_SERVER_STAT_FLAG] = (Function_ptr) BX_get_server_stat_flag; global_table[GET_SERVER_READ] = (Function_ptr) BX_get_server_read; global_table[GET_SERVER_LINKLOOK] = (Function_ptr) BX_get_server_linklook; global_table[SET_SERVER_LINKLOOK] = (Function_ptr) BX_set_server_linklook; global_table[GET_SERVER_LINKLOOK_TIME] = (Function_ptr) BX_get_server_linklook_time; global_table[SET_SERVER_LINKLOOK_TIME] = (Function_ptr) BX_set_server_linklook_time; global_table[GET_SERVER_TRACE_KILL] = (Function_ptr) BX_get_server_trace_kill; global_table[SET_SERVER_TRACE_KILL] = (Function_ptr) BX_set_server_trace_kill; global_table[ADD_SERVER_CHANNELS] = (Function_ptr) BX_add_server_channels; global_table[SET_SERVER_CHANNELS] = (Function_ptr) BX_set_server_channels; global_table[SEND_MSG_TO_CHANNELS] = (Function_ptr) BX_send_msg_to_channels; global_table[SEND_MSG_TO_NICKS] = (Function_ptr) BX_send_msg_to_nicks; global_table[IS_SERVER_QUEUE] = (Function_ptr) BX_is_server_queue; /* glob.c */ global_table[BSD_GLOB] = (Function_ptr) BX_bsd_glob; global_table[BSD_GLOBFREE] = (Function_ptr) BX_bsd_globfree; /* output.c */ global_table[PUT_IT] = (Function_ptr) BX_put_it; global_table[BITCHSAY] = (Function_ptr) BX_bitchsay; global_table[YELL] = (Function_ptr) BX_yell; /* screen.c */ global_table[ADD_TO_SCREEN] = (Function_ptr) BX_add_to_screen; global_table[XTERM_SETTITLE] = (Function_ptr) BX_xterm_settitle; global_table[PREPARE_DISPLAY] = (Function_ptr) BX_prepare_display; global_table[ADD_TO_WINDOW] = (Function_ptr) BX_add_to_window; global_table[SKIP_INCOMING_MIRC] = (Function_ptr) BX_skip_incoming_mirc; global_table[SPLIT_UP_LINE] = (Function_ptr) BX_split_up_line; global_table[OUTPUT_LINE] = (Function_ptr) BX_output_line; global_table[OUTPUT_WITH_COUNT] = (Function_ptr) BX_output_with_count; global_table[SCROLL_WINDOW] = (Function_ptr) BX_scroll_window; global_table[CURSOR_NOT_IN_DISPLAY] = (Function_ptr) BX_cursor_not_in_display; global_table[CURSOR_IN_DISPLAY] = (Function_ptr) BX_cursor_in_display; global_table[IS_CURSOR_IN_DISPLAY] = (Function_ptr) BX_is_cursor_in_display; global_table[REPAINT_WINDOW] = (Function_ptr) BX_repaint_window; global_table[CREATE_NEW_SCREEN] = (Function_ptr) BX_create_new_screen; #ifdef WINDOW_CREATE global_table[CREATE_ADDITIONAL_SCREEN] = (Function_ptr) BX_create_additional_screen; global_table[KILL_SCREEN] = (Function_ptr) BX_kill_screen; #endif global_table[ADD_WAIT_PROMPT] = (Function_ptr) BX_add_wait_prompt; global_table[SKIP_CTL_C_SEQ] = (Function_ptr) BX_skip_ctl_c_seq; global_table[STRIP_ANSI] = (Function_ptr) BX_strip_ansi; /* status.c */ global_table[BUILD_STATUS] = (Function_ptr) BX_build_status; /* window.c */ global_table[GET_WINDOW_BY_NAME] = (Function_ptr) BX_get_window_by_name; global_table[GET_CURRENT_CHANNEL_BY_REFNUM]=(Function_ptr) BX_get_current_channel_by_refnum; global_table[NEW_WINDOW] = (Function_ptr) BX_new_window; global_table[GET_WINDOW_SERVER] = (Function_ptr) BX_get_window_server; global_table[RESIZE_WINDOW] = (Function_ptr) BX_resize_window; global_table[UPDATE_ALL_WINDOWS] = (Function_ptr) BX_update_all_windows; global_table[SET_SCREENS_CURRENT_WINDOW]= (Function_ptr) BX_set_screens_current_window; global_table[DELETE_WINDOW] = (Function_ptr) BX_delete_window; global_table[FREE_FORMATS] = (Function_ptr) BX_free_formats; global_table[REMOVE_WINDOW_FROM_SCREEN] = (Function_ptr) BX_remove_window_from_screen; global_table[TRAVERSE_ALL_WINDOWS] = (Function_ptr) BX_traverse_all_windows; global_table[ADD_TO_INVISIBLE_LIST] = (Function_ptr) BX_add_to_invisible_list; global_table[ADD_TO_WINDOW_LIST] = (Function_ptr) BX_add_to_window_list; global_table[REMOVE_WINDOW_FROM_SCREEN] = (Function_ptr) BX_remove_window_from_screen; global_table[RECALCULATE_WINDOW_POSITIONS]= (Function_ptr) BX_recalculate_window_positions; global_table[MOVE_WINDOW] = (Function_ptr) BX_move_window; global_table[REDRAW_ALL_WINDOWS] = (Function_ptr) BX_redraw_all_windows; global_table[REBALANCE_WINDOWS] = (Function_ptr) BX_rebalance_windows; global_table[RECALCULATE_WINDOWS] = (Function_ptr) BX_recalculate_windows; global_table[GOTO_WINDOW] = (Function_ptr) BX_goto_window; global_table[HIDE_BX_WINDOW] = (Function_ptr) BX_hide_window; global_table[FUNC_SWAP_LAST_WINDOW] = (Function_ptr) BX_swap_last_window; global_table[FUNC_SWAP_NEXT_WINDOW] = (Function_ptr) BX_swap_next_window; global_table[FUNC_SWAP_PREVIOUS_WINDOW] = (Function_ptr) BX_swap_previous_window; global_table[SHOW_WINDOW] = (Function_ptr) BX_show_window; global_table[GET_STATUS_BY_REFNUM] = (Function_ptr) BX_get_status_by_refnum; global_table[GET_WINDOW_BY_DESC] = (Function_ptr) BX_get_window_by_desc; global_table[GET_WINDOW_BY_REFNUM] = (Function_ptr) BX_get_window_by_refnum; global_table[GET_VISIBLE_BY_REFNUM] = (Function_ptr) BX_get_visible_by_refnum; global_table[FUNC_NEXT_WINDOW] = (Function_ptr) BX_next_window; global_table[FUNC_PREVIOUS_WINDOW] = (Function_ptr) BX_previous_window; global_table[UPDATE_WINDOW_STATUS] = (Function_ptr) BX_update_window_status; global_table[UPDATE_ALL_STATUS] = (Function_ptr) BX_update_all_status; global_table[UPDATE_WINDOW_STATUS_ALL] = (Function_ptr) BX_update_window_status_all; global_table[STATUS_UPDATE] = (Function_ptr) BX_status_update; global_table[SET_PROMPT_BY_REFNUM] = (Function_ptr) BX_set_prompt_by_refnum; global_table[GET_PROMPT_BY_REFNUM] = (Function_ptr) BX_get_prompt_by_refnum; global_table[QUERY_NICK] = (Function_ptr) BX_query_nick; global_table[QUERY_HOST] = (Function_ptr) BX_query_host; global_table[QUERY_CMD] = (Function_ptr) BX_query_cmd; global_table[GET_TARGET_BY_REFNUM] = (Function_ptr) BX_get_target_by_refnum; global_table[GET_TARGET_CMD_BY_REFNUM] = (Function_ptr) BX_get_target_cmd_by_refnum; global_table[GET_WINDOW_TARGET_BY_DESC] = (Function_ptr) BX_get_window_target_by_desc; global_table[IS_CURRENT_CHANNEL] = (Function_ptr) BX_is_current_channel; global_table[SET_CURRENT_CHANNEL_BY_REFNUM]= (Function_ptr) BX_set_current_channel_by_refnum; global_table[GET_REFNUM_BY_WINDOW] = (Function_ptr) BX_get_refnum_by_window; global_table[IS_BOUND_TO_WINDOW] = (Function_ptr) BX_is_bound_to_window; global_table[GET_WINDOW_BOUND_CHANNEL] = (Function_ptr) BX_get_window_bound_channel; global_table[IS_BOUND_ANYWHERE] = (Function_ptr) BX_is_bound_anywhere; global_table[IS_BOUND] = (Function_ptr) BX_is_bound; global_table[UNBIND_CHANNEL] = (Function_ptr) BX_unbind_channel; global_table[GET_BOUND_CHANNEL] = (Function_ptr) BX_get_bound_channel; global_table[SET_WINDOW_SERVER] = (Function_ptr) BX_set_window_server; global_table[WINDOW_CHECK_SERVERS] = (Function_ptr) BX_window_check_servers; global_table[CHANGE_WINDOW_SERVER] = (Function_ptr) BX_change_window_server; global_table[SET_LEVEL_BY_REFNUM] = (Function_ptr) BX_set_level_by_refnum; global_table[MESSAGE_TO] = (Function_ptr) BX_message_to; global_table[CLEAR_WINDOW] = (Function_ptr) BX_clear_window; global_table[CLEAR_ALL_WINDOWS] = (Function_ptr) BX_clear_all_windows; global_table[CLEAR_WINDOW_BY_REFNUM] = (Function_ptr) BX_clear_window_by_refnum; global_table[UNCLEAR_WINDOW_BY_REFNUM] = (Function_ptr) BX_unclear_window_by_refnum; global_table[SET_SCROLL_LINES] = (Function_ptr) BX_set_scroll_lines; global_table[SET_CONTINUED_LINES] = (Function_ptr) BX_set_continued_lines; global_table[CURRENT_REFNUM] = (Function_ptr) BX_current_refnum; global_table[NUMBER_OF_WINDOWS_ON_SCREEN]= (Function_ptr) BX_number_of_windows_on_screen; global_table[SET_SCROLLBACK_SIZE] = (Function_ptr) BX_set_scrollback_size; global_table[IS_WINDOW_NAME_UNIQUE] = (Function_ptr) BX_is_window_name_unique; global_table[GET_NICKLIST_BY_WINDOW] = (Function_ptr) BX_get_nicklist_by_window; global_table[SCROLLBACK_BACKWARDS_LINES]= (Function_ptr) BX_scrollback_backwards_lines; global_table[SCROLLBACK_FORWARDS_LINES] = (Function_ptr) BX_scrollback_forwards_lines; global_table[SCROLLBACK_FORWARDS] = (Function_ptr) BX_scrollback_forwards; global_table[SCROLLBACK_BACKWARDS] = (Function_ptr) BX_scrollback_backwards; global_table[SCROLLBACK_END] = (Function_ptr) BX_scrollback_end; global_table[SCROLLBACK_START] = (Function_ptr) BX_scrollback_start; global_table[HOLD_MODE] = (Function_ptr) BX_hold_mode; global_table[UNHOLD_WINDOWS] = (Function_ptr) BX_unhold_windows; global_table[FUNC_UNSTOP_ALL_WINDOWS] = (Function_ptr) BX_unstop_all_windows; global_table[RESET_LINE_CNT] = (Function_ptr) BX_reset_line_cnt; global_table[FUNC_TOGGLE_STOP_SCREEN] = (Function_ptr) BX_toggle_stop_screen; global_table[FLUSH_EVERYTHING_BEING_HELD]= (Function_ptr) BX_flush_everything_being_held; global_table[UNHOLD_A_WINDOW] = (Function_ptr) BX_unhold_a_window; global_table[RECALCULATE_WINDOW_CURSOR] = (Function_ptr) BX_recalculate_window_cursor; global_table[MAKE_WINDOW_CURRENT] = (Function_ptr) BX_make_window_current; global_table[CLEAR_SCROLLBACK] = (Function_ptr) BX_clear_scrollback; global_table[RESET_DISPLAY_TARGET] = (Function_ptr) BX_reset_display_target; global_table[SET_DISPLAY_TARGET] = (Function_ptr) BX_set_display_target; global_table[SAVE_DISPLAY_TARGET] = (Function_ptr) BX_save_display_target; global_table[RESTORE_DISPLAY_TARGET] = (Function_ptr) BX_restore_display_target; global_table[MY_ENCRYPT] = (Function_ptr) BX_my_encrypt; global_table[MY_DECRYPT] = (Function_ptr) BX_my_decrypt; global_table[PREPARE_COMMAND] = (Function_ptr) BX_prepare_command; global_table[CONVERT_OUTPUT_FORMAT] = (Function_ptr) BX_convert_output_format; global_table[BREAKARGS] = (Function_ptr) BX_BreakArgs; global_table[PASTEARGS] = (Function_ptr) BX_PasteArgs; global_table[USERAGE] = (Function_ptr) BX_userage; global_table[SEND_TEXT] = (Function_ptr) BX_send_text; global_table[SPLIT_CTCP] = (Function_ptr) BX_split_CTCP; global_table[RANDOM_STR] = (Function_ptr) BX_random_str; global_table[DCC_PRINTF] = (Function_ptr) BX_dcc_printf; global_table[ADD_TO_LOG] = (Function_ptr) BX_add_to_log; global_table[SET_LASTLOG_MSG_LEVEL] = (Function_ptr) BX_set_lastlog_msg_level; /* module.c */ #ifdef WANT_DLL global_table[REMOVE_MODULE_PROC] = (Function_ptr) BX_remove_module_proc; global_table[ADD_MODULE_PROC] = (Function_ptr) BX_add_module_proc; #else global_table[REMOVE_MODULE_PROC] = (Function_ptr) null_function; global_table[ADD_MODULE_PROC] = (Function_ptr) null_function; #endif /* this one should be differant. */ global_table[FUNC_LOAD] = (Function_ptr) BX_load; global_table[HOOK] = (Function_ptr) BX_do_hook; /* irc.c */ global_table[UPDATE_CLOCK] = (Function_ptr) BX_update_clock; global_table[IRC_IO_FUNC] = (Function_ptr) BX_io; global_table[IRC_EXIT_FUNC] = (Function_ptr) BX_irc_exit; /* alias.c */ global_table[LOCK_STACK_FRAME] = (Function_ptr) BX_lock_stack_frame; global_table[UNLOCK_STACK_FRAME] = (Function_ptr) BX_unlock_stack_frame; /* input.c */ global_table[FUNC_UPDATE_INPUT] = (Function_ptr) BX_update_input; global_table[CURSOR_TO_INPUT] = (Function_ptr) BX_cursor_to_input; global_table[SET_INPUT] = (Function_ptr) BX_set_input; global_table[GET_INPUT] = (Function_ptr) BX_get_input; global_table[SET_INPUT_PROMPT] = (Function_ptr) BX_set_input_prompt; global_table[GET_INPUT_PROMPT] = (Function_ptr) BX_get_input_prompt; global_table[ADDTABKEY] = (Function_ptr) BX_addtabkey; global_table[GETTABKEY] = (Function_ptr) BX_gettabkey; global_table[GETNEXTNICK] = (Function_ptr) BX_getnextnick; global_table[GETCHANNICK] = (Function_ptr) BX_getchannick; global_table[LOOKUP_NICKCOMPLETION] = (Function_ptr) BX_lookup_nickcompletion; global_table[ADD_COMPLETION_TYPE] = (Function_ptr) BX_add_completion_type; /* names.c */ global_table[IS_CHANOP] = (Function_ptr) BX_is_chanop; global_table[IS_CHANNEL] = (Function_ptr) BX_is_channel; global_table[MAKE_CHANNEL] = (Function_ptr) BX_make_channel; /* this is really in misc.c */ global_table[IM_ON_CHANNEL] = (Function_ptr) BX_im_on_channel; global_table[IS_ON_CHANNEL] = (Function_ptr) BX_is_on_channel; global_table[ADD_CHANNEL] = (Function_ptr) BX_add_channel; global_table[ADD_TO_CHANNEL] = (Function_ptr) BX_add_to_channel; global_table[GET_CHANNEL_KEY] = (Function_ptr) BX_get_channel_key; global_table[FUNC_RECREATE_MODE] = (Function_ptr) BX_recreate_mode; #ifdef COMPRESS_MODES global_table[FUNC_COMPRESS_MODES] = (Function_ptr) BX_compress_modes; #endif global_table[FUNC_GOT_OPS] = (Function_ptr) BX_got_ops; global_table[GET_CHANNEL_BANS] = (Function_ptr) BX_get_channel_bans; global_table[GET_CHANNEL_MODE] = (Function_ptr) BX_get_channel_mode; global_table[CLEAR_BANS] = (Function_ptr) BX_clear_bans; global_table[REMOVE_CHANNEL] = (Function_ptr) BX_remove_channel; global_table[REMOVE_FROM_CHANNEL] = (Function_ptr) BX_remove_from_channel; global_table[RENAME_NICK] = (Function_ptr) BX_rename_nick; global_table[GET_CHANNEL_OPER] = (Function_ptr) BX_get_channel_oper; global_table[GET_CHANNEL_HALFOP] = (Function_ptr) BX_get_channel_halfop; global_table[FETCH_USERHOST] = (Function_ptr) BX_fetch_userhost; global_table[GET_CHANNEL_VOICE] = (Function_ptr) BX_get_channel_voice; global_table[CREATE_CHANNEL_LIST] = (Function_ptr) BX_create_channel_list; global_table[FLUSH_CHANNEL_STATS] = (Function_ptr) BX_flush_channel_stats; global_table[LOOKUP_CHANNEL] = (Function_ptr) BX_lookup_channel; /* hash.c */ global_table[FIND_NICKLIST_IN_CHANNELLIST]= (Function_ptr) BX_find_nicklist_in_channellist; global_table[ADD_NICKLIST_TO_CHANNELLIST]= (Function_ptr) BX_add_nicklist_to_channellist; global_table[NEXT_NICKLIST] = (Function_ptr) BX_next_nicklist; global_table[NEXT_NAMELIST] = (Function_ptr) BX_next_namelist; global_table[ADD_NAME_TO_GENERICLIST] = (Function_ptr) BX_add_name_to_genericlist; global_table[FIND_NAME_IN_GENERICLIST] = (Function_ptr) BX_find_name_in_genericlist; global_table[ADD_WHOWAS_USERHOST_CHANNEL]=(Function_ptr) BX_add_whowas_userhost_channel; global_table[FIND_USERHOST_CHANNEL] = (Function_ptr) BX_find_userhost_channel; global_table[NEXT_USERHOST] = (Function_ptr) BX_next_userhost; global_table[SORTED_NICKLIST] = (Function_ptr) BX_sorted_nicklist; global_table[CLEAR_SORTED_NICKLIST] = (Function_ptr) BX_clear_sorted_nicklist; global_table[ADD_NAME_TO_FLOODLIST] = (Function_ptr) BX_add_name_to_floodlist; global_table[FIND_NAME_IN_FLOODLIST] = (Function_ptr) BX_find_name_in_floodlist; global_table[REMOVE_OLDEST_WHOWAS_HASHLIST]=(Function_ptr) BX_remove_oldest_whowas_hashlist; /* vars.h cset.c fset.c */ global_table[FGET_STRING_VAR] = (Function_ptr) BX_fget_string_var; global_table[FSET_STRING_VAR] = (Function_ptr) BX_fset_string_var; global_table[GET_WSET_STRING_VAR] = (Function_ptr) BX_get_wset_string_var; global_table[SET_WSET_STRING_VAR] = (Function_ptr) BX_set_wset_string_var; global_table[SET_CSET_INT_VAR] = (Function_ptr) BX_set_cset_int_var; global_table[GET_CSET_INT_VAR] = (Function_ptr) BX_get_cset_int_var; global_table[SET_CSET_STR_VAR] = (Function_ptr) BX_set_cset_str_var; global_table[GET_CSET_STR_VAR] = (Function_ptr) BX_get_cset_str_var; #ifdef WANT_DLL global_table[GET_DLLINT_VAR] = (Function_ptr) BX_get_dllint_var; global_table[SET_DLLINT_VAR] = (Function_ptr) BX_set_dllint_var; global_table[GET_DLLSTRING_VAR] = (Function_ptr) BX_get_dllstring_var; global_table[SET_DLLSTRING_VAR] = (Function_ptr) BX_set_dllstring_var; #else global_table[GET_DLLINT_VAR] = (Function_ptr) null_function; global_table[SET_DLLINT_VAR] = (Function_ptr) null_function; global_table[GET_DLLSTRING_VAR] = (Function_ptr) null_function; global_table[SET_DLLSTRING_VAR] = (Function_ptr) null_function; #endif global_table[GET_INT_VAR] = (Function_ptr) BX_get_int_var; global_table[SET_INT_VAR] = (Function_ptr) BX_set_int_var; global_table[GET_STRING_VAR] = (Function_ptr) BX_get_string_var; global_table[SET_STRING_VAR] = (Function_ptr) BX_set_string_var; /* timer.c */ global_table[ADD_TIMER] = (Function_ptr) BX_add_timer; global_table[DELETE_TIMER] = (Function_ptr) BX_delete_timer; global_table[DELETE_ALL_TIMERS] = (Function_ptr) BX_delete_all_timers; /* socket functions */ global_table[ADD_SOCKETREAD] = (Function_ptr) BX_add_socketread; global_table[ADD_SOCKETTIMEOUT] = (Function_ptr) BX_add_sockettimeout; global_table[CLOSE_SOCKETREAD] = (Function_ptr) BX_close_socketread; global_table[GET_SOCKET] = (Function_ptr) BX_get_socket; global_table[SET_SOCKETFLAGS] = (Function_ptr) BX_set_socketflags; global_table[GET_SOCKETFLAGS] = (Function_ptr) BX_get_socketflags; global_table[GET_SOCKETINFO] = (Function_ptr) BX_get_socketinfo; global_table[SET_SOCKETINFO] = (Function_ptr) BX_set_socketinfo; global_table[SET_SOCKETWRITE] = (Function_ptr) BX_set_socketwrite; global_table[CHECK_SOCKET] = (Function_ptr) BX_check_socket; global_table[READ_SOCKETS] = (Function_ptr) BX_read_sockets; global_table[WRITE_SOCKETS] = (Function_ptr) BX_write_sockets; global_table[GET_MAX_FD] = (Function_ptr) BX_get_max_fd; global_table[NEW_CLOSE] = (Function_ptr) BX_new_close; global_table[NEW_OPEN] = (Function_ptr) BX_new_open; global_table[DGETS] = (Function_ptr) BX_dgets; /* network.c */ global_table[CONNECT_BY_NUMBER] = (Function_ptr) BX_connect_by_number; global_table[RESOLV] = (Function_ptr) BX_lookup_host; global_table[LOOKUP_HOST] = (Function_ptr) BX_lookup_host; global_table[LOOKUP_IP] = (Function_ptr) BX_host_to_ip; global_table[HOST_TO_IP] = (Function_ptr) BX_host_to_ip; global_table[IP_TO_HOST] = (Function_ptr) BX_ip_to_host; global_table[ONE_TO_ANOTHER] = (Function_ptr) BX_one_to_another; global_table[SET_BLOCKING] = (Function_ptr) BX_set_blocking; global_table[SET_NON_BLOCKING] = (Function_ptr) BX_set_non_blocking; /* flood.c */ global_table[IS_OTHER_FLOOD] = (Function_ptr) BX_is_other_flood; global_table[CHECK_FLOODING] = (Function_ptr) BX_check_flooding; global_table[FLOOD_PROT] = (Function_ptr) BX_flood_prot; /* alias.c */ global_table[NEXT_UNIT] = (Function_ptr) BX_next_unit; global_table[EXPAND_ALIAS] = (Function_ptr) BX_expand_alias; global_table[PARSE_INLINE] = (Function_ptr) BX_parse_inline; global_table[ALIAS_SPECIAL_CHAR] = (Function_ptr) BX_alias_special_char; global_table[PARSE_LINE] = (Function_ptr) BX_parse_line; global_table[PARSE_COMMAND_FUNC] = (Function_ptr) BX_parse_command; global_table[MAKE_LOCAL_STACK] = (Function_ptr) BX_make_local_stack; global_table[DESTROY_LOCAL_STACK] = (Function_ptr) BX_destroy_local_stack; /* dcc.c */ global_table[DCC_CREATE_FUNC] = (Function_ptr) BX_dcc_create; global_table[FIND_DCC_FUNC] = (Function_ptr) BX_find_dcc; global_table[ERASE_DCC_INFO] = (Function_ptr) BX_erase_dcc_info; global_table[ADD_DCC_BIND] = (Function_ptr) BX_add_dcc_bind; global_table[REMOVE_DCC_BIND] = (Function_ptr) BX_remove_dcc_bind; global_table[REMOVE_ALL_DCC_BINDS] = (Function_ptr) BX_remove_all_dcc_binds; global_table[GET_ACTIVE_COUNT] = (Function_ptr) BX_get_active_count; global_table[DCC_FILESEND] = (Function_ptr) BX_dcc_filesend; global_table[DCC_RESEND] = (Function_ptr) BX_dcc_resend; /* cdcc.c */ global_table[GET_NUM_QUEUE] = (Function_ptr) BX_get_num_queue; global_table[ADD_TO_QUEUE] = (Function_ptr) BX_add_to_queue; /* who.c */ global_table[WHOBASE] = (Function_ptr) BX_whobase; global_table[ISONBASE] = (Function_ptr) BX_isonbase; global_table[USERHOSTBASE] = (Function_ptr) BX_userhostbase; global_table[SERV_OPEN_FUNC] = (Function_ptr) &serv_open_func; global_table[SERV_OUTPUT_FUNC] = (Function_ptr) &serv_output_func; global_table[SERV_INPUT_FUNC] = (Function_ptr) &serv_input_func; global_table[SERV_CLOSE_FUNC] = (Function_ptr) &serv_close_func; global_table[DEFAULT_OUTPUT_FUNCTION] = (Function_ptr) &default_output_function; global_table[DEFAULT_STATUS_OUTPUT_FUNCTION]=(Function_ptr) &default_status_output_function; /* important variables */ global_table[NICKNAME] = (Function_ptr) &nickname; global_table[IRC_VERSION] = (Function_ptr) &irc_version; global_table[FROM_SERVER] = (Function_ptr) &from_server; global_table[CONNECTED_TO_SERVER] = (Function_ptr) &connected_to_server; global_table[PRIMARY_SERVER] = (Function_ptr) &primary_server; global_table[PARSING_SERVER_INDEX] = (Function_ptr) &parsing_server_index; global_table[NOW] = (Function_ptr) &now; global_table[START_TIME] = (Function_ptr) &start_time; global_table[IDLE_TIME] = (Function_ptr) &idle_time; global_table[LOADING_GLOBAL] = (Function_ptr) &loading_global; global_table[TARGET_WINDOW] = (Function_ptr) &target_window; global_table[CURRENT_WINDOW] = (Function_ptr) ¤t_window; global_table[INVISIBLE_LIST] = (Function_ptr) &invisible_list; global_table[MAIN_SCREEN] = (Function_ptr) &main_screen; global_table[LAST_INPUT_SCREEN] = (Function_ptr) &last_input_screen; global_table[OUTPUT_SCREEN] = (Function_ptr) &output_screen; global_table[SCREEN_LIST] = (Function_ptr) &screen_list; global_table[DOING_NOTICE] = (Function_ptr) &doing_notice; global_table[SENT_NICK] = (Function_ptr) &sent_nick; global_table[LAST_SENT_MSG_BODY] = (Function_ptr) &last_sent_msg_body; global_table[IRCLOG_FP] = (Function_ptr) &irclog_fp; #ifdef WANT_DLL global_table[DLL_FUNCTIONS] = (Function_ptr) &dll_functions; global_table[DLL_NUMERIC] = (Function_ptr) &dll_numeric_list; global_table[DLL_COMMANDS] = (Function_ptr) &dll_commands; global_table[DLL_WINDOW] = (Function_ptr) &dll_window; global_table[DLL_VARIABLE] = (Function_ptr) &dll_variable; global_table[DLL_CTCP] = (Function_ptr) &dll_ctcp; #endif global_table[WINDOW_DISPLAY] = (Function_ptr) &window_display; global_table[STATUS_UPDATE_FLAG] = (Function_ptr) status_update_flag; global_table[TABKEY_ARRAY] = (Function_ptr) &tabkey_array; global_table[AUTOREPLY_ARRAY] = (Function_ptr) &autoreply_array; global_table[IDENTD_SOCKET] = (Function_ptr) &identd; #ifdef WANT_TCL global_table[VAR_TCL_INTERP] = (Function_ptr) tcl_interp; #endif #ifdef GUI global_table[LASTCLICKLINEDATA] = (Function_ptr) &lastclicklinedata; global_table[CONTEXTX] = (Function_ptr) &contextx; global_table[CONTEXTY] = (Function_ptr) &contexty; global_table[GUIIPC] = (Function_ptr) &(guiipc[1]); global_table[GUI_MUTEX_LOCK] = (Function_ptr) BX_gui_mutex_lock; global_table[GUI_MUTEX_UNLOCK] = (Function_ptr) BX_gui_mutex_unlock; #else global_table[GUI_MUTEX_LOCK] = (Function_ptr) null_function; global_table[GUI_MUTEX_UNLOCK] = (Function_ptr) null_function; #endif /* commands.c */ global_table[FIND_COMMAND_FUNC] = (Function_ptr) BX_find_command; #ifdef MEM_DEBUG { int i; for (i = 0; i < NUMBER_OF_GLOBAL_FUNCTIONS; i++) if (global_table[i] == NULL) put_it("global table %d is NULL", i); } #endif } int BX_check_module_version(unsigned long number) { if (number != MODULE_VERSION) return 0; return 1; } #ifdef WANT_DLL char *BX_get_dllstring_var(char *typestr) { IrcVariableDll *dll = NULL; if (typestr) dll = (IrcVariableDll *) find_in_list((List **)&dll_variable, typestr, 0); return (dll?dll->string:NULL); } int BX_get_dllint_var(char *typestr) { IrcVariableDll *dll = NULL; if (typestr) dll = (IrcVariableDll *) find_in_list((List **)&dll_variable, typestr, 0); return (dll?dll->integer:-1); } void BX_set_dllstring_var(char *typestr, char *string) { if (typestr) { IrcVariableDll *dll = NULL; if (typestr) dll = (IrcVariableDll *) find_in_list((List **)&dll_variable, typestr, 0); if (!dll) return; if (string) malloc_strcpy(&dll->string, string); else new_free(&dll->string); } } void BX_set_dllint_var(char *typestr, unsigned int value) { if (typestr) { IrcVariableDll *dll = NULL; if (typestr) dll = (IrcVariableDll *) find_in_list((List **)&dll_variable, typestr, 0); if (!dll) return; dll->integer = value; } } BUILT_IN_COMMAND(dll_load) { #if defined(HPUX) /* HP machines */ shl_t handle = NULL; #elif defined(__EMX__) ULONG ulerror; HMODULE handle; #elif defined(WINNT) HINSTANCE handle; #else /* linux SunOS AIX etc */ void *handle = NULL; #endif char *filename = NULL; Irc_PackageInitProc *proc1Ptr; Irc_PackageVersionProc *proc2Ptr; char *f, *p, *procname = NULL; int code = 0; if (command) { if (install_pack) { Packages *pkg = install_pack; List *pk; for ( ; pkg; pkg = pkg->next) put_it("DLL [%s%s%s] installed", pkg->name, pkg->version?space:empty_string, pkg->version?pkg->version:empty_string); for (pk = (List *)dll_commands; pk; pk = pk->next) put_it("\t%10s\t%s", "Command", pk->name); for (pk = (List *)dll_functions; pk; pk = pk->next) put_it("\t%10s\t%s", "Alias", pk->name); for (pk = (List *)dll_ctcp; pk; pk = pk->next) put_it("\t%10s\t%s", "Ctcp", pk->name); for (pk = (List *)dll_variable; pk; pk = pk->next) put_it("\t%10s\t%s", "Variable", pk->name); for (pk = (List *)dll_window; pk; pk = pk->next) put_it("\t%10s\t %s", "Window", pk->name); } else bitchsay("No modules loaded"); return; } if (!args || !*args) return; filename = next_arg(args, &args); f = expand_twiddle(filename); if ((p = strrchr(filename, '/'))) p++; else { new_free(&f); if (!(p = path_search(filename, PLUGINDIR))) if (!(p = path_search(filename, get_string_var(LOAD_PATH_VAR)))) { char file_buf[BIG_BUFFER_SIZE]; strcpy(file_buf, filename); strcat(file_buf, SHLIB_SUFFIX); if (!(p = path_search(file_buf, get_string_var(LOAD_PATH_VAR)))) if (!(p = path_search(file_buf, PLUGINDIR))) p = filename; } f = expand_twiddle(p); p = filename; } procname = m_strdup(p); if ((p = strchr(procname, '.'))) *p = 0; p = procname; *p = toupper(*p); p++; while (p && *p) { *p = tolower(*p); p++; } if (!procname || find_in_list((List **)&install_pack, procname, 0)) { if (procname) bitchsay("Module [%s] Already installed", procname); new_free(&f); new_free(&procname); return; } malloc_strcat(&procname, "_Init"); #if defined(HPUX) handle = shl_load(f, BIND_IMMEDIATE, 0L); #elif defined(__osf1__) handle = dlopen(f, RTLD_NOW); #elif defined(__EMX__) malloc_strcat(&f, ".dll"); convert_dos(f); ulerror = DosLoadModule(NULL, 0, f, &handle); #elif defined(WINNT) malloc_strcat(&f, ".dll"); convert_dos(f); handle = LoadLibrary(f); #else handle = dlopen(f, RTLD_NOW | RTLD_GLOBAL); #endif #if defined(__EMX__) if (ulerror) #else if (handle == NULL) #endif { #if defined(__EMX__) bitchsay("couldn't load file: DosLoadModule() failed %d", ulerror); #elif defined(WINNT) bitchsay("could't load file %s", f); #else bitchsay("couldn't load file: %s", dlerror()); #endif new_free(&procname); new_free(&f); return; } #if defined(HPUX) if (!shl_findsym(&handle, procname, (short) TYPE_PROCEDURE, (void *) proc1Ptr)) #elif defined(__EMX__) if(DosQueryProcAddr(handle, 0, procname, (PFN *) &proc1Ptr)) #elif defined(WINNT) if (!(proc1Ptr = (Irc_PackageInitProc *) GetProcAddress(handle, procname))) #else if (!(proc1Ptr = (Irc_PackageInitProc *) dlsym(handle, (char *) procname))) #endif bitchsay("UnSuccessful module load"); else code = (proc1Ptr)(&dll_commands, global_table); if (!code && proc1Ptr) { Packages *new; new = (Packages *) new_malloc(sizeof(Packages)); new->name = m_strdup(procname); new->handle = handle; new->major = bitchx_numver / 10000; new->minor = (bitchx_numver / 100) % 100; if ((p = strrchr(new->name, '_'))) *p = 0; p = m_sprintf("%s_Version", new->name); #if defined(__EMX__) if (!DosQueryProcAddr(handle, 0, p, (PFN *) &proc2Ptr)) #elif defined(WINNT) if ((proc2Ptr = (Irc_PackageVersionProc *) GetProcAddress(handle, p))) #elif defined(HPUX) if (shl_findsym(&handle, p, (short) TYPE_PROCEDURE, (void *)proc2Ptr)) #else if ((proc2Ptr = (Irc_PackageVersionProc *) dlsym(handle, p))) #endif new->version = m_strdup(((proc2Ptr)(&dll_commands))); new_free(&p); if ((p = strrchr(new->name, '_'))) *p = 0; p = m_sprintf("%s_Cleanup", new->name); #if defined(__EMX__) if(!DosQueryProcAddr(handle, 0, p, (PFN *) &proc1Ptr)) #elif defined(WINNT) if ((proc1Ptr = (Irc_PackageInitProc *) GetProcAddress(handle, p))) #elif defined(HPUX) if (shl_findsym(&handle, p, (short) TYPE_PROCEDURE, (void *)proc1Ptr)) #else if ((proc1Ptr = (Irc_PackageInitProc *) dlsym(handle, p))) #endif new->cleanup = proc1Ptr; new_free(&p); if ((p = strrchr(new->name, '_'))) *p = 0; p = m_sprintf("%s_Lock", new->name); #if defined(__EMX__) if(!DosQueryProcAddr(handle, 0, p, (PFN *) &proc1Ptr)) #elif defined(WINNT) if ((proc1Ptr = (Irc_PackageInitProc *) GetProcAddress(handle, p))) #elif defined(HPUX) if (shl_findsym(&handle, p, (short) TYPE_PROCEDURE, (void *)proc1Ptr)) #else if ((proc1Ptr = (Irc_PackageInitProc *) dlsym(handle, p))) #endif new->lock = 1; new_free(&p); add_to_list((List **)&install_pack, (List *)new); } else { if (code == INVALID_MODVERSION) bitchsay("Error module version is wrong for [%s]", procname); else bitchsay("Error initiliziing module [%s:%d]", procname, code); if (handle) #if defined(__EMX__) DosFreeModule(handle); #elif defined(WINNT) FreeLibrary(handle); #elif defined(HPUX) shl_unload(handle); #else dlclose(handle); #endif } new_free(&procname); new_free(&f); } Packages *find_module(char *name) { Packages *new = NULL; if (name) new = (Packages *)find_in_list((List **)&install_pack, name, 0); return new; } #define RAWHASH_SIZE 20 HashEntry RawHash[RAWHASH_SIZE] = {{ NULL, 0, 0 }}; RawDll *find_raw_proc(char *comm, char **ArgList) { RawDll *tmp = NULL; if ((tmp = (RawDll *)find_name_in_genericlist(comm, RawHash, RAWHASH_SIZE, 0))) return tmp; return NULL; } int BX_add_module_proc(unsigned int mod_type, char *modname, char *procname, char *desc, int id, int flag, void *func1, void *func2) { switch(mod_type) { case COMMAND_PROC: { IrcCommandDll *new; new = (IrcCommandDll *) new_malloc(sizeof(IrcCommandDll)); new->name = m_strdup(procname); if (desc) new->server_func = m_strdup(desc); new->func = func1; if (func2) new->help = m_strdup((char *)func2); new->module = m_strdup(modname); add_to_list((List **)&dll_commands, (List *)new); break; } case WINDOW_PROC: { WindowDll *new; new = (WindowDll *) new_malloc(sizeof(WindowDll)); new->name = m_strdup(procname); if (desc) new->help = m_strdup(desc); new->func = func1; new->module = m_strdup(modname); add_to_list((List **)&dll_window, (List *)new); break; } case OUTPUT_PROC: { Screen *screen; Window *window; if (func1) { default_output_function = func1; for (screen = screen_list; screen; screen = screen->next) { for (window = screen->window_list; window; window = window->next) window->output_func = func1; } } if (func2) { default_status_output_function = func2; for (screen = screen_list; screen; screen = screen->next) { for (window = screen->window_list; window; window = window->next) window->status_output_func = func2; } } break; } case ALIAS_PROC: { BuiltInDllFunctions *new = NULL; new = (BuiltInDllFunctions *) new_malloc(sizeof(BuiltInDllFunctions)); new->name = m_strdup(procname); new->func = func1; new->module = m_strdup(modname); add_to_list((List **)&dll_functions, (List *)new); break; } case CTCP_PROC: { CtcpEntryDll *new = NULL; new = (CtcpEntryDll *) new_malloc(sizeof(CtcpEntryDll)); new->name = m_strdup(procname); new->desc = m_strdup(desc); new->id = id; new->flag = flag; new->func = func1; new->repl = func2; new->module = m_strdup(modname); add_to_list((List **)&dll_ctcp, (List *)new); break; } case VAR_PROC: { IrcVariableDll *new = NULL; new = (IrcVariableDll *) new_malloc(sizeof(IrcVariableDll)); new->type = id; new->integer = flag; new->name = m_strdup(procname); if (desc) new->string = m_strdup(desc); new->module = m_strdup(modname); new->func = func1; add_to_list((List **)&dll_variable, (List *)new); break; } case RAW_PROC: { RawDll *raw; unsigned long hvalue = hash_nickname(procname, RAWHASH_SIZE); raw = (RawDll *)new_malloc(sizeof(RawDll)); raw->next = (RawDll *)RawHash[hvalue].list; RawHash[hvalue].list = (void *)raw; RawHash[hvalue].links++; RawHash[hvalue].hits++; raw->name = m_strdup(procname); raw->module = m_strdup(modname); raw->func = func1; break; } case HOOK_PROC: { extern void add_dll_hook(int , int, char *, char *, int (*func1)(int, char *, char **),int (*func2)(char *, char *, char **)); add_dll_hook(id, flag, desc? desc : "*", modname, func1, func2); break; } case DCC_PROC: { DCC_dllcommands *new = NULL; new = (DCC_dllcommands *) new_malloc(sizeof(DCC_dllcommands)); new->name = m_strdup(procname); new->help = m_strdup(desc); new->module = m_strdup(modname); new->function = func1; add_to_list((List **)&dcc_dllcommands, (List *)new); break; } default: { if ((mod_type & ~TABLE_PROC) > 0 && (mod_type & ~TABLE_PROC) < NUMBER_OF_GLOBAL_FUNCTIONS) global_table[mod_type & ~TABLE_PROC] = func1; } } return 0; } typedef struct _list2 { struct _list2 *next; char *command; char *name; } List2; static List2 *remove_module(List2 **list, char *name) { register List2 *tmp; List2 *last; last = NULL; for (tmp = *list; tmp; tmp = tmp->next) { if (tmp->name && !strcasecmp(tmp->name, name)) { if (last) last->next = tmp->next; else *list = tmp->next; return (tmp); } last = tmp; } return NULL; } int BX_remove_module_proc(unsigned int mod_type, char *modname, char *procname, char *desc) { int count = 0; switch(mod_type) { case COMMAND_PROC: { IrcCommandDll *ptr; while ((ptr = (IrcCommandDll *)remove_module((List2 **)&dll_commands, modname))) { new_free(&ptr->name); new_free(&ptr->module); new_free(&ptr->server_func); new_free(&ptr->result); new_free(&ptr->help); new_free((char **)&ptr); count++; } break; } case WINDOW_PROC: { WindowDll *ptr; while ((ptr = (WindowDll *)remove_module((List2 **)&dll_window, modname))) { new_free(&ptr->name); new_free(&ptr->module); new_free(&ptr->help); new_free((char **)&ptr); count++; } break; } case OUTPUT_PROC: { Screen *screen; Window *window; default_output_function = BX_add_to_window; for (screen = screen_list; screen; screen = screen->next) { for (window = screen->window_list; window; window = window->next) window->output_func = BX_add_to_window; } default_status_output_function = make_status; for (screen = screen_list; screen; screen = screen->next) { for (window = screen->window_list; window; window = window->next) window->status_output_func = make_status; } count++; break; } case ALIAS_PROC: { BuiltInDllFunctions *ptr; while ((ptr = (BuiltInDllFunctions *)remove_module((List2 **)&dll_functions, modname))) { new_free(&ptr->name); new_free(&ptr->module); new_free((char **)&ptr); count++; } break; } case CTCP_PROC: { CtcpEntryDll *ptr; while ((ptr = (CtcpEntryDll *)remove_module((List2 **)&dll_ctcp, modname))) { new_free(&ptr->name); new_free(&ptr->module); new_free(&ptr->desc); new_free((char **)&ptr); count++; } break; } case VAR_PROC: { IrcVariableDll *ptr; while ((ptr = (IrcVariableDll *)remove_module((List2 **)&dll_variable, modname))) { new_free(&ptr->name); new_free(&ptr->module); new_free(&ptr->string); new_free((char **)&ptr); count++; } break; } case RAW_PROC: { int i; RawDll *ptr = NULL; for (i = 0; i < RAWHASH_SIZE; i++) { while ((ptr = (RawDll *)remove_module((List2 **)&(RawHash[i].list), modname))) { new_free(&ptr->module); new_free(&ptr->name); new_free((char **)&ptr); count++; } } break; } case HOOK_PROC: { extern int remove_dll_hook(char *); count = remove_dll_hook(modname); break; } case DCC_PROC: { DCC_dllcommands *ptr; while ((ptr = (DCC_dllcommands *)remove_module((List2 **)&dcc_dllcommands, modname))) { new_free(&ptr->name); new_free(&ptr->module); new_free(&ptr->help); new_free((char **)&ptr); count++; } break; } default: { if ((mod_type & ~TABLE_PROC) > 0 && (mod_type & ~TABLE_PROC)< NUMBER_OF_GLOBAL_FUNCTIONS) { global_table[mod_type & ~TABLE_PROC] = NULL; count++; } } } return count; } int remove_package(char *name) { Packages *new = NULL; if ((new = (Packages *) remove_from_list((List **)&install_pack, name))) { #if defined(__EMX__) DosFreeModule(new->handle); #elif defined(WINNT) FreeLibrary(new->handle); #elif defined(HPUX) shl_unload(new->handle); #else dlclose(new->handle); #endif new_free(&new->name); new_free(&new->version); new_free((char **)&new); return 1; } return 0; } int check_version(unsigned long required) { unsigned long major, minor, need_major, need_minor; major = bitchx_numver / 10000; minor = (bitchx_numver / 100) % 100; need_major = required / 10000; need_minor = (required / 100) % 100; if (major >= need_major && minor >= need_minor) return 1; return INVALID_MODVERSION; } BUILT_IN_COMMAND(unload_dll) { Packages *new = NULL; int success = 0; char *name; name = next_arg(args, &args); if (name && (new = find_module(name))) { if (new->cleanup) success = (new->cleanup)(&dll_commands, global_table); else { if (new->lock) { bitchsay("Module is locked"); return; } success += remove_module_proc(COMMAND_PROC, name, NULL, NULL); success += remove_module_proc(ALIAS_PROC, name, NULL, NULL); success += remove_module_proc(CTCP_PROC, name, NULL, NULL); success += remove_module_proc(VAR_PROC, name, NULL, NULL); success += remove_module_proc(HOOK_PROC, name, NULL, NULL); success += remove_module_proc(RAW_PROC, name, NULL, NULL); success += remove_module_proc(WINDOW_PROC, name, NULL, NULL); success += remove_module_proc(OUTPUT_PROC, name, NULL, NULL); success += remove_module_proc(DCC_PROC, name, NULL, NULL); success += remove_all_dcc_binds(name); } if (success) { remove_package(name); put_it("%s", convert_output_format("$G Successfully removed [$0 ($1)]", "%s %d", name, success)); } else put_it("%s", convert_output_format("$G Unsuccessful module unload", NULL, NULL)); } else bitchsay("No such module loaded"); } int add_module(unsigned int mod_type, Function * table, char *modname) { Function *p = table; int count = 0; while(p) { add_module_proc(mod_type, modname, p->name, p->desc, p->id, p->flag, p->func1, p->func2); p++;count++; } return count; } #endif