diff --git a/Changelog b/Changelog index ddb6de7..2ee5278 100644 --- a/Changelog +++ b/Changelog @@ -1,5 +1,8 @@ [Changes 1.2.2] +* Only echo sent WALLOPS if we are _not_ +w, because otherwise the server will + echo it to us anyway. (caf) + * Fix problem where reconnecting to SSL servers could stall. (caf) * Fix memory leak when reconnecting to SSL servers. (caf) diff --git a/include/module.h b/include/module.h index 5cf7154..dade961 100644 --- a/include/module.h +++ b/include/module.h @@ -10,7 +10,7 @@ * if we change the table below, we change this module number to the * current date (YYYYMMDDxx where xx is a serial number). */ -#define MODULE_VERSION 2017120601UL +#define MODULE_VERSION 2017120602UL #include "struct.h" @@ -285,7 +285,7 @@ enum FUNCTION_VALUE GET_SERVER_MOTD, GET_SERVER_OPERATOR, GET_SERVER_VERSION, - GET_SERVER_FLAG, + GET_SERVER_UMODE, GET_SERVER_PORT, GET_SERVER_LAG, GET_SERVER2_8, diff --git a/include/modval.h b/include/modval.h index 5ded180..3d4e87b 100644 --- a/include/modval.h +++ b/include/modval.h @@ -532,7 +532,7 @@ extern Function_ptr *global; #define get_server_motd (*(int (*)(int ))global[GET_SERVER_MOTD]) #define get_server_operator (*(int (*)(int ))global[GET_SERVER_OPERATOR]) #define get_server_version (*(int (*)(int ))global[GET_SERVER_VERSION]) -#define get_server_flag (*(int (*)(int , int ))global[GET_SERVER_FLAG]) +#define get_server_umode (*(int (*)(int , char))global[GET_SERVER_UMODE]) #define get_server_port (*(int (*)(int ))global[GET_SERVER_PORT]) #define get_server_lag (*(int (*)(int ))global[GET_SERVER_LAG]) #define get_server2_8 (*(int (*)(int ))global[GET_SERVER2_8]) diff --git a/include/server.h b/include/server.h index 40ecdd8..bcc4fd0 100644 --- a/include/server.h +++ b/include/server.h @@ -270,7 +270,7 @@ extern SGroup *server_group_list; void clear_sent_to_server (int); int sent_to_server (int); void BX_update_server_umode (int, char, int); - int BX_get_server_flag (int, int); + int BX_get_server_umode (int, char); char * get_server_userhost (int); void got_my_userhost (UserhostItem *item, char *nick, char *stuff); void BX_set_server_version (int, int); @@ -387,36 +387,7 @@ struct sockaddr_foobar get_server_uh_addr (int); // void set_server_sasl_pass(int, const char *); char *get_server_sasl_pass(int); -#define USER_MODE 0x0001 -#define USER_MODE_A USER_MODE << 0 -#define USER_MODE_B USER_MODE << 1 -#define USER_MODE_C USER_MODE << 2 -#define USER_MODE_D USER_MODE << 3 -#define USER_MODE_E USER_MODE << 4 -#define USER_MODE_F USER_MODE << 5 -#define USER_MODE_G USER_MODE << 6 -#define USER_MODE_H USER_MODE << 7 -#define USER_MODE_I USER_MODE << 8 -#define USER_MODE_J USER_MODE << 9 -#define USER_MODE_K USER_MODE << 10 -#define USER_MODE_L USER_MODE << 11 -#define USER_MODE_M USER_MODE << 12 -#define USER_MODE_N USER_MODE << 13 -#define USER_MODE_O USER_MODE << 14 -#define USER_MODE_P USER_MODE << 15 -#define USER_MODE_Q USER_MODE << 16 -#define USER_MODE_R USER_MODE << 17 -#define USER_MODE_S USER_MODE << 18 -#define USER_MODE_T USER_MODE << 19 -#define USER_MODE_U USER_MODE << 20 -#define USER_MODE_V USER_MODE << 21 -#define USER_MODE_W USER_MODE << 22 -#define USER_MODE_X USER_MODE << 23 -#define USER_MODE_Y USER_MODE << 24 -#define USER_MODE_Z USER_MODE << 25 - -#define SF_LOGGED_IN (USER_MODE << 29) -extern const char *umodes; +#define SF_LOGGED_IN 0x0001U #define IMMED_SEND 0 #define QUEUE_SEND 1 diff --git a/source/commands.c b/source/commands.c index f7fb085..74734cb 100644 --- a/source/commands.c +++ b/source/commands.c @@ -3251,7 +3251,10 @@ BUILT_IN_COMMAND(e_wall) set_display_target(NULL, LOG_WALLOP); send_to_server("%s :%s", command, args); - if (get_server_flag(from_server, USER_MODE_W)) + + /* Only show the message if we are _not_ +w, because if we are the server + * will echo our WALLOPS back to us. */ + if (!get_server_umode(from_server, 'w')) put_it("!! %s", args); add_last_type(&last_sent_wall[0], 1, get_server_nickname(from_server), NULL, "*", args); reset_display_target(); diff --git a/source/modules.c b/source/modules.c index 5380f6d..577e837 100644 --- a/source/modules.c +++ b/source/modules.c @@ -281,7 +281,7 @@ static int already_done = 0; 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_SERVER_UMODE] = (Function_ptr) BX_get_server_umode; 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; diff --git a/source/server.c b/source/server.c index 45a994a..bfe7418 100644 --- a/source/server.c +++ b/source/server.c @@ -57,7 +57,7 @@ CVS_REVISION(server_c) static char * set_umode (int du_index); -const char * umodes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; +static const char umodes[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; /* server_list: the list of servers that the user can connect to,etc */ Server *server_list = NULL; @@ -2007,53 +2007,68 @@ time_t get_server_awaytime(int server) return server_list[server].awaytime; } +static int umode_index(char mode) +{ + const char *p = strchr(umodes, mode); + + if (p) + return p - umodes; + else + return -1; +} + /* update_server_umode() * * Updates the client's idea of the status of a single umode flag. */ void BX_update_server_umode(int server, char mode, int value) { - const char *p = strchr(umodes, mode); + const int flag = umode_index(mode); if (server <= -1 || server > number_of_servers) return; - if (p) - { - const int flag = p - umodes; - - if (flag > 31) - { - if (value) - server_list[server].flags2 |= 0x1L << (flag - 32); - else - server_list[server].flags2 &= ~(0x1L << (flag - 32)); - } - else - { - if (value) - server_list[server].flags |= 0x1L << flag; - else - server_list[server].flags &= ~(0x1L << flag); - } - set_umode(server); - } - else + if (flag < 0) { yell("Ignoring invalid user mode '%c' from server", mode); + return; } -} - -int BX_get_server_flag (int gsf_index, int flag) -{ - if (gsf_index == -1) - gsf_index = primary_server; - else if (gsf_index >= number_of_servers) - return 0; + if (flag > 31) - return !!(server_list[gsf_index].flags2 & (0x1L << (flag - 32))); + { + if (value) + server_list[server].flags2 |= 0x1L << (flag - 32); + else + server_list[server].flags2 &= ~(0x1L << (flag - 32)); + } else - return !!(server_list[gsf_index].flags & (0x1L << flag)); + { + if (value) + server_list[server].flags |= 0x1L << flag; + else + server_list[server].flags &= ~(0x1L << flag); + } + set_umode(server); +} + +/* get_server_umode() + * + * Returns the status (set/unset) of a given umode flag. + */ +int BX_get_server_umode(int server, char mode) +{ + const int flag = umode_index(mode); + + if (server <= -1 || server > number_of_servers) + return 0; + + if (flag < 0) + return 0; + + if (flag > 31) + return !!(server_list[server].flags2 & (0x1L << (flag - 32))); + else + return !!(server_list[server].flags & (0x1L << flag)); } /*