2000-06-02 Kevin L. Mitchell <klmitch@mit.edu>
+ * ircd/m_server.c: Resend jupe only when there is no %<lastmod>
+ parameter, or when it falls out of bounds: see comments prior to
+ call to jupe_resend(); call server_estab with struct Jupe
+ parameter, so that we place the appropriate %<lastmod> in the
+ appropriate place.
+
+ * ircd/s_serv.c (server_estab): send %<lastmod> for introduced
+ server, as well as for servers when we're sending the BURST
+
+ * include/s_serv.h: add a struct Jupe * to the arguments for
+ server_estab() so that we can send the appropriate lastmod
+ parameter
+
* ircd/m_gline.c (ms_gline): actually, this should be the
slightest bit more efficient...
#
# ChangeLog for ircu2.10.11
#
-# $Id: ChangeLog,v 1.141 2000-06-02 23:09:20 kev Exp $
+# $Id: ChangeLog,v 1.142 2000-06-03 00:09:12 kev Exp $
#
# Insert new changes at beginning of the change list.
#
struct ConfItem;
struct Client;
-
+struct Jupe;
extern unsigned int max_connection_count;
extern unsigned int max_client_count;
extern int exit_new_server(struct Client* cptr, struct Client* sptr,
const char* host, time_t timestamp, const char* fmt, ...);
extern int a_kills_b_too(struct Client *a, struct Client *b);
-extern int server_estab(struct Client *cptr, struct ConfItem *aconf);
+extern int server_estab(struct Client *cptr, struct ConfItem *aconf,
+ struct Jupe *ajupe);
#endif /* INCLUDED_s_serv_h */
#endif
}
- ret = server_estab(cptr, aconf);
+ ret = server_estab(cptr, aconf, ajupe);
}
else
ret = 0;
* parv[6] = "YMM", where 'Y' is the server numeric and "MM" is the
* numeric nick mask of this server.
* parv[7] = 0 (not used yet, mandatory unsigned int after u2.10.06)
+ * parv[8] = %<lastmod> - optional parameter only present if there's an
+ * outstanding JUPE; specifies the JUPE's lastmod field
*/
int ms_server(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
{
time_t timestamp = 0;
time_t recv_time;
time_t ghost = 0;
+ time_t lastmod = 0;
if (IsUserPort(cptr))
return exit_client_msg(cptr, cptr, &me,
}
host = parv[1];
- if ((ajupe = jupe_find(host)) && JupeIsActive(ajupe))
- jupe_resend(cptr, ajupe);
-
/*
* Detect protocol
*/
return exit_new_server(cptr, sptr, host, timestamp,
"Incompatible protocol: %s", parv[5]);
}
+ if (parc > 9 && *parv[8] == '%')
+ lastmod = atoi(parv[8] + 1);
+ /* If there's a jupe that matches, and it's a global jupe, and the
+ * introducer didn't indicate it knew of the jupe or has an older
+ * version of the jupe, and the connection isn't in a BURST, resynch
+ * the jupe.
+ */
+ if ((ajupe = jupe_find(host)) && !JupeIsLocal(ajupe) &&
+ JupeLastMod(ajupe) > lastmod && !IsBurstOrBurstAck(cptr))
+ jupe_resend(cptr, ajupe);
/*
* Check for "FRENCH " infection ;-) (actually this should
* be replaced with routine to check the hostname syntax in
#endif
}
- ret = server_estab(cptr, aconf);
+ ret = server_estab(cptr, aconf, ajupe);
}
else
ret = 0;
#endif
}
- ret = server_estab(cptr, aconf);
+ ret = server_estab(cptr, aconf); /* XXX DEAD */
}
else
ret = 0;
* May only be called after a SERVER was received from cptr,
* and thus make_server was called, and serv->prot set. --Run
*/
-int server_estab(struct Client *cptr, struct ConfItem *aconf)
+int server_estab(struct Client *cptr, struct ConfItem *aconf,
+ struct Jupe *ajupe)
{
struct Client* acptr = 0;
const char* inpath;
continue;
if (!match(me.name, cptr->name))
continue;
- sendcmdto_one(&me, CMD_SERVER, acptr, "%s 2 0 %Tu J%02u %s%s 0 :%s",
- cptr->name, cptr->serv->timestamp, Protocol(cptr),
- NumServCap(cptr), cptr->info);
+ if (ajupe)
+ sendcmdto_one(&me, CMD_SERVER, acptr,
+ "%s 2 0 %Tu J%02u %s%s 0 %%%Tu :%s", cptr->name,
+ cptr->serv->timestamp, Protocol(cptr), NumServCap(cptr),
+ JupeLastMod(ajupe), cptr->info);
+ else
+ sendcmdto_one(&me, CMD_SERVER, acptr,
+ "%s 2 0 %Tu J%02u %s%s 0 :%s", cptr->name,
+ cptr->serv->timestamp, Protocol(cptr), NumServCap(cptr),
+ cptr->info);
}
/*
split = (MyConnect(acptr) &&
0 != ircd_strcmp(acptr->name, acptr->sockhost) &&
0 != ircd_strncmp(acptr->info, "JUPE", 4));
- sendcmdto_one(acptr->serv->up, CMD_SERVER, cptr, "%s %d 0 %Tu %s%u "
- "%s%s 0 :%s", acptr->name, acptr->hopcount + 1,
- acptr->serv->timestamp, protocol_str, Protocol(acptr),
- NumServCap(acptr), acptr->info);
+ if ((ajupe = jupe_find(acptr->name)))
+ sendcmdto_one(acptr->serv->up, CMD_SERVER, cptr,
+ "%s %d 0 %Tu %s%u %s%s 0 %%%Tu :%s", acptr->name,
+ acptr->hopcount + 1, acptr->serv->timestamp,
+ protocol_str, Protocol(acptr), NumServCap(acptr),
+ JupeLastMod(ajupe), acptr->info);
+ else
+ sendcmdto_one(acptr->serv->up, CMD_SERVER, cptr,
+ "%s %d 0 %Tu %s%u %s%s 0 :%s", acptr->name,
+ acptr->hopcount + 1, acptr->serv->timestamp,
+ protocol_str, Protocol(acptr), NumServCap(acptr),
+ acptr->info);
}
}