/* * mo_asll - oper message handler */ int mo_asll(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { char *mask; struct Client *acptr; int hits; int i; if (parc < 2) return need_more_params(sptr, "ASLL"); if (parc == 2 && MyUser(sptr)) parv[parc++] = cli_name(&me); if (hunt_server_prio_cmd(sptr, CMD_ASLL, cptr, 1, "%s %C", 2, parc, parv) != HUNTED_ISME) return 0; mask = parv[1]; for (i = hits = 0; i <= HighestFd; i++) { acptr = LocalClientArray[i]; if (!acptr || !IsServer(acptr) || !MyConnect(acptr) || match(mask, cli_name(acptr))) continue; send_asll_reply(&me, sptr, cli_name(acptr), cli_serv(acptr)->asll_rtt, cli_serv(acptr)->asll_to, cli_serv(acptr)->asll_from); hits++; } sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :AsLL for %s: %d local servers matched", sptr, mask, hits); return 0; }
/* * ms_asll - server message handler */ int ms_asll(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { char *mask; struct Client *acptr; int hits; int i; if (parc < 2) return need_more_params(sptr, "ASLL"); if (parc > 5) { if (!(acptr = findNUser(parv[1]))) return 0; if (MyUser(acptr)) send_asll_reply(sptr, acptr, parv[2], atoi(parv[3]), atoi(parv[4]), atoi(parv[5])); else sendcmdto_prio_one(sptr, CMD_ASLL, acptr, "%C %s %s %s %s", acptr, parv[2], parv[3], parv[4], parv[5]); return 0; } if (hunt_server_prio_cmd(sptr, CMD_ASLL, cptr, 1, "%s %C", 2, parc, parv) != HUNTED_ISME) return 0; mask = parv[1]; for (i = hits = 0; i <= HighestFd; i++) { acptr = LocalClientArray[i]; if (!acptr || !IsServer(acptr) || !MyConnect(acptr) || match(mask, cli_name(acptr))) continue; sendcmdto_prio_one(&me, CMD_ASLL, sptr, "%C %s %i %i %i", sptr, cli_name(acptr), cli_serv(acptr)->asll_rtt, cli_serv(acptr)->asll_to, cli_serv(acptr)->asll_from); hits++; } sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :AsLL for %s: %d local servers matched", sptr, mask, hits); return 0; }
/* * mo_settime - oper message handler * * parv[0] = sender prefix * parv[1] = new time * parv[2] = servername (Only used when sptr is an Oper). */ int mo_settime(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { time_t t; long dt; static char tbuf[11]; /* Must be a global oper */ if (!IsOper(sptr)) return send_reply(sptr, ERR_NOPRIVILEGES); if (parc < 2) /* verify argument count */ return need_more_params(sptr, "SETTIME"); if (parc == 2 && MyUser(sptr)) /* default to me */ parv[parc++] = cli_name(&me); t = atoi(parv[1]); /* convert the time */ /* If we're reliable_clock or if the oper specified a 0 time, use current */ if (!t || feature_bool(FEAT_RELIABLE_CLOCK)) { t = TStime(); ircd_snprintf(0, tbuf, sizeof(tbuf), "%Tu", TStime()); parv[1] = tbuf; } dt = TStime() - t; /* calculate the delta */ if (t < OLDEST_TS || dt < -9000000) /* verify value */ { sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :SETTIME: Bad value", sptr); return 0; } /* OK, send the message off to its destination */ if (hunt_server_prio_cmd(sptr, CMD_SETTIME, cptr, 1, "%s %C", 2, parc, parv) != HUNTED_ISME) return 0; if (feature_bool(FEAT_RELIABLE_CLOCK)) /* don't apply settime--reliable */ { if ((dt > 600) || (dt < -600)) sendcmdto_serv_butone(&me, CMD_DESYNCH, 0, ":Bad SETTIME from %s: %Tu " "(delta %ld)", cli_name(sptr), t, dt); if (IsUser(sptr)) /* Let user know we're ignoring him */ sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :clock is not set %ld seconds " "%s: RELIABLE_CLOCK is defined", sptr, (dt < 0) ? -dt : dt, (dt < 0) ? "forwards" : "backwards"); } else /* tell opers about time change */ { sendto_opmask_butone(0, SNO_OLDSNO, "SETTIME from %s, clock is set %ld " "seconds %s", cli_name(sptr), (dt < 0) ? -dt : dt, (dt < 0) ? "forwards" : "backwards"); TSoffset -= dt; /* apply time change */ if (IsUser(sptr)) /* let user know what we did */ sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :clock is set %ld seconds %s", sptr, (dt < 0) ? -dt : dt, (dt < 0) ? "forwards" : "backwards"); } return 0; }
/* * ms_settime - server message handler * * parv[0] = sender prefix * parv[1] = new time * parv[2] = server name (Only used when sptr is an Oper). */ int ms_settime(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { time_t t; long dt; static char tbuf[11]; struct DLink *lp; if (parc < 2) /* verify argument count */ return need_more_params(sptr, "SETTIME"); t = atoi(parv[1]); /* convert time and compute delta */ dt = TStime() - t; /* verify value */ if (t < OLDEST_TS || dt < -9000000) { if (IsServer(sptr)) /* protocol violation if it's from a server */ protocol_violation(sptr, "SETTIME: Bad value (%Tu, delta %ld)", t, dt); else sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :SETTIME: Bad value (%Tu, " "delta %ld)", sptr, t, dt); sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :SETTIME: Bad value", sptr); return 0; } /* reset time... */ if (feature_bool(FEAT_RELIABLE_CLOCK)) { ircd_snprintf(0, tbuf, sizeof(tbuf), "%Tu", TStime()); parv[1] = tbuf; } if (BadPtr(parv[2])) /* spam the network */ { for (lp = cli_serv(&me)->down; lp; lp = lp->next) if (cptr != lp->value.cptr) sendcmdto_prio_one(sptr, CMD_SETTIME, lp->value.cptr, "%s", parv[1]); } else { if (hunt_server_prio_cmd(sptr, CMD_SETTIME, cptr, 1, "%s %C", 2, parc, parv) != HUNTED_ISME) { /* If the destination was *not* me, but I'm RELIABLE_CLOCK and the * delta is more than 30 seconds off, bounce back a corrected * SETTIME */ if (feature_bool(FEAT_RELIABLE_CLOCK) && (dt > 30 || dt < -30)) sendcmdto_prio_one(&me, CMD_SETTIME, cptr, "%s %C", parv[1], cptr); return 0; } } if (feature_bool(FEAT_RELIABLE_CLOCK)) { /* don't apply settime--reliable */ if ((dt > 600) || (dt < -600)) sendcmdto_serv_butone(&me, CMD_DESYNCH, 0, ":Bad SETTIME from %s: %Tu " "(delta %ld)", cli_name(sptr), t, dt); /* Let user know we're ignoring him */ if (IsUser(sptr)) { sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :clock is not set %ld " "seconds %s : RELIABLE_CLOCK is defined", sptr, (dt < 0) ? -dt : dt, (dt < 0) ? "forwards" : "backwards"); } } else /* tell opers about time change */ { sendto_opmask_butone(0, SNO_OLDSNO, "SETTIME from %s, clock is set %ld " "seconds %s", cli_name(sptr), (dt < 0) ? -dt : dt, (dt < 0) ? "forwards" : "backwards"); /* Apply time change... */ TSoffset -= dt; /* Let the issuing user know what we did... */ if (IsUser(sptr)) { sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :clock is set %ld seconds %s", sptr, (dt < 0) ? -dt : dt, (dt < 0) ? "forwards" : "backwards"); } } return 0; }