* note: it is guaranteed that parv[0]..parv[parc-1] are all
* non-NULL pointers.
*/
-#if 0
-/*
- * No need to include handlers.h here the signatures must match
- * and we don't need to force a rebuild of all the handlers everytime
- * we add a new one to the list. --Bleep
- */
-#include "handlers.h"
-#endif /* 0 */
+#include "config.h"
+
#include "client.h"
#include "jupe.h"
#include "hash.h"
#include "ircd.h"
+#include "ircd_features.h"
+#include "ircd_log.h"
#include "ircd_reply.h"
#include "ircd_string.h"
#include "match.h"
#include "s_conf.h"
#include "s_misc.h"
#include "send.h"
-#include "support.h"
-#include <assert.h>
+/* #include <assert.h> -- Now using assert in ircd_log.h */
#include <stdlib.h>
#include <string.h>
{
struct Client *acptr = 0;
struct Jupe *ajupe;
- int local = 0, active = 1;
+ unsigned int flags = 0;
time_t expire_off, lastmod;
char *server = parv[2], *target = parv[1], *reason = parv[5];
return 0; /* no such server */
if (!IsMe(acptr)) { /* manually propagate, since we don't set it */
- if (IsServer(sptr))
- sendto_one(acptr, "%s " TOK_JUPE " %s %s %s %s :%s", NumServ(sptr),
- target, server, parv[3], parv[4], reason);
- else
- sendto_one(acptr, "%s%s " TOK_JUPE " %s %s %s %s :%s", NumNick(sptr),
- target, server, parv[3], parv[4], reason);
-
+ sendcmdto_one(sptr, CMD_JUPE, acptr, "%s %s %s %s :%s", target, server,
+ parv[3], parv[4], reason);
return 0;
}
- local = 1;
+ flags |= JUPE_LOCAL;
}
- if (*server == '-') {
- active = 0;
+ if (*server == '-')
server++;
- } else if (*server == '+') {
- active = 1;
+ else if (*server == '+') {
+ flags |= JUPE_ACTIVE;
server++;
}
ajupe = jupe_find(server);
if (ajupe) {
- if (JupeIsLocal(ajupe) && !local) /* global jupes override local ones */
+ if (JupeIsLocal(ajupe) && !(flags & JUPE_LOCAL)) /* global over local */
jupe_free(ajupe);
else if (JupeLastMod(ajupe) < lastmod) { /* new modification */
- if (active)
- return jupe_activate(cptr, sptr, ajupe, lastmod);
+ if (flags & JUPE_ACTIVE)
+ return jupe_activate(cptr, sptr, ajupe, lastmod, flags);
else
- return jupe_deactivate(cptr, sptr, ajupe, lastmod);
- } else if (JupeLastMod(ajupe) == lastmod) /* no changes */
+ return jupe_deactivate(cptr, sptr, ajupe, lastmod, flags);
+ } else if (JupeLastMod(ajupe) == lastmod || IsBurstOrBurstAck(cptr))
return 0;
else
return jupe_resend(cptr, ajupe); /* other server desynched WRT jupes */
}
- return jupe_add(cptr, sptr, server, reason, expire_off, lastmod, local,
- active);
+ return jupe_add(cptr, sptr, server, reason, expire_off, lastmod, flags);
}
/*
* mo_jupe - oper message handler
*
* parv[0] = Send prefix
+ * parv[1] = [[+|-]<server name>]
*
- * From oper:
+ * Local (to me) style:
+ *
+ * parv[2] = [Expiration offset]
+ * parv[3] = [Comment]
+ *
+ * Global (or remote local) style:
*
- * parv[1] = [[+|-]<server name>]
* parv[2] = [target]
* parv[3] = [Expiration offset]
* parv[4] = [Comment]
{
struct Client *acptr = 0;
struct Jupe *ajupe;
- int local = 0, active = 1;
+ unsigned int flags = 0;
time_t expire_off;
- char *server = parv[1], *target = parv[2], *reason = parv[4];
+ char *server = parv[1], *target = 0, *reason;
if (parc < 2)
return jupe_list(sptr, 0);
if (*server == '+') {
- active = 1;
+ flags |= JUPE_ACTIVE;
server++;
- } else if (*server == '-') {
- active = 0;
+ } else if (*server == '-')
server++;
- } else
+ else
return jupe_list(sptr, server);
- if (parc < 5)
+ if (!feature_bool(FEAT_CONFIG_OPERCMDS))
+ return send_reply(sptr, ERR_DISABLED, "JUPE");
+
+ if (parc == 4) {
+ expire_off = atoi(parv[2]);
+ reason = parv[3];
+ flags |= JUPE_LOCAL;
+ } else if (parc > 4) {
+ target = parv[2];
+ expire_off = atoi(parv[3]);
+ reason = parv[4];
+ } else
return need_more_params(sptr, "JUPE");
- if (!(target[0] == '*' && target[1] == '\0')) {
- if (!(acptr = find_match_server(target))) {
- sendto_one(sptr, err_str(ERR_NOSUCHSERVER), me.name, parv[0], target);
- return 0;
- }
+ if (target) {
+ if (!(target[0] == '*' && target[1] == '\0')) {
+ if (!(acptr = find_match_server(target)))
+ return send_reply(sptr, ERR_NOSUCHSERVER, target);
- if (!IsMe(acptr)) { /* manually propagate, since we don't set it */
- if (!IsOper(sptr)) {
- sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);
- return 0;
- }
+ if (!IsMe(acptr)) { /* manually propagate, since we don't set it */
+ if (!HasPriv(sptr, PRIV_JUPE))
+ return send_reply(sptr, ERR_NOPRIVILEGES);
- sendto_one(acptr, "%s%s " TOK_JUPE " %s %c%s %s " TIME_T_FMT " :%s",
- NumNick(sptr), NumServ(acptr), active ? '+' : '-', server,
- parv[3], TStime(), reason);
- return 0;
- }
+ sendcmdto_one(sptr, CMD_JUPE, acptr, "%C %c%s %s %Tu :%s", acptr,
+ flags & JUPE_ACTIVE ? '+' : '-', server, parv[3],
+ TStime(), reason);
+ return 0;
+ } else if (!HasPriv(sptr, PRIV_LOCAL_JUPE))
+ return send_reply(sptr, ERR_NOPRIVILEGES);
- local = 1;
- } else if (!IsOper(sptr)) {
- sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);
- return 0;
+ flags |= JUPE_LOCAL;
+ } else if (!HasPriv(sptr, PRIV_JUPE))
+ return send_reply(sptr, ERR_NOPRIVILEGES);
}
- expire_off = atoi(parv[3]);
-
ajupe = jupe_find(server);
if (ajupe) {
- if (JupeIsLocal(ajupe) && !local) /* global jupes override local ones */
+ if (JupeIsLocal(ajupe) && !(flags & JUPE_LOCAL)) /* global over local */
jupe_free(ajupe);
else {
- if (active)
- return jupe_activate(cptr, sptr, ajupe, TStime());
+ if (flags & JUPE_ACTIVE)
+ return jupe_activate(cptr, sptr, ajupe, TStime(), flags);
else
- return jupe_deactivate(cptr, sptr, ajupe, TStime());
+ return jupe_deactivate(cptr, sptr, ajupe, TStime(), flags);
}
}
- return jupe_add(cptr, sptr, server, reason, expire_off, TStime(), local,
- active);
+ return jupe_add(cptr, sptr, server, reason, expire_off, TStime(), flags);
}
/*