* 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 */
- sendcmdto_one(acptr, CMD_JUPE, sptr, "%s %s %s %s :%s", target, server,
+ 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]
*
*/
-#ifdef CONFIG_OPERCMDS
int mo_jupe(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
{
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)
- return need_more_params(sptr, "JUPE");
+ if (!feature_bool(FEAT_CONFIG_OPERCMDS))
+ return send_reply(sptr, ERR_DISABLED, "JUPE");
- if (!(target[0] == '*' && target[1] == '\0')) {
- if (!(acptr = find_match_server(target)))
- return send_error_to_client(sptr, ERR_NOSUCHSERVER, target);
+ 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 (!IsMe(acptr)) { /* manually propagate, since we don't set it */
- if (!IsOper(sptr))
- return send_error_to_client(sptr, ERR_NOPRIVILEGES);
+ if (target) {
+ if (!(target[0] == '*' && target[1] == '\0')) {
+ if (!(acptr = find_match_server(target)))
+ return send_reply(sptr, ERR_NOSUCHSERVER, target);
- sendcmdto_one(acptr, CMD_JUPE, sptr, "%C %c%s %s %Tu :%s", acptr,
- active ? '+' : '-', server, parv[3], TStime(), reason);
- return 0;
- }
+ if (!IsMe(acptr)) { /* manually propagate, since we don't set it */
+ if (!HasPriv(sptr, PRIV_JUPE))
+ return send_reply(sptr, ERR_NOPRIVILEGES);
- local = 1;
- } else if (!IsOper(sptr))
- return send_error_to_client(sptr, ERR_NOPRIVILEGES);
+ 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);
- expire_off = atoi(parv[3]);
+ flags |= JUPE_LOCAL;
+ } else if (!HasPriv(sptr, PRIV_JUPE))
+ return send_reply(sptr, ERR_NOPRIVILEGES);
+ }
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);
}
-#endif /* CONFIG_OPERCMDS */
/*
* m_jupe - user message handler