Apply minor fixes from patches@, SF tracker, and others.
[ircu2.10.12-pk.git] / ircd / send.c
index 4d562b715c9984e24f0e30f0ed10a7109755d00a..7a79fbaa493818eea10d1ba4fd11f76749a527bd 100644 (file)
@@ -403,7 +403,7 @@ void sendcmdto_common_channels_butone(struct Client *from, const char *cmd,
    * loop through from's channels, and the members on their channels
    */
   for (chan = cli_user(from)->channel; chan; chan = chan->next_channel) {
-    if (IsZombie(chan))
+    if (IsZombie(chan) || IsDelayedJoin(chan))
       continue;
     for (member = chan->channel->members; member;
         member = member->next_member)
@@ -426,11 +426,12 @@ void sendcmdto_common_channels_butone(struct Client *from, const char *cmd,
  * by <to>; <tok> is ignored by this function
  *
  * Update: don't send to 'one', if any. --Vampire
+ * Update: use 'skip' like sendcmdto_channel_butone. --Entrope
  */
 void sendcmdto_channel_butserv_butone(struct Client *from, const char *cmd,
                                      const char *tok, struct Channel *to,
-                                     struct Client *one, const char *pattern,
-                                     ...)
+                                     struct Client *one, unsigned int skip,
+                                      const char *pattern, ...)
 {
   struct VarData vd;
   struct MsgBuf *mb;
@@ -445,13 +446,56 @@ void sendcmdto_channel_butserv_butone(struct Client *from, const char *cmd,
 
   /* send the buffer to each local channel member */
   for (member = to->members; member; member = member->next_member) {
-    if (MyConnect(member->user) && member->user != one && !IsZombie(member))
+    if (!MyConnect(member->user)
+        || member->user == one 
+        || IsZombie(member)
+        || (skip & SKIP_DEAF && IsDeaf(member->user))
+        || (skip & SKIP_NONOPS && !IsChanOp(member))
+        || (skip & SKIP_NONVOICES && !IsChanOp(member) && !HasVoice(member)))
+        continue;
       send_buffer(member->user, mb, 0);
   }
 
   msgq_clean(mb);
 }
 
+/*
+ * Send a (prefixed) command to all servers with users on the channel
+ * specified by <to>; <cmd> and <skip> are ignored by this function.
+ *
+ * XXX sentalong_marker used XXX
+ */
+void sendcmdto_channel_servers_butone(struct Client *from, const char *cmd,
+                                      const char *tok, struct Channel *to,
+                                      struct Client *one, unsigned int skip,
+                                      const char *pattern, ...)
+{
+  struct VarData vd;
+  struct MsgBuf *serv_mb;
+  struct Membership *member;
+
+  /* build the buffer */
+  vd.vd_format = pattern;
+  va_start(vd.vd_args, pattern);
+  serv_mb = msgq_make(&me, "%:#C %s %v", from, tok, &vd);
+  va_end(vd.vd_args);
+
+  /* send the buffer to each server */
+  sentalong_marker++;
+  for (member = to->members; member; member = member->next_member) {
+    if (cli_from(member->user) == one
+        || MyConnect(member->user)
+        || IsZombie(member)
+        || cli_fd(cli_from(member->user)) < 0
+        || sentalong[cli_fd(cli_from(member->user))] == sentalong_marker)
+      continue;
+    sentalong[cli_fd(cli_from(member->user))] = sentalong_marker;
+    send_buffer(member->user, serv_mb, 0);
+  }
+  msgq_clean(serv_mb);
+}
+
+
 /*
  * Send a (prefixed) command to all users on this channel, including
  * remote users; users to skip may be specified by setting appropriate
@@ -701,7 +745,7 @@ void vsendto_opmask_butone(struct Client *one, unsigned int mask,
    * this is ok...
    */
   vd.vd_format = pattern;
-  vd.vd_args = vl;
+  va_copy(vd.vd_args, vl);
   mb = msgq_make(0, ":%s " MSG_NOTICE " * :*** Notice -- %v", cli_name(&me),
                 &vd);