Sfoglia il codice sorgente

* Ported [2786] [2787] [2788] [2789] to 1.2.10
* Fixed cmd_set not saving the userfile when needed. (fixes #245)
* Fixed cmd_set list removal bugs. (fixes #246)


svn: 2790

Bryan Drewery 20 anni fa
parent
commit
ec7c7a48fb
5 ha cambiato i file con 40 aggiunte e 27 eliminazioni
  1. 2 0
      doc/UPDATES
  2. 1 1
      misc/help.txt
  3. 4 2
      src/cmds.c
  4. 32 23
      src/set.c
  5. 1 1
      src/set.h

+ 2 - 0
doc/UPDATES

@@ -15,6 +15,8 @@ Lines prefixed with '-' were disabled before release and are not finished, or ar
 * Fixed cmd_trace not displaying hops correctly.
 * Fixed cmd_trace not displaying hops correctly.
 * Expand symbolic links when searching for tempdirs. (fixes #210)
 * Expand symbolic links when searching for tempdirs. (fixes #210)
 * Fixed a segfault in cmd_rehash and revised help listing for it. (fixes #242)
 * Fixed a segfault in cmd_rehash and revised help listing for it. (fixes #242)
+* Fixed cmd_set not saving the userfile when needed. (fixes #245)
+* Fixed cmd_set list removal bugs. (fixes #246)
 
 
 1.2.9 - http://tracker.shatow.net/milestone/1.2.9
 1.2.9 - http://tracker.shatow.net/milestone/1.2.9
 * Fixed cmd_[un]stick not properly using numbers for channel masks. (#160)
 * Fixed cmd_[un]stick not properly using numbers for channel masks. (#160)

+ 1 - 1
misc/help.txt

@@ -1392,7 +1392,7 @@ See also: color, console, echo, login, strip
 See also: md5, sha1, encrypt, decrypt
 See also: md5, sha1, encrypt, decrypt
 ::rehash
 ::rehash
 ###  $brehash$b 
 ###  $brehash$b 
-   Don't use this cmd if you don't know what it does.
+   Don't use this cmd.
 
 
    Reloads config data from binary. (Probably won't be needed as this is automatically
    Reloads config data from binary. (Probably won't be needed as this is automatically
    updated after editing the binary with -C)
    updated after editing the binary with -C)

+ 4 - 2
src/cmds.c

@@ -223,7 +223,8 @@ static void cmd_botset(int idx, char *par)
     return;
     return;
   }
   }
   
   
-  cmd_set_real(botnick, idx, par);
+  if (cmd_set_real(botnick, idx, par))
+    write_userfile(idx);
   return;
   return;
 }
 }
 
 
@@ -233,7 +234,8 @@ static void cmd_set(int idx, char *par)
 //    dprintf(idx, "Usage: set [<+/->list] <var> [data]\n");
 //    dprintf(idx, "Usage: set [<+/->list] <var> [data]\n");
 //    return;
 //    return;
 //  }
 //  }
-  cmd_set_real(NULL, idx, par);
+  if (cmd_set_real(NULL, idx, par))
+    write_userfile(idx);
   return;
   return;
 }
 }
 
 

+ 32 - 23
src/set.c

@@ -582,6 +582,8 @@ static char *var_rem_list(const char *botnick, variable_t *var, const char *elem
 {
 {
   static char ret[101] = "";
   static char ret[101] = "";
 
 
+  ret[0] = 0;
+
   if (!element)
   if (!element)
     return ret;
     return ret;
 
 
@@ -597,29 +599,36 @@ static char *var_rem_list(const char *botnick, variable_t *var, const char *elem
     return 0;
     return 0;
 
 
   const char *delim = ",";
   const char *delim = ",";
-  int num = 0, i = 1;
+  int num = 0, i = 0;
 
 
   if (str_isdigit(element))
   if (str_isdigit(element))
     num = atoi(element);
     num = atoi(element);
 
 
   olddata = olddatap = strdup(olddatacp);
   olddata = olddatap = strdup(olddatacp);
-  size_t osiz = strlen(olddata), esiz = strlen(element) + 1, tsiz = osiz - esiz + 1;          // element + ,
+  size_t tsiz = strlen(olddata) + 1;
 
 
   data = (char *) my_calloc(1, tsiz);
   data = (char *) my_calloc(1, tsiz);
 
 
   while ((word = strsep(&olddata, delim))) {
   while ((word = strsep(&olddata, delim))) {
+    ++i;
+
     if ((num && num != i) || (!num && egg_strcasecmp(word, element))) {
     if ((num && num != i) || (!num && egg_strcasecmp(word, element))) {
-      if (data && data[0])
+      /* Reconstruct the left and right part of the list...*/
+      if (data && data[0] && word && word[0])
         simple_snprintf(data, tsiz, "%s,%s", data, word);
         simple_snprintf(data, tsiz, "%s,%s", data, word);
       else
       else
         simple_snprintf(data, tsiz, "%s", word);
         simple_snprintf(data, tsiz, "%s", word);
-    } else
+    } else  /* minus the part we are removing ... */
       simple_snprintf(ret, sizeof(ret), "%s", word);
       simple_snprintf(ret, sizeof(ret), "%s", word);
-    i++;
   }
   }
-  var_set(var, botnick, data);
-  if (botnick)
-    var_set_userentry(botnick, var->name, data);
+
+  if (num <= i && ret[0]) {
+    var_set(var, botnick, data);
+    if (botnick)
+      var_set_userentry(botnick, var->name, data);
+  } else
+    ret[0] = 0;
+ 
   free(data);
   free(data);
   free(olddatap);
   free(olddatap);
   return ret;
   return ret;
@@ -650,7 +659,7 @@ bool write_vars_and_cmdpass(FILE *f, int idx)
 #define LIST_ADD  1
 #define LIST_ADD  1
 #define LIST_RM   2
 #define LIST_RM   2
 #define LIST_SHOW 3
 #define LIST_SHOW 3
-void cmd_set_real(const char *botnick, int idx, char *par)
+int cmd_set_real(const char *botnick, int idx, char *par)
 {
 {
   variable_t *var = NULL;
   variable_t *var = NULL;
   char *name = NULL;
   char *name = NULL;
@@ -686,7 +695,7 @@ void cmd_set_real(const char *botnick, int idx, char *par)
     else {
     else {
       if (!par[0]) {
       if (!par[0]) {
         dprintf(idx, "A variable must be specified!\n");
         dprintf(idx, "A variable must be specified!\n");
-        return;
+        return 0;
       }
       }
       name = newsplit(&par);
       name = newsplit(&par);
     }
     }
@@ -697,7 +706,7 @@ void cmd_set_real(const char *botnick, int idx, char *par)
       data = (const char *) par;
       data = (const char *) par;
     else if (!par[0] && list) {
     else if (!par[0] && list) {
       dprintf(idx, "A value must be specified!\n");
       dprintf(idx, "A value must be specified!\n");
-      return;
+      return 0;
     }
     }
   } else if (par[0] && list && list == LIST_SHOW) {
   } else if (par[0] && list && list == LIST_SHOW) {
     dprintf(idx, "Data value ignored for listing.\n");
     dprintf(idx, "Data value ignored for listing.\n");
@@ -705,12 +714,12 @@ void cmd_set_real(const char *botnick, int idx, char *par)
 
 
   if (name && !(var = var_get_var_by_name(name))) {
   if (name && !(var = var_get_var_by_name(name))) {
     dprintf(idx, "No such variable: %s\n", name);
     dprintf(idx, "No such variable: %s\n", name);
-    return;
+    return 0;
   }
   }
 
 
   if (list && !(var->flags & VAR_LIST)) {
   if (list && !(var->flags & VAR_LIST)) {
     dprintf(idx, "That variable is not a list!\n");
     dprintf(idx, "That variable is not a list!\n");
-    return;
+    return 0;
   }
   }
   
   
   struct userrec *botu = NULL;
   struct userrec *botu = NULL;
@@ -764,24 +773,24 @@ void cmd_set_real(const char *botnick, int idx, char *par)
           dprintf(idx, "%sbotset %s -YES %s ...\n", settings.dcc_prefix, botnick, var->name);
           dprintf(idx, "%sbotset %s -YES %s ...\n", settings.dcc_prefix, botnick, var->name);
         else
         else
           dprintf(idx, "%sset -YES %s ...\n", settings.dcc_prefix, var->name);
           dprintf(idx, "%sset -YES %s ...\n", settings.dcc_prefix, var->name);
-        return;
+        return 0;
       }
       }
     }
     }
     if (botnick) {
     if (botnick) {
       if (var->flags & VAR_NOLOC) {
       if (var->flags & VAR_NOLOC) {
         dprintf(idx, "Sorry, cannot set '%s' locally.\n", var->name);
         dprintf(idx, "Sorry, cannot set '%s' locally.\n", var->name);
-        return;
+        return 0;
       }
       }
 
 
       if (ishub && (var->flags & VAR_NOLHUB)) {
       if (ishub && (var->flags & VAR_NOLHUB)) {
         dprintf(idx, "Sorry, cannot set '%s' locally for hubs.\n", var->name);
         dprintf(idx, "Sorry, cannot set '%s' locally for hubs.\n", var->name);
-        return;
+        return 0;
       }
       }
     }
     }
 
 
     if ((var->flags & VAR_PERM) && !isowner(dcc[idx].nick)) {
     if ((var->flags & VAR_PERM) && !isowner(dcc[idx].nick)) {
       dprintf(idx, "Sorry, only permanent owners may set '%s'.\n", var->name);
       dprintf(idx, "Sorry, only permanent owners may set '%s'.\n", var->name);
-      return;
+      return 0;
     }
     }
 
 
     if (!strcmp(data, "-"))
     if (!strcmp(data, "-"))
@@ -802,18 +811,18 @@ void cmd_set_real(const char *botnick, int idx, char *par)
       if (list == LIST_ADD) {
       if (list == LIST_ADD) {
         if (var_add_list(botnick, var, data)) {
         if (var_add_list(botnick, var, data)) {
           dprintf(idx, "Added '%s' to %s list.\n", data, var->name);
           dprintf(idx, "Added '%s' to %s list.\n", data, var->name);
-          return;
+          return 1;
         }
         }
       } else if (list == LIST_RM) {
       } else if (list == LIST_RM) {
         char *expanded_data = NULL;
         char *expanded_data = NULL;
 
 
         if ((expanded_data = var_rem_list(botnick, var, data)) && expanded_data[0]) {
         if ((expanded_data = var_rem_list(botnick, var, data)) && expanded_data[0]) {
           dprintf(idx, "Removed '%s' from %s list.\n", expanded_data, var->name);
           dprintf(idx, "Removed '%s' from %s list.\n", expanded_data, var->name);
-          return;
+          return 1;
         }
         }
       }
       }
-        dprintf(idx, "Failed to modify %s list.\n", var->name);
-
+      dprintf(idx, "Failed to modify %s list.\n", var->name);
+      return 0;
     } else {
     } else {
       var_set(var, botnick, data);
       var_set(var, botnick, data);
       if (botnick)
       if (botnick)
@@ -821,7 +830,7 @@ void cmd_set_real(const char *botnick, int idx, char *par)
 
 
       dprintf(idx, "%s: %s\n", name, botnick ? (!data || (data[0] == '-') ? "(not set)" : data) : (var->gdata ? var->gdata : "(not set)"));
       dprintf(idx, "%s: %s\n", name, botnick ? (!data || (data[0] == '-') ? "(not set)" : data) : (var->gdata ? var->gdata : "(not set)"));
     }
     }
-    if (conf.bot->hub)
-      write_userfile(idx);
+    return 1;
   }
   }
+  return 0;
 }
 }

+ 1 - 1
src/set.h

@@ -70,6 +70,6 @@ void var_parse_my_botset();
 void init_vars();
 void init_vars();
 void var_set_by_name(const char *, const char *, const char *);
 void var_set_by_name(const char *, const char *, const char *);
 void var_set_userentry(const char *, const char *, const char *);
 void var_set_userentry(const char *, const char *, const char *);
-void cmd_set_real(const char *, int idx, char *);
+int cmd_set_real(const char *, int idx, char *);
 
 
 #endif /* !_SET_H */
 #endif /* !_SET_H */