Explorar o código

* Use bsearch() for botcmd_t structs, help_t struct help, and the variable_t struct vars

svn: 3797
Bryan Drewery %!s(int64=18) %!d(string=hai) anos
pai
achega
7ebc6962df
Modificáronse 11 ficheiros con 92 adicións e 84 borrados
  1. 1 0
      doc/UPDATES
  2. 23 2
      src/botcmd.c
  3. 1 0
      src/botcmd.h
  4. 24 14
      src/cmds.c
  5. 10 2
      src/cmds.h
  6. 1 14
      src/dcc.c
  7. 1 6
      src/makehelp.c
  8. 5 12
      src/mod/share.mod/share.c
  9. 5 12
      src/mod/update.mod/update.c
  10. 20 21
      src/set.c
  11. 1 1
      src/tclhash.c

+ 1 - 0
doc/UPDATES

@@ -7,6 +7,7 @@
 * Fix segfault from receiving truncated DNS replies.
 * Remove 'set mean-kicks' and change to 'chanset +meankicks' (default on, does not upgrade from old .set, must unset after upgrade if wanted)
 * Don't check last/promisc unless linked.
+* Speed up botnet parsing / set lookups /cmd_help a bit
 
 1.2.15 - http://wraith.botpack.net/milestone/1.2.15
 * Fix a possible segfault when binaries compiled wrong

+ 23 - 2
src/botcmd.c

@@ -1179,10 +1179,31 @@ botcmd_t C_bot[] =
   {"vab",		bot_setbroad, 0},
   {"w",			bot_who, 0},
   {"z",			bot_zapf, 0},
-  {"zb",		bot_zapfbroad, 0},
-  {NULL,		NULL, 0}
+  {"zb",		bot_zapfbroad, 0}
 };
 
+static int comp_botcmd_t(const void *m1, const void *m2) {
+  const botcmd_t *mi1 = (const botcmd_t *) m1;
+  const botcmd_t *mi2 = (const botcmd_t *) m2;
+  return egg_strcasecmp(mi1->name, mi2->name);
+}
+
+const botcmd_t *search_botcmd_t(const botcmd_t *table, const char* keyString, size_t elements) {
+  botcmd_t key;
+  key.name = keyString;
+  return (const botcmd_t*) bsearch(&key, table, elements, sizeof(botcmd_t), comp_botcmd_t);
+}
+
+void parse_botcmd(int idx, const char* code, const char* msg) {
+  const botcmd_t *cmd = search_botcmd_t((const botcmd_t*)&C_bot, code, sizeof(C_bot)/sizeof(botcmd_t));
+
+  if (cmd) {
+    /* Found a match */
+    if (have_cmd(NULL, cmd->type))
+      (cmd->func) (idx, (char*)msg);
+  }
+}
+
 void send_remote_simul(int idx, char *bot, char *cmd, char *par)
 {
   char msg[SGRAB - 110] = "";

+ 1 - 0
src/botcmd.h

@@ -6,5 +6,6 @@ void send_remote_simul(int, char *, char *, char *);
 void bot_share(int, char *);
 void bot_shareupdate(int, char *);
 void init_botcmd(void);
+void parse_botcmd(int, const char*, const char*);
 
 #endif /* !_BOTCMD_H */

+ 24 - 14
src/cmds.c

@@ -56,6 +56,8 @@ int    			 cmdi = 0;
 
 static char		 *btos(unsigned long);
 
+static help_t *findcmd(const char *, bool);
+
 static void tell_who(int idx, int chan)
 {
   int i, k, ok = 0, atr = dcc[idx].user ? dcc[idx].user->flags : 0;
@@ -542,7 +544,7 @@ static void cmd_bottree(int idx, char *par)
   tell_bottree(idx);
 }
 
-int my_cmp(const mycmds *c1, const mycmds *c2)
+static int my_cmp(const mycmds *c1, const mycmds *c2)
 {
   return strcmp(c1->name, c2->name);
 }
@@ -554,7 +556,7 @@ static void cmd_nohelp(int idx, char *par)
   bind_table_t *table = bind_table_lookup("dcc");
 
   for (entry = table->entries; entry; entry = entry->next) {
-    if (findhelp(entry->mask) == -1) {
+    if (findhelp(entry->mask) == NULL) {
       buf = (char *) my_realloc(buf, strlen(buf) + 2 + strlen(entry->mask) + 1);
       strcat(buf, entry->mask);
       strcat(buf, ", ");
@@ -573,18 +575,25 @@ bool is_restricted_cmd(const char* name) {
   return 0;
 }
 
-int
-findcmd(const char *cmd, bool care_about_type)
+static int comp_help_t(const void *m1, const void *m2) {
+  const help_t *mi1 = (const help_t *) m1;
+  const help_t *mi2 = (const help_t *) m2;
+  return egg_strcasecmp(mi1->cmd, mi2->cmd);
+}
+
+static help_t *
+findcmd(const char *lookup, bool care_about_type)
 {
-  for (int hi = 0; (help[hi].cmd) && (help[hi].desc); hi++)
-    if (!egg_strcasecmp(cmd, help[hi].cmd) && 
-        ((care_about_type && have_cmd(help[hi].cmd, help[hi].type)) || (!care_about_type)))
-      return hi;
+  help_t key;
+  key.cmd = (char*)lookup;
+  help_t *h_entry = (help_t *) bsearch(&key, &help, sizeof(help)/sizeof(help_t), sizeof(help_t), comp_help_t);
+  if (h_entry && ((care_about_type && have_cmd(h_entry->cmd, h_entry->type)) || (!care_about_type)))
+      return h_entry;
 
-  return -1;
+  return NULL;
 }
 
-int
+help_t *
 findhelp(const char *cmd)
 {
   return findcmd(cmd, 1);
@@ -632,11 +641,12 @@ static void cmd_help(int idx, char *par)
         flg[0] = 0;
         build_flags(flg, &(cmdlist[n].flags), NULL);
         dprintf(idx, "Showing you help for '%s' (%s):\n", match, flg);
-        if ((hi = findhelp(match)) != -1) {
-          if (help[hi].garble)
-            showhelp(idx, &fr, degarble(help[hi].garble, help[hi].desc));
+        help_t *h_entry = NULL;
+        if ((h_entry = findhelp(match)) != NULL) {
+          if (h_entry->garble)
+            showhelp(idx, &fr, degarble(h_entry->garble, h_entry->desc));
           else
-            showhelp(idx, &fr, help[hi].desc);
+            showhelp(idx, &fr, h_entry->desc);
         }
         done = 1;
         break;

+ 10 - 2
src/cmds.h

@@ -13,6 +13,13 @@ typedef struct {
   int type;
 } cmd_t;
 
+typedef struct {
+  int type;
+  char *cmd;
+  int garble;
+  char *desc;
+} help_t;
+
 typedef struct {
         const char *name;
         struct flag_record     flags;
@@ -25,6 +32,8 @@ typedef struct {
   int type;
 } botcmd_t;
 
+const botcmd_t *search_botcmd_t(const botcmd_t *table, const char* key, size_t elements);
+
 typedef struct cmd_pass {
   struct cmd_pass *next;
   char *name;
@@ -34,8 +43,7 @@ typedef struct cmd_pass {
 extern mycmds 		cmdlist[]; 
 extern int		cmdi;
 
-int findcmd(const char *, bool);
-int findhelp(const char *);
+help_t* findhelp(const char *);
 int check_dcc_attrs(struct userrec *, flag_t);
 int check_dcc_chanattrs(struct userrec *, char *, flag_t, flag_t);
 int stripmodes(char *);

+ 1 - 14
src/dcc.c

@@ -445,9 +445,6 @@ struct dcc_table DCC_BOT_NEW = {
   NULL
 };
 
-/* Hash function for tandem bot commands */
-extern botcmd_t C_bot[];
-
 static void
 dcc_bot(int idx, char *code, int i)
 {
@@ -469,17 +466,7 @@ dcc_bot(int idx, char *code, int i)
   } else
     msg = "";
 
-  for (i = 0; C_bot[i].name; i++) {
-    int y = egg_strcasecmp(code, C_bot[i].name);
-
-    if (!y) {
-      /* Found a match */
-      if (have_cmd(NULL, C_bot[i].type))
-        (C_bot[i].func) (idx, msg);
-      break;
-    } else if (y < 0)
-      break;
-  }
+  parse_botcmd(idx, code, msg);
 }
 
 static void

+ 1 - 6
src/makehelp.c

@@ -117,12 +117,7 @@ int parse_help(char *infile, char *outfile) {
   fprintf(out, "/* DO NOT EDIT THIS FILE, EDIT misc/help.txt INSTEAD */\n#ifndef HELP_H\n\
 #define HELP_H\n\
 #define STR(x) x\n\
-typedef struct { \n\
-  int type; \n\
-  char *cmd; \n\
-  int garble; \n\
-  char *desc; \n\
-} help_t; \n\
+#include \"cmds.h\"\n\
 \n\
 help_t help[] = \n\
 { \n");

+ 5 - 12
src/mod/share.mod/share.c

@@ -1030,8 +1030,7 @@ static botcmd_t C_share[] = {
   {"un", share_ufno, HUB},
   {"us", share_ufsend, 0},
   {"uy", share_ufyes, HUB},
-  {"v", share_version, 0},
-  {NULL, NULL, 0}
+  {"v", share_version, 0}
 };
 
 
@@ -1039,16 +1038,10 @@ void
 sharein(int idx, char *msg)
 {
   char *code = newsplit(&msg);
-  int y, f = 0, i = 0;
-
-  for (f = 0, i = 0; C_share[i].name && !f; i++) {
-    y = egg_strcasecmp(code, C_share[i].name);
-
-    if (!y)
-      /* Found a match */
-      (C_share[i].func) (idx, msg);
-    if (y < 0)
-      f = 1;
+  const botcmd_t *cmd = search_botcmd_t((const botcmd_t*)&C_share, code, sizeof(C_share)/sizeof(botcmd_t));
+  if (cmd) {
+    /* Found a match */
+    (cmd->func) (idx, msg);
   }
 }
 

+ 5 - 12
src/mod/update.mod/update.c

@@ -151,8 +151,7 @@ static botcmd_t C_update[] =
   {"un",	update_ufno, 0},
   {"us",	update_ufsend, 0},
   {"uy",	update_ufyes, 0},
-  {"v",         update_version, 0},
-  {NULL,	NULL, 0}
+  {"v",         update_version, 0}
 };
 
 static void got_nu(char *botnick, char *code, char *par)
@@ -195,16 +194,10 @@ static cmd_t update_bot[] = {
 void updatein(int idx, char *msg)
 {
   char *code = newsplit(&msg);
-  int y, f = 0, i = 0;
-
-  for (f = 0, i = 0; C_update[i].name && !f; i++) {
-    y = egg_strcasecmp(code, C_update[i].name);
-
-    if (!y)
-      /* Found a match */
-      (C_update[i].func)(idx, msg);
-    if (y < 0)
-      f = 1;
+  const botcmd_t *cmd = search_botcmd_t((const botcmd_t*)&C_update, code, sizeof(C_update)/sizeof(botcmd_t));
+  if (cmd) {
+    /* Found a match */
+    (cmd->func)(idx, msg);
   }
 }
 

+ 20 - 21
src/set.c

@@ -62,32 +62,30 @@ bool manop_warn;
 char homechan[51] = "";
 char usermode[15] = "";
 
+// VAR("bad-process",	&badprocess,		VAR_INT|VAR_DETECTED,				0, 4, "ignore"),
+// VAR("process-list",	process_list,		VAR_STRING|VAR_LIST,				0, 0, NULL),
 static variable_t vars[] = {
  VAR("alias", 		alias,			VAR_STRING|VAR_LIST|VAR_NOLOC|VAR_PERM,		0, 0, DEFAULT_ALIAS),
  VAR("altchars",	altchars,		VAR_STRING|VAR_NOLHUB,				0, 0, "-_\\`^[]"),
  VAR("auth-chan",	&auth_chan,		VAR_INT|VAR_BOOL|VAR_NOLHUB,			0, 1, "1"),
  VAR("auth-key",	auth_key,		VAR_STRING|VAR_PERM,				0, 0, NULL),
- VAR("auth-prefix",	auth_prefix,		VAR_STRING|VAR_NOLHUB|VAR_PERM,			0, 0, "+"),
  VAR("auth-obscure",	&auth_obscure,		VAR_INT|VAR_BOOL,				0, 1, "0"),
- VAR("dcc-autoaway",	&dcc_autoaway,		VAR_INT|VAR_NOLOC,				0, (5*60*60), "1800"),
-#ifdef NOT_USED
- VAR("bad-process",	&badprocess,		VAR_INT|VAR_DETECTED,				0, 4, "ignore"),
-#endif
- VAR("dccauth",		&dccauth,		VAR_INT|VAR_BOOL,				0, 1, "0"),
+ VAR("auth-prefix",	auth_prefix,		VAR_STRING|VAR_NOLHUB|VAR_PERM,			0, 0, "+"),
  VAR("chanset",		glob_chanset,		VAR_STRING|VAR_CHANSET|VAR_NOLHUB,		0, 0, NULL),
  VAR("cloak-script",	&cloak_script,		VAR_INT|VAR_CLOAK|VAR_NOLHUB,			0, 10, "0"),
  VAR("close-threshold",	&close_threshold,	VAR_RATE|VAR_NOLOC,				0, 0, "0:0"),
+ VAR("dcc-autoaway",	&dcc_autoaway,		VAR_INT|VAR_NOLOC,				0, (5*60*60), "1800"),
+ VAR("dccauth",		&dccauth,		VAR_INT|VAR_BOOL,				0, 1, "0"),
  VAR("fight-threshold",	&fight_threshold,	VAR_INT|VAR_NOLOC,				0, 0, "0"),
- VAR("flood-msg",	&flood_msg,		VAR_RATE|VAR_NOLHUB,				0, 0, "5:60"),
  VAR("flood-ctcp",	&flood_ctcp,		VAR_RATE|VAR_NOLHUB,				0, 0, "3:60"),
  VAR("flood-g",		&flood_g,		VAR_RATE|VAR_NOLHUB,				0, 0, "6:2"),
+ VAR("flood-msg",	&flood_msg,		VAR_RATE|VAR_NOLHUB,				0, 0, "5:60"),
  VAR("fork-interval",	&fork_interval,		VAR_INT,					10, 0, "0"),
  VAR("hijack",		&hijack,		VAR_INT|VAR_DETECTED|VAR_PERM,			0, 4, "die"),
  VAR("homechan",	homechan,		VAR_STRING|VAR_NOLOC|VAR_HIDE,			0, 0, NULL),
  VAR("ident-botnick",   &ident_botnick,		VAR_INT|VAR_BOOL|VAR_NOLHUB,			0, 1, "0"),
  VAR("in-bots",		&in_bots,		VAR_INT|VAR_NOLOC,				1, MAX_BOTS, "2"),
  VAR("irc-autoaway",	&irc_autoaway,		VAR_INT|VAR_NOLHUB|VAR_BOOL,			0, 1, "1"),
- VAR("notify-time",	&ison_time,		VAR_INT|VAR_NOLHUB,				1, 30, "10"),
  VAR("kill-threshold",	&kill_threshold,	VAR_INT|VAR_NOLOC,				0, 0, "0"),
  VAR("lag-threshold",	&lag_threshold,		VAR_INT|VAR_NOLHUB,				0, 0, "15"),
  VAR("login",		&login,			VAR_INT|VAR_DETECTED,				0, 4, "warn"),
@@ -98,21 +96,17 @@ static variable_t vars[] = {
  VAR("msg-op",		msgop,			VAR_STRING|VAR_NOLHUB,				0, 0, NULL),
  VAR("msg-pass",	msgpass,		VAR_STRING|VAR_NOLHUB,				0, 0, NULL),
  VAR("nick",		origbotname,		VAR_STRING|VAR_NOLHUB|VAR_NICK|VAR_NODEF|VAR_NOGHUB,	0, 0, NULL),
+ VAR("notify-time",	&ison_time,		VAR_INT|VAR_NOLHUB,				1, 30, "10"),
  VAR("oidentd",		&oidentd,		VAR_INT|VAR_BOOL|VAR_NOLHUB,			0, 1, "0"),
  VAR("op-bots",		&op_bots,		VAR_INT|VAR_NOLOC,				1, MAX_BOTS, "1"),
  VAR("op-requests",	&op_requests,		VAR_RATE|VAR_NOLOC,				0, 0, "2:5"),
-#ifdef NOT_USED
- VAR("process-list",	process_list,		VAR_STRING|VAR_LIST,				0, 0, NULL),
-#endif
  VAR("promisc",		&promisc,		VAR_INT|VAR_DETECTED,				0, 4, "warn"),
  VAR("realname",	botrealname,		VAR_STRING|VAR_NOLHUB,				0, 0, "* I'm too lame to read BitchX.doc *"),
  VAR("server-port",	&default_port,		VAR_INT|VAR_SHORT|VAR_NOLHUB,			0, 65535, "6667"),
  VAR("servers",		&serverlist,		VAR_SERVERS|VAR_LIST|VAR_SHUFFLE|VAR_NOLHUB|VAR_NOLDEF,	0, 0, DEFAULT_SERVERS),
  VAR("servers6",	&serverlist,		VAR_SERVERS|VAR_LIST|VAR_SHUFFLE|VAR_NOLHUB|VAR_NOLDEF,	0, 0, DEFAULT_SERVERS6),
  VAR("trace",		&trace,			VAR_INT|VAR_DETECTED,				0, 4, "die"),
- VAR("usermode",	&usermode,		VAR_STRING|VAR_NOLHUB,				0, 0, "+iws"),
-// {NULL, NULL, 0, 0, NULL, NULL, 0, NULL, 0, 0}
- VAR(NULL,		0,			0,						0, 0, 0)
+ VAR("usermode",	&usermode,		VAR_STRING|VAR_NOLHUB,				0, 0, "+iws")
 };
 
 
@@ -130,6 +124,7 @@ static bool use_server_type(const char *name)
   return 1;
 }
 
+#ifdef NOT_USED
 const char *var_find_by_mem(void *mem)
 {
   int i = 0;
@@ -140,6 +135,7 @@ const char *var_find_by_mem(void *mem)
   }
   return "";  
 }
+#endif
 
 /* sanitize the variable data string */
 char *var_sanitize(variable_t *var, const char *data)
@@ -402,14 +398,17 @@ const char *var_string(variable_t *var)
   return data;
 }
 
-static variable_t *var_get_var_by_name(const char *name)
-{
-  int i = 0;
+static int comp_variable_t(const void *m1, const void *m2) {
+  const variable_t *mi1 = (const variable_t *) m1;
+  const variable_t *mi2 = (const variable_t *) m2;
+  return egg_strcasecmp(mi1->name, mi2->name);
+}
 
-  for (i = 0; vars[i].name; i++)
-    if (!egg_strcasecmp(vars[i].name, name))
-      return &(vars[i]);
-  return NULL;
+static inline variable_t *var_get_var_by_name(const char *name)
+{
+  variable_t key;
+  key.name = name;
+  return (variable_t*) bsearch(&key, &vars, sizeof(vars)/sizeof(variable_t), sizeof(variable_t), comp_variable_t);
 }
 
 void var_set(variable_t *var, const char *target, const char *datain)

+ 1 - 1
src/tclhash.c

@@ -454,7 +454,7 @@ void add_builtins(const char *table_name, cmd_t *cmds)
 	for (; cmds->name; cmds++) {
           if (have_cmd(cmds->name, cmds->type)) {
                 /* add BT_dcc cmds to cmdlist[] :: add to the help system.. */
-                if (!strcmp(table->name, "dcc") && (findhelp(cmds->name) != -1)) {
+                if (!strcmp(table->name, "dcc") && (findhelp(cmds->name) != NULL)) {
                   cmdlist[cmdi].name = cmds->name;
                   cmdlist[cmdi].flags.match = FR_GLOBAL | FR_CHAN;
                   break_down_flags(cmds->flags, &(cmdlist[cmdi].flags), NULL);