X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fproto-p10.c;h=91247e251606f974d96be9bbb3755d4de2ed645b;hb=HEAD;hp=c48d21b45125fc6431c1d3413e7b1c2f3c3c60f3;hpb=9157c1917730c18780f2bf01b6e633b86386384c;p=srvx.git diff --git a/src/proto-p10.c b/src/proto-p10.c index c48d21b..91247e2 100644 --- a/src/proto-p10.c +++ b/src/proto-p10.c @@ -90,6 +90,7 @@ #define CMD_SVSNICK "SVSNICK" #define CMD_SVSMODE "SVSMODE" #define CMD_SVSJOIN "SVSJOIN" +#define CMD_SVSPART "SVSPART" #define CMD_TIME "TIME" #define CMD_TOPIC "TOPIC" #define CMD_TRACE "TRACE" @@ -105,6 +106,8 @@ #define CMD_WHO "WHO" #define CMD_WHOIS "WHOIS" #define CMD_WHOWAS "WHOWAS" +#define CMD_XQUERY "XQUERY" +#define CMD_XRESPONSE "XRESPONSE" /* Tokenized commands. */ #define TOK_ACCOUNT "AC" @@ -176,6 +179,7 @@ #define TOK_SVSNICK "SN" #define TOK_SVSMODE "SM" #define TOK_SVSJOIN "SJ" +#define TOK_SVSPART "SP" #define TOK_TIME "TI" #define TOK_TOPIC "T" #define TOK_TRACE "TR" @@ -191,6 +195,8 @@ #define TOK_WHO "H" #define TOK_WHOIS "W" #define TOK_WHOWAS "X" +#define TOK_XQUERY "XQ" +#define TOK_XRESPONSE "XR" /* Protocol messages; aliased to full commands or tokens depending on compile-time configuration. ircu prefers tokens WITH THE @@ -273,6 +279,7 @@ #define P10_SVSNICK TYPE(SVSNICK) #define P10_SVSMODE TYPE(SVSMODE) #define P10_SVSJOIN TYPE(SVSJOIN) +#define P10_SVSPART TYPE(SVSPART) #define P10_TIME TYPE(TIME) #define P10_TOPIC TYPE(TOPIC) #define P10_TRACE TYPE(TRACE) @@ -288,6 +295,8 @@ #define P10_WHO TYPE(WHO) #define P10_WHOIS TYPE(WHOIS) #define P10_WHOWAS TYPE(WHOWAS) +#define P10_XQUERY TYPE(XQUERY) +#define P10_XRESPONSE TYPE(XRESPONSE) /* Servers claiming to have a boot or link time before PREHISTORY * trigger errors to the log. We hope no server has been running @@ -526,6 +535,12 @@ irc_simul(struct userNode *target, char *command) putsock("%s " P10_RELAY " %s SI %s :%s", self->numeric, target->numeric, target->numeric, command); } +void +irc_keepconn(struct userNode *target, unsigned int timeout) +{ + putsock("%s " P10_RELAY " %s KC %s %u", self->numeric, target->numeric, target->numeric, timeout); +} + void irc_regnick(UNUSED_ARG(struct userNode *user)) { @@ -642,6 +657,18 @@ irc_svsjoinchan(struct userNode *from, struct userNode *user, const char *chan) putsock("%s " P10_SVSJOIN " %s %s", from->numeric, user->numeric, chan); } +void +irc_svspart(struct userNode *from, struct userNode *user, struct chanNode *chan) +{ +putsock("%s " P10_SVSPART " %s %s", from->numeric, user->numeric, chan->name); +} + +void +irc_svspartchan(struct userNode *from, struct userNode *user, const char *chan) +{ +putsock("%s " P10_SVSPART " %s %s", from->numeric, user->numeric, chan); +} + void irc_eob(void) { @@ -961,6 +988,12 @@ irc_numeric(struct userNode *user, unsigned int num, const char *format, ...) putsock(":%s %03d %s %s", self->name, num, user->nick, buffer); } +void +irc_xresponse(struct server *target, const char *routing, const char *response) +{ + putsock("%s " P10_XRESPONSE " %s %s :%s", self->numeric, target->numeric, routing, response); +} + static void send_burst(void); static void @@ -1753,41 +1786,41 @@ static CMD_FUNC(cmd_relay) //ok someone relayed something to us! if(strcmp("LQ", argv[2]) == 0) { //oooh thats exciting - we've got a LOC Query! :D - //LQ !ABADE pk910 80.153.5.212 server.zoelle1.de ~watchcat :test //ok let's check the login datas struct handle_info *hi; char tmp[MAXLEN], tmp2[MAXLEN]; sprintf(tmp, "%s@%s",argv[7],argv[6]); sprintf(tmp2, "%s@%s",argv[7],argv[5]); if((hi = checklogin(argv[4],argv[argc-1],&argv[3][1],tmp,tmp2))) { - //login ok - struct devnull_class *th; - char devnull[512]; - if(hi->devnull && (th = devnull_get(hi->devnull))) { - const char *devnull_modes = DEVNULL_MODES; - int ii, flen; - char flags[50]; - for (ii=flen=0; devnull_modes[ii]; ++ii) - if (th->modes & (1 << ii)) - flags[flen++] = devnull_modes[ii]; - flags[flen] = 0; - sprintf(devnull, "+%s %s %lu %lu",flags,th->name,th->maxchan,th->maxsendq); - } else { - devnull[0] = 0; - } - if(!HANDLE_FLAGGED(hi, AUTOHIDE)) { - sprintf(tmp,"%s LA %s 0 %s\n",argv[3],hi->handle,devnull); - } else if(getfakehost(argv[4])) { - sprintf(tmp,"%s LA %s %s %s\n",argv[3],hi->handle,getfakehost(argv[4]),devnull); - } else { - extern const char *hidden_host_suffix; - sprintf(tmp,"%s LA %s %s.%s %s\n",argv[3],hi->handle,hi->handle,hidden_host_suffix,devnull); - } - irc_relay(tmp); + //login ok + struct devnull_class th = devnull_user_get_class(hi); + char devnull[MAXLEN]; + + if(th.modes) { + const char *devnull_modes = DEVNULL_MODES; + int ii, flen = 0; + char flags[50]; + for (ii = 0; devnull_modes[ii]; ++ii) + if(th.modes & (1 << ii)) + flags[flen++] = devnull_modes[ii]; + flags[flen] = 0; + sprintf(devnull, "+%s %s %lu %lu", flags, (th.name ? th.name : "custom"), (DEVNULL_HAS_PRIV(&th, CHANLIMIT) ? th.maxchan : 0), (DEVNULL_HAS_PRIV(&th, MAXSENDQ) ? th.maxsendq : 0)); + } else + devnull[0] = 0; + + if(!HANDLE_FLAGGED(hi, AUTOHIDE)) + sprintf(tmp,"%s LA %s 0 %s\n",argv[3],hi->handle,devnull); + else if(getfakehost(argv[4])) + sprintf(tmp,"%s LA %s %s %s\n",argv[3],hi->handle,getfakehost(argv[4]),devnull); + else { + extern const char *hidden_host_suffix; + sprintf(tmp,"%s LA %s %s.%s %s\n",argv[3],hi->handle,hi->handle,hidden_host_suffix,devnull); + } + irc_relay(tmp); } else { - //login rejected - sprintf(tmp,"%s LR\n",argv[3]); - irc_relay(tmp); + //login rejected + sprintf(tmp,"%s LR\n",argv[3]); + irc_relay(tmp); } } else if(strcmp("UC", argv[2]) == 0) { char tmp[MAXLEN]; @@ -1822,6 +1855,16 @@ static CMD_FUNC(cmd_relay) return 1; } +static CMD_FUNC(cmd_xquery) +{ + struct server *source; + if ((argc < 4) + || !(source = GetServerH(origin))) + return 0; + call_xquery_funcs(source, argv[2], argv[3]); + return 1; +} + void free_user(struct userNode *user) { @@ -1965,6 +2008,8 @@ init_parse(void) dict_insert(irc_func_dict, TOK_ADMIN, cmd_admin); dict_insert(irc_func_dict, CMD_TIME, cmd_time); dict_insert(irc_func_dict, TOK_TIME, cmd_time); + /* We don't handle XR or the (not really defined) XQUERY. */ + dict_insert(irc_func_dict, TOK_XQUERY, cmd_xquery); /* In P10, DESTRUCT doesn't do anything except be broadcast to servers. * Apparently to obliterate channels from any servers that think they