本文整理汇总了C++中sendto_one函数的典型用法代码示例。如果您正苦于以下问题:C++ sendto_one函数的具体用法?C++ sendto_one怎么用?C++ sendto_one使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了sendto_one函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: mo_ojoin
/*
** mo_ojoin
** parv[1] = channel
*/
static void
mo_ojoin(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
{
struct Channel *chptr;
int move_me = 0;
/* admins only */
if(!IsOperAdmin(source_p))
{
sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "admin");
return;
}
if(*parv[1] == '@' || *parv[1] == '+')
{
parv[1]++;
move_me = 1;
}
if((chptr = find_channel(parv[1])) == NULL)
{
sendto_one_numeric(source_p, ERR_NOSUCHCHANNEL,
form_str(ERR_NOSUCHCHANNEL), parv[1]);
return;
}
if(IsMember(source_p, chptr))
{
sendto_one_notice(source_p, ":Please part %s before using OJOIN", parv[1]);
return;
}
if(move_me == 1)
parv[1]--;
sendto_wallops_flags(UMODE_WALLOP, &me,
"OJOIN called for %s by %s!%[email protected]%s",
parv[1], source_p->name, source_p->username, source_p->host);
ilog(L_MAIN, "OJOIN called for %s by %s",
parv[1], get_oper_name(source_p));
/* only sends stuff for #channels remotely */
sendto_server(NULL, chptr, NOCAPS, NOCAPS,
":%s WALLOPS :OJOIN called for %s by %s!%[email protected]%s",
me.name, parv[1],
source_p->name, source_p->username, source_p->host);
if(*parv[1] == '@')
{
add_user_to_channel(chptr, source_p, CHFL_CHANOP);
sendto_server(client_p, chptr, CAP_TS6, NOCAPS,
":%s SJOIN %ld %s + :@%s",
me.id, (long) chptr->channelts, chptr->chname, source_p->id);
send_channel_join(chptr, source_p);
sendto_channel_local(ALL_MEMBERS, chptr, ":%s MODE %s +o %s",
me.name, chptr->chname, source_p->name);
}
else if(*parv[1] == '+')
{
add_user_to_channel(chptr, source_p, CHFL_VOICE);
sendto_server(client_p, chptr, CAP_TS6, NOCAPS,
":%s SJOIN %ld %s + :+%s",
me.id, (long) chptr->channelts, chptr->chname, source_p->id);
send_channel_join(chptr, source_p);
sendto_channel_local(ALL_MEMBERS, chptr, ":%s MODE %s +v %s",
me.name, chptr->chname, source_p->name);
}
else
{
add_user_to_channel(chptr, source_p, CHFL_PEON);
sendto_server(client_p, chptr, CAP_TS6, NOCAPS,
":%s JOIN %ld %s +",
source_p->id, (long) chptr->channelts, chptr->chname);
send_channel_join(chptr, source_p);
}
/* send the topic... */
if(chptr->topic != NULL)
{
sendto_one(source_p, form_str(RPL_TOPIC), me.name,
source_p->name, chptr->chname, chptr->topic);
sendto_one(source_p, form_str(RPL_TOPICWHOTIME), me.name,
source_p->name, chptr->chname, chptr->topic_info, chptr->topic_time);
}
source_p->localClient->last_join_time = rb_current_time();
channel_member_names(chptr, source_p, 1);
}
示例2: m_scan_umodes
int
m_scan_umodes(struct Client *cptr, struct Client *sptr, int parc, char *parv[], char *varparv[])
{
char *umode_string = parv[2], *c;
user_modes include_modes, exclude_modes;
int what = MODE_ADD;
int mode;
int list_users = 1;
int list_max = 0;
int allowed = 1;
int listed_so_far = 0, count = 0;
char *mask = NULL;
struct Client *acptr;
int i;
if (!HasUmode(sptr,UMODE_USER_AUSPEX))
{
if (SeesOperMessages(sptr))
sendto_one(sptr,":%s NOTICE %s :You have no a umode", me.name, parv[0]);
else
sendto_one(sptr, form_str(ERR_NOPRIVILEGES), me.name, parv[0]);
return 0;
}
if (parc < 3)
{
if (!IsServer(sptr))
sendto_one(sptr, form_str(ERR_NEEDMOREPARAMS),
me.name, parv[0], "SCAN UMODES");
return 0;
}
ClearBitfield(include_modes);
ClearBitfield(exclude_modes);
for (c = umode_string; *c; c++)
switch(*c)
{
case '+':
what = MODE_ADD;
break;
case '-':
what = MODE_DEL;
break;
default:
if ((mode = user_modes_from_c_to_bitmask[(unsigned char)*c]))
{
if (what == MODE_ADD)
SetBit(include_modes, mode);
else
SetBit(exclude_modes, mode);
}
else
{
sendto_one(sptr, form_str(ERR_UNKNOWNMODE), me.name, sptr->name, *c);
return 0;
}
}
for (i = 3; i < parc; i++)
{
if (!irccmp(parv[i], "no-list"))
list_users = 0;
else if (!irccmp(parv[i], "list"))
list_users = 1;
else if (!irccmp(parv[i], "allowed"))
allowed = 1;
else if (!irccmp(parv[i], "current"))
allowed = 0;
else if (i < (parc - 1))
{
if (!irccmp(parv[i], "list-max"))
{
list_max = atoi(parv[++i]);
}
else if (!irccmp(parv[i], "mask"))
{
mask = parv[++i];
}
}
}
for (acptr = GlobalClientList; acptr; acptr = acptr->next)
{
char *s;
user_modes working_umodes;
if (!IsClient(acptr))
continue;
if (allowed)
AndUmodes(working_umodes, acptr->allowed_umodes, include_modes);
else
AndUmodes(working_umodes, acptr->umodes, include_modes);
if (!SameBits(working_umodes, include_modes))
continue;
if (allowed)
AndUmodes(working_umodes, acptr->allowed_umodes, exclude_modes);
//.........这里部分代码省略.........
示例3: send_conf_options
/*
* send_conf_options
*
* inputs - client pointer to send to
* output - none
* side effects - send config options to client
*/
static void
send_conf_options(struct Client *source_p)
{
Info *infoptr;
int i = 0;
/*
* Now send them a list of all our configuration options
* (mostly from config.h)
*/
for (infoptr = MyInformation; infoptr->name; infoptr++)
{
if(infoptr->intvalue)
{
sendto_one(source_p, ":%s %d %s :%-30s %-5d [%-30s]",
get_id(&me, source_p), RPL_INFO,
get_id(source_p, source_p),
infoptr->name, infoptr->intvalue,
infoptr->desc);
}
else
{
sendto_one(source_p, ":%s %d %s :%-30s %-5s [%-30s]",
get_id(&me, source_p), RPL_INFO,
get_id(source_p, source_p),
infoptr->name, infoptr->strvalue,
infoptr->desc);
}
}
/*
* Parse the info_table[] and do the magic.
*/
for (i = 0; info_table[i].name; i++)
{
switch (info_table[i].output_type)
{
/*
* For "char *" references
*/
case OUTPUT_STRING:
{
char *option = *((char **) info_table[i].option);
sendto_one(source_p, ":%s %d %s :%-30s %-5s [%-30s]",
get_id(&me, source_p), RPL_INFO,
get_id(source_p, source_p),
info_table[i].name,
option ? option : "NONE",
info_table[i].desc ? info_table[i].desc : "<none>");
break;
}
/*
* For "char foo[]" references
*/
case OUTPUT_STRING_PTR:
{
char *option = (char *) info_table[i].option;
sendto_one(source_p, ":%s %d %s :%-30s %-5s [%-30s]",
get_id(&me, source_p), RPL_INFO,
get_id(source_p, source_p),
info_table[i].name,
EmptyString(option) ? "NONE" : option,
info_table[i].desc ? info_table[i].desc : "<none>");
break;
}
/*
* Output info_table[i].option as a decimal value.
*/
case OUTPUT_DECIMAL:
{
int option = *((int *) info_table[i].option);
sendto_one(source_p, ":%s %d %s :%-30s %-5d [%-30s]",
get_id(&me, source_p), RPL_INFO,
get_id(source_p, source_p),
info_table[i].name,
option,
info_table[i].desc ? info_table[i].desc : "<none>");
break;
}
/*
* Output info_table[i].option as "ON" or "OFF"
*/
case OUTPUT_BOOLEAN:
{
int option = *((int *) info_table[i].option);
//.........这里部分代码省略.........
示例4: m_scan_cmodes
int
m_scan_cmodes(struct Client *cptr, struct Client *sptr, int parc, char *parv[], char *varparv[])
{
char *cmode_string = parv[2], *c;
unsigned int include_modes, exclude_modes;
int require_autodline = 0, require_forward = 0;
int what = MODE_ADD;
int list_channels = 1;
int list_max = 0;
int listed_so_far = 0, count = 0;
char *mask = NULL;
struct Channel *achptr;
int i;
if (!HasUmode(sptr,UMODE_USER_AUSPEX))
{
if (SeesOperMessages(sptr))
sendto_one(sptr,":%s NOTICE %s :You have no a umode", me.name, parv[0]);
else
sendto_one(sptr, form_str(ERR_NOPRIVILEGES), me.name, parv[0]);
return 0;
}
if (parc < 3)
{
if (!IsServer(sptr))
sendto_one(sptr, form_str(ERR_NEEDMOREPARAMS),
me.name, parv[0], "SCAN CMODES");
return 0;
}
include_modes = exclude_modes = 0;
for (c = cmode_string; *c; c++)
switch(*c)
{
case '+':
what = MODE_ADD;
break;
case '-':
what = MODE_DEL;
break;
default:
{
int this_mode = 0;
switch(*c)
{
case 'c':
this_mode = MODE_NOCOLOR;
break;
case 'D':
require_autodline = what == MODE_ADD ? 1 : -1;
break;
#ifdef INVITE_CHANNEL_FORWARDING
case 'f':
require_forward = what == MODE_ADD ? 1 : -1;
break;
#endif
case 'g':
this_mode = MODE_FREEINVITE;
break;
case 'i':
this_mode = MODE_INVITEONLY;
break;
#ifdef JUPE_CHANNEL
case 'j':
this_mode = MODE_JUPED;
break;
#endif
case 'L':
this_mode = MODE_LARGEBANLIST;
break;
case 'm':
this_mode = MODE_MODERATED;
break;
case 'n':
this_mode = MODE_NOPRIVMSGS;
break;
case 'P':
this_mode = MODE_PERM;
break;
case 'Q':
this_mode = MODE_NOFORWARD;
break;
case 'r':
this_mode = MODE_NOUNIDENT;
break;
case 'R':
this_mode = MODE_QUIETUNIDENT;
break;
case 's':
this_mode = MODE_SECRET;
break;
case 't':
this_mode = MODE_TOPICLIMIT;
break;
case 'z':
this_mode = MODE_OPMODERATE;
break;
default:
//.........这里部分代码省略.........
示例5: m_scan_unklines
int
m_scan_unklines(struct Client *cptr, struct Client *sptr, int parc, char *parv[], char *varparv[])
{
char *mask = NULL;
int list = 1, count = 0, listed_so_far = 0;
int list_max = 100;
int i;
struct unkline_record **ukr, *ukr2;
if (!HasUmode(sptr,UMODE_SEEKLINES))
{
if (SeesOperMessages(sptr))
sendto_one(sptr,":%s NOTICE %s :You have no 2 umode", me.name, parv[0]);
else
sendto_one(sptr, form_str(ERR_NOPRIVILEGES), me.name, parv[0]);
return 0;
}
if (parc < 2)
{
if (!IsServer(sptr))
sendto_one(sptr, form_str(ERR_NEEDMOREPARAMS),
me.name, parv[0], "SCAN UNKLINES");
return 0;
}
for (i = 2; i < parc; i++)
{
if (!irccmp(parv[i], "no-list"))
list = 0;
else if (!irccmp(parv[i], "list"))
list = 1;
else if (i < (parc - 1))
{
if (!irccmp(parv[i], "list-max"))
{
list_max = atoi(parv[++i]);
}
else if (!irccmp(parv[i], "mask"))
{
mask = parv[++i];
}
}
}
for (ukr = &recorded_unklines; (ukr2 = *ukr); ukr = &ukr2->next)
{
if ((ukr2->placed + UNKLINE_CACHE_TIME) < CurrentTime)
{
*ukr = ukr2->next;
MyFree(ukr2->mask);
MyFree(ukr2);
/* And put stuff back, safety in case we can't loop again */
if (!(ukr2 = *ukr))
break;
}
else
{
if (mask && !match(mask, ukr2->mask))
continue;
count++;
if (list && (list_max > ++listed_so_far))
/* send_markup(sptr, &me, "SCAN-UNKLINE", */
/* "!begin<1>%s!end<1> unklined at !begin<2>!date<%ld>!end<2> (!begin<3>!time<%ld>!end<3>)", */
/* ukr2->mask, ukr2->placed, ukr2->placed - CurrentTime); */
send_markup(sptr, &me, "SCAN-UNKLINE",
"%s unklined at %s (%s)",
ukr2->mask, smalldate(ukr2->placed), smalltime(ukr2->placed - CurrentTime));
}
}
send_markup(sptr, &me, "UNKLINE-END", "End of unkline list");
/* send_markup(sptr, &me, "SCAN-SUMMARY", "!begin<1>%d!end<1> matched", count); */
send_markup(sptr, &me, "SCAN-SUMMARY", "%d matched", count);
return 0;
}
示例6: m_registered
void
m_registered(struct Client *client_p, struct Client *source_p, int parc, char *parv[])
{
sendto_one(client_p, form_str(ERR_ALREADYREGISTRED), me.name, parv[0]);
}
示例7: msg_client
/* msg_client()
*
* inputs - flag 0 if PRIVMSG 1 if NOTICE. RFC
* say NOTICE must not auto reply
* - pointer to command, "PRIVMSG" or "NOTICE"
* - pointer to source_p source (struct Client *)
* - pointer to target_p target (struct Client *)
* - pointer to text
* output - NONE
* side effects - message given channel either chanop or voice
*/
static void
msg_client(int p_or_n, const char *command, struct Client *source_p,
struct Client *target_p, const char *text)
{
if (MyClient(source_p))
{
if (target_p->away[0] && p_or_n != NOTICE)
sendto_one_numeric(source_p, &me, RPL_AWAY, target_p->name, target_p->away);
if (HasUMode(target_p, UMODE_REGONLY) && target_p != source_p)
{
if (!HasUMode(source_p, UMODE_REGISTERED|UMODE_OPER))
{
if (p_or_n != NOTICE)
sendto_one_numeric(source_p, &me, ERR_NONONREG, target_p->name);
return;
}
}
}
if (MyClient(target_p))
{
if (!IsServer(source_p) && HasUMode(target_p, UMODE_CALLERID|UMODE_SOFTCALLERID))
{
/* Here is the anti-flood bot/spambot code -db */
if (HasFlag(source_p, FLAGS_SERVICE) || accept_message(source_p, target_p) ||
(HasUMode(source_p, UMODE_OPER) && ConfigGeneral.opers_bypass_callerid))
{
sendto_one(target_p, ":%s!%[email protected]%s %s %s :%s",
source_p->name, source_p->username,
source_p->host, command, target_p->name, text);
}
else
{
int callerid = !!HasUMode(target_p, UMODE_CALLERID);
/* check for accept, flag recipient incoming message */
if (p_or_n != NOTICE)
sendto_one_numeric(source_p, &me, RPL_TARGUMODEG,
target_p->name,
callerid ? "+g" : "+G",
callerid ? "server side ignore" :
"server side ignore with the exception of common channels");
if ((target_p->connection->last_caller_id_time +
ConfigGeneral.caller_id_wait) < CurrentTime)
{
if (p_or_n != NOTICE)
sendto_one_numeric(source_p, &me, RPL_TARGNOTIFY, target_p->name);
sendto_one_numeric(target_p, &me, RPL_UMODEGMSG,
get_client_name(source_p, HIDE_IP),
callerid ? "+g" : "+G");
target_p->connection->last_caller_id_time = CurrentTime;
}
/* Only so opers can watch for floods */
flood_attack_client(p_or_n, source_p, target_p);
}
}
else
{
/*
* If the client is remote, we dont perform a special check for
* flooding.. as we wouldn't block their message anyway.. this means
* we dont give warnings.. we then check if theyre opered
* (to avoid flood warnings), lastly if theyre our client
* and flooding -- fl
*/
if (!MyClient(source_p) || HasUMode(source_p, UMODE_OPER) ||
!flood_attack_client(p_or_n, source_p, target_p))
sendto_anywhere(target_p, source_p, command, ":%s", text);
}
}
else if (!MyClient(source_p) || HasUMode(source_p, UMODE_OPER) ||
!flood_attack_client(p_or_n, source_p, target_p))
sendto_anywhere(target_p, source_p, command, ":%s", text);
}
示例8: m_alias
int m_alias(aClient *cptr, aClient *sptr, int parc, char *parv[], char *cmd)
{
ConfigItem_alias *alias;
aClient *acptr;
int ret;
if (!(alias = Find_alias(cmd)))
{
sendto_one(sptr, ":%s %d %s %s :Unknown command",
me.name, ERR_UNKNOWNCOMMAND, parv[0], cmd);
return 0;
}
/* If it isn't an ALIAS_COMMAND, we require a paramter ... We check ALIAS_COMMAND LATER */
if (alias->type != ALIAS_COMMAND && (parc < 2 || *parv[1] == '\0'))
{
sendto_one(sptr, err_str(ERR_NOTEXTTOSEND), me.name, parv[0]);
return -1;
}
if (alias->type == ALIAS_SERVICES)
{
if (SERVICES_NAME && (acptr = find_person(alias->nick, NULL)))
{
if (alias->spamfilter && (ret = dospamfilter(sptr, parv[1], SPAMF_USERMSG, alias->nick, 0, NULL)) < 0)
return ret;
sendto_one(acptr, ":%s PRIVMSG %[email protected]%s :%s", parv[0],
alias->nick, SERVICES_NAME, parv[1]);
}
else
sendto_one(sptr, err_str(ERR_SERVICESDOWN), me.name,
parv[0], alias->nick);
}
else if (alias->type == ALIAS_STATS)
{
if (STATS_SERVER && (acptr = find_person(alias->nick, NULL)))
{
if (alias->spamfilter && (ret = dospamfilter(sptr, parv[1], SPAMF_USERMSG, alias->nick, 0, NULL)) < 0)
return ret;
sendto_one(acptr, ":%s PRIVMSG %[email protected]%s :%s", parv[0],
alias->nick, STATS_SERVER, parv[1]);
}
else
sendto_one(sptr, err_str(ERR_SERVICESDOWN), me.name,
parv[0], alias->nick);
}
else if (alias->type == ALIAS_NORMAL)
{
if ((acptr = find_person(alias->nick, NULL)))
{
if (alias->spamfilter && (ret = dospamfilter(sptr, parv[1], SPAMF_USERMSG, alias->nick, 0, NULL)) < 0)
return ret;
if (MyClient(acptr))
sendto_one(acptr, ":%s!%[email protected]%s PRIVMSG %s :%s", parv[0],
sptr->user->username, GetHost(sptr),
alias->nick, parv[1]);
else
sendto_one(acptr, ":%s PRIVMSG %s :%s", parv[0],
alias->nick, parv[1]);
}
else
sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name,
parv[0], alias->nick);
}
else if (alias->type == ALIAS_CHANNEL)
{
aChannel *chptr;
if ((chptr = find_channel(alias->nick, NULL)))
{
if (!can_send(sptr, chptr, parv[1], 0))
{
if (alias->spamfilter && (ret = dospamfilter(sptr, parv[1], SPAMF_CHANMSG, chptr->chname, 0, NULL)) < 0)
return ret;
sendto_channelprefix_butone(sptr,
sptr, chptr, PREFIX_ALL,
":%s PRIVMSG %s :%s", parv[0],
chptr->chname, parv[1]);
return 0;
}
}
sendto_one(sptr, err_str(ERR_CANNOTDOCOMMAND), me.name, parv[0],
cmd, "You may not use this command at this time");
}
else if (alias->type == ALIAS_COMMAND)
{
ConfigItem_alias_format *format;
char *ptr = "";
if (!(parc < 2 || *parv[1] == '\0'))
ptr = parv[1];
for (format = alias->format; format; format = (ConfigItem_alias_format *)format->next)
{
if (regexec(&format->expr, ptr, 0, NULL, 0) == 0)
{
/* Parse the parameters */
int i = 0, j = 0, k = 1;
char output[1024], current[1024];
char nums[4];
bzero(current, sizeof current);
bzero(output, sizeof output);
//.........这里部分代码省略.........
示例9: m_displaymsg
static int
m_displaymsg(struct Client *source_p, const char *channel, int underline, int action, const char *nick, const char *text)
{
struct Channel *chptr;
struct membership *msptr;
char nick2[NICKLEN+1];
char nick3[NICKLEN+1];
char text2[BUFSIZE];
if((chptr = find_channel(channel)) == NULL) {
sendto_one(source_p, form_str(ERR_NOSUCHCHANNEL), channel);
return 0;
}
if(!(msptr = find_channel_membership(chptr, source_p))) {
sendto_one_numeric(source_p, ERR_NOTONCHANNEL,
form_str(ERR_NOTONCHANNEL), chptr->chname);
return 0;
}
if(!(chptr->mode.mode & chmode_flags['N'])) {
sendto_one_numeric(source_p, 573, "%s :Roleplay commands are not enabled on this channel.", chptr->chname);
return 0;
}
if(!can_send(chptr, source_p, msptr)) {
sendto_one_numeric(source_p, 573, "%s :Cannot send to channel.", chptr->chname);
return 0;
}
/* enforce flood stuff on roleplay commands */
if(flood_attack_channel(0, source_p, chptr, chptr->chname))
return 0;
/* enforce target change on roleplay commands */
if(!is_chanop_voiced(msptr) && !IsOper(source_p) && !add_channel_target(source_p, chptr)) {
sendto_one(source_p, form_str(ERR_TARGCHANGE),
me.name, source_p->name, chptr->chname);
return 0;
}
rb_strlcpy(nick3, nick, sizeof(nick3));
if(underline)
snprintf(nick2, sizeof(nick2), "\x1F%s\x1F", strip_unprintable(nick3));
else
snprintf(nick2, sizeof(nick2), "%s", strip_unprintable(nick3));
/* don't allow nicks to be empty after stripping
* this prevents nastiness like fake factions, etc. */
if(EmptyString(nick3)) {
sendto_one_numeric(source_p, 573, "%s :No visible non-stripped characters in nick.", chptr->chname);
return 0;
}
if(action)
snprintf(text2, sizeof(text2), "\1ACTION %s\1", text);
else
snprintf(text2, sizeof(text2), "%s", text);
sendto_channel_local(ALL_MEMBERS, chptr, ":%s!%[email protected] PRIVMSG %s :%s (%s)", nick2, source_p->name, channel, text2, source_p->name);
sendto_match_servs(source_p, "*", CAP_ENCAP, NOCAPS, "ENCAP * ROLEPLAY %s %s :%s",
channel, nick2, text2);
return 0;
}
示例10: ms_lljoin
/*
* m_lljoin
* parv[0] = sender prefix
* parv[1] = channel
* parv[2] = nick ("!nick" == cjoin)
* parv[3] = key (optional)
*
* If a lljoin is received, from our uplink, join
* the requested client to the given channel, or ignore it
* if there is an error.
*
* Ok, the way this works. Leaf client tries to join a channel,
* it doesn't exist so the join does a cburst request on behalf of the
* client, and aborts that join. The cburst sjoin's the channel if it
* exists on the hub, and sends back an LLJOIN to the leaf. Thats where
* this is now..
*
*/
static void
ms_lljoin(struct Client *client_p, struct Client *source_p,
int parc, char *parv[])
{
char *chname = NULL;
char *nick = NULL;
char *key = NULL;
int flags;
int i;
struct Client *target_p;
struct Channel *chptr;
if (uplink && !IsCapable(uplink,CAP_LL))
{
sendto_realops_flags(UMODE_ALL, L_ALL,
"*** LLJOIN requested from non LL server %s",
client_p->name);
return;
}
chname = parv[1];
if(chname == NULL)
return;
nick = parv[2];
if(nick == NULL)
return;
if (parc >3)
key = parv[3];
flags = 0;
target_p = find_person(client_p, nick);
if (!target_p)
return;
if (!MyClient(target_p))
return;
if (!check_channel_name(chname, 0))
{
sendto_gnotice_flags(UMODE_DEBUG, L_ALL, me.name, &me, NULL,
"*** Too long or invalid channel name from %s: %s",
target_p->name, chname);
return;
}
chptr = make_channel(chname);
flags = CHFL_CHANOP;
if(!chptr)
return;
if (dlink_list_length(&chptr->members) == 0)
flags = CHFL_CHANOP;
else
flags = 0;
/* XXX in m_join.c :( */
/* check_spambot_warning(target_p, chname); */
/* They _could_ join a channel twice due to lag */
if(chptr)
{
if (IsMember(target_p, chptr)) /* already a member, ignore this */
return;
}
else
{
sendto_one(target_p, form_str(ERR_UNAVAILRESOURCE),
me.name, nick, chptr->chname);
return;
}
if ((i = can_join(target_p, chptr, key)))
{
sendto_one(target_p, form_str(i),
me.name, nick, chptr->chname);
return;
}
//.........这里部分代码省略.........
示例11: mo_ojoin
/*
** mo_ojoin
** parv[1] = channel
*/
static int
mo_ojoin(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
{
struct Channel *chptr;
int move_me = 0;
/* admins only */
if(!IsOperAdmin(source_p))
{
sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "admin");
return 0;
}
if(*parv[1] == '@' || *parv[1] == '%' || *parv[1] == '+' || *parv[1] == '!'
|| *parv[1] == '~')
{
parv[1]++;
move_me = 1;
}
else
{
sendto_one_notice(source_p, ":Unrecognized op prefix '%c'", *parv[1]);
return 0;
}
if((chptr = find_channel(parv[1])) == NULL)
{
sendto_one_numeric(source_p, ERR_NOSUCHCHANNEL,
form_str(ERR_NOSUCHCHANNEL), parv[1]);
return 0;
}
if(IsMember(source_p, chptr))
{
sendto_one_notice(source_p, ":Please part %s before using OJOIN", parv[1]);
return 0;
}
if(move_me == 1)
parv[1]--;
/* only sends stuff for #channels remotely */
if(*parv[1] == '!')
{
if(!ConfigChannel.use_admin)
{
sendto_one_notice(source_p,
":This server's configuration file does not support admin prefix");
return 0;
}
add_user_to_channel(chptr, source_p, CHFL_ADMIN);
sendto_server(client_p, chptr, CAP_TS6, NOCAPS,
":%s SJOIN %ld %s + :!%s",
me.id, (long) chptr->channelts, chptr->chname, source_p->id);
sendto_channel_local(ALL_MEMBERS, chptr, ":%s!%[email protected]%s JOIN %s",
source_p->name,
source_p->username, source_p->host, chptr->chname);
sendto_channel_local(ALL_MEMBERS, chptr, ":%s MODE %s +a %s",
me.name, chptr->chname, source_p->name);
}
else if(*parv[1] == '@')
{
add_user_to_channel(chptr, source_p, CHFL_CHANOP);
sendto_server(client_p, chptr, CAP_TS6, NOCAPS,
":%s SJOIN %ld %s + :@%s",
me.id, (long) chptr->channelts, chptr->chname, source_p->id);
send_channel_join(chptr, source_p);
sendto_channel_local(ALL_MEMBERS, chptr, ":%s MODE %s +o %s",
me.name, chptr->chname, source_p->name);
}
else if(*parv[1] == '%')
{
if(!ConfigChannel.use_halfop)
{
sendto_one_notice(source_p,
":This server's configuration file does not support halfop prefix");
return 0;
}
add_user_to_channel(chptr, source_p, CHFL_HALFOP);
sendto_server(client_p, chptr, CAP_TS6, NOCAPS,
":%s SJOIN %ld %s + :%s%s",
me.id, (long) chptr->channelts, chptr->chname, "%", source_p->id);
sendto_channel_local(ALL_MEMBERS, chptr, ":%s!%[email protected]%s JOIN %s",
source_p->name,
source_p->username, source_p->host, chptr->chname);
sendto_channel_local(ALL_MEMBERS, chptr, ":%s MODE %s +h %s",
me.name, chptr->chname, source_p->name);
}
else if(*parv[1] == '+')
{
add_user_to_channel(chptr, source_p, CHFL_VOICE);
//.........这里部分代码省略.........
示例12: ms_cburst
static void
ms_cburst(struct Client *client_p, struct Client *source_p, int parc, char *parv[])
{
char *name;
char *nick;
const char *key;
struct Channel *chptr;
if(parc < 2 || *parv[1] == '\0')
return;
name = parv[1];
if(parc > 2)
nick = parv[2];
else
nick = NULL;
if(parc > 3)
key = parv[3];
else
key = "";
#ifdef DEBUGLL
sendto_realops_flags(UMODE_ALL, L_ALL, "CBURST called by %s for %s %s %s",
client_p->name, name, nick ? nick : "", key ? key : "");
#endif
if((chptr = hash_find_channel(name)) == NULL)
{
if((!nick) || (nick && *nick != '!'))
{
if(!check_channel_name(name, 0))
{
sendto_realops_flags(UMODE_DEBUG, L_ALL,
"*** Too long or invalid channel name from %s: %s",
client_p->name, name);
return;
}
chptr = make_channel(name);
chptr->channelts = (time_t) (-1); /* highest possible TS so its always
* over-ruled
*/
}
else if(nick && *nick == '!')
{
sendto_one(source_p, form_str(ERR_NOSUCHCHANNEL), me.name, nick + 1, name);
return;
}
}
if(IsCapable(client_p, CAP_LL))
{
burst_channel(client_p, chptr);
if(nick)
sendto_one(client_p, ":%s LLJOIN %s %s %s", me.name, name, nick, key);
}
else
{
sendto_realops_flags(UMODE_ALL, L_ALL,
"*** CBURST request received from non LL capable server! [%s]",
client_p->name);
}
}
示例13: mo_testline
static int
mo_testline(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
{
struct ConfItem *aconf;
struct ConfItem *resv_p;
struct rb_sockaddr_storage ip;
char user_trunc[USERLEN + 1], notildeuser_trunc[USERLEN + 1];
const char *name = NULL;
const char *username = NULL;
const char *host = NULL;
char *mask;
char *p;
int host_mask;
int type;
int duration;
char *puser, *phost, *reason, *operreason;
char reasonbuf[BUFSIZE];
mask = LOCAL_COPY(parv[1]);
if (IsChannelName(mask))
{
resv_p = hash_find_resv(mask);
if (resv_p != NULL)
{
sendto_one(source_p, form_str(RPL_TESTLINE),
me.name, source_p->name,
resv_p->hold ? 'q' : 'Q',
resv_p->hold ? (long) ((resv_p->hold - rb_current_time()) / 60) : 0L,
resv_p->host, resv_p->passwd);
/* this is a false positive, so make sure it isn't counted in stats q
* --nenolod
*/
resv_p->port--;
}
else
sendto_one(source_p, form_str(RPL_NOTESTLINE),
me.name, source_p->name, parv[1]);
return 0;
}
if((p = strchr(mask, '!')))
{
*p++ = '\0';
name = mask;
mask = p;
if(EmptyString(mask))
return 0;
}
if((p = strchr(mask, '@')))
{
*p++ = '\0';
username = mask;
host = p;
if(EmptyString(host))
return 0;
}
else
host = mask;
/* parses as an IP, check for a dline */
if((type = parse_netmask(host, &ip, &host_mask)) != HM_HOST)
{
#ifdef RB_IPV6
if(type == HM_IPV6)
aconf = find_dline((struct sockaddr *)&ip, AF_INET6);
else
#endif
aconf = find_dline((struct sockaddr *)&ip, AF_INET);
if(aconf && aconf->status & CONF_DLINE)
{
get_printable_kline(source_p, aconf, &phost, &reason, &puser, &operreason);
snprintf(reasonbuf, sizeof(reasonbuf), "%s%s%s", reason,
operreason ? "|" : "", operreason ? operreason : "");
sendto_one(source_p, form_str(RPL_TESTLINE),
me.name, source_p->name,
(aconf->flags & CONF_FLAGS_TEMPORARY) ? 'd' : 'D',
(aconf->flags & CONF_FLAGS_TEMPORARY) ?
(long) ((aconf->hold - rb_current_time()) / 60) : 0L,
phost, reasonbuf);
return 0;
}
/* Otherwise, aconf is an exempt{} */
if(aconf == NULL &&
(duration = is_reject_ip((struct sockaddr *)&ip)))
sendto_one(source_p, form_str(RPL_TESTLINE),
me.name, source_p->name,
'!',
duration / 60L,
host, "Reject cache");
if(aconf == NULL &&
(duration = is_throttle_ip((struct sockaddr *)&ip)))
sendto_one(source_p, form_str(RPL_TESTLINE),
me.name, source_p->name,
'!',
//.........这里部分代码省略.........
示例14: m_challenge
/*
* m_challenge - generate RSA challenge for wouldbe oper
* parv[1] = operator to challenge for, or +response
*
*/
static int
m_challenge(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
{
struct oper_conf *oper_p;
char *challenge = NULL; /* to placate gcc */
char chal_line[CHALLENGE_WIDTH];
unsigned char *b_response;
size_t cnt;
int len = 0;
/* if theyre an oper, reprint oper motd and ignore */
if(IsOper(source_p))
{
sendto_one(source_p, form_str(RPL_YOUREOPER), me.name, source_p->name);
send_oper_motd(source_p);
return 0;
}
if(*parv[1] == '+')
{
/* Ignore it if we aren't expecting this... -A1kmm */
if(!source_p->localClient->challenge)
return 0;
if((rb_current_time() - source_p->localClient->chal_time) > CHALLENGE_EXPIRES)
{
sendto_one(source_p, form_str(ERR_PASSWDMISMATCH), me.name, source_p->name);
ilog(L_FOPER, "EXPIRED CHALLENGE (%s) by (%s!%[email protected]%s) (%s)",
source_p->localClient->opername, source_p->name,
source_p->username, source_p->host, source_p->sockhost);
if(ConfigFileEntry.failed_oper_notice)
sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
"Expired CHALLENGE attempt by %s (%[email protected]%s)",
source_p->name, source_p->username,
source_p->host);
cleanup_challenge(source_p);
return 0;
}
parv[1]++;
b_response = rb_base64_decode((const unsigned char *)parv[1], strlen(parv[1]), &len);
if(len != SHA_DIGEST_LENGTH ||
memcmp(source_p->localClient->challenge, b_response, SHA_DIGEST_LENGTH))
{
sendto_one(source_p, form_str(ERR_PASSWDMISMATCH), me.name, source_p->name);
ilog(L_FOPER, "FAILED CHALLENGE (%s) by (%s!%[email protected]%s) (%s)",
source_p->localClient->opername, source_p->name,
source_p->username, source_p->host, source_p->sockhost);
if(ConfigFileEntry.failed_oper_notice)
sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
"Failed CHALLENGE attempt by %s (%[email protected]%s)",
source_p->name, source_p->username,
source_p->host);
rb_free(b_response);
cleanup_challenge(source_p);
return 0;
}
rb_free(b_response);
oper_p = find_oper_conf(source_p->username, source_p->orighost,
source_p->sockhost,
source_p->localClient->opername);
if(oper_p == NULL)
{
sendto_one_numeric(source_p, ERR_NOOPERHOST, form_str(ERR_NOOPERHOST));
ilog(L_FOPER, "FAILED OPER (%s) by (%s!%[email protected]%s) (%s)",
source_p->localClient->opername, source_p->name,
source_p->username, source_p->host,
source_p->sockhost);
if(ConfigFileEntry.failed_oper_notice)
sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
"Failed CHALLENGE attempt - host mismatch by %s (%[email protected]%s)",
source_p->name, source_p->username,
source_p->host);
return 0;
}
cleanup_challenge(source_p);
oper_up(source_p, oper_p);
ilog(L_OPERED, "OPER %s by %s!%[email protected]%s (%s)",
source_p->localClient->opername, source_p->name,
source_p->username, source_p->host, source_p->sockhost);
return 0;
}
cleanup_challenge(source_p);
//.........这里部分代码省略.........
示例15: do_numeric
/*
*
* parc number of arguments ('sender' counted as one!)
* parv[0] pointer to 'sender' (may point to empty string) (not used)
* parv[1]..parv[parc-1]
* pointers to additional parameters, this is a NULL
* terminated list (parv[parc] == NULL).
*
* *WARNING*
* Numerics are mostly error reports. If there is something
* wrong with the message, just *DROP* it! Don't even think of
* sending back a neat error message -- big danger of creating
* a ping pong error message...
*/
static void
do_numeric(char numeric[], struct Client *client_p, struct Client *source_p, int parc, char *parv[])
{
struct Client *target_p;
struct Channel *chptr;
if(parc < 2 || !IsServer(source_p))
return;
/* Remap low number numerics. */
if(numeric[0] == '0')
numeric[0] = '1';
/*
* Prepare the parameter portion of the message into 'buffer'.
* (Because the buffer is twice as large as the message buffer
* for the socket, no overflow can occur here... ...on current
* assumptions--bets are off, if these are changed --msa)
* Note: if buffer is non-empty, it will begin with SPACE.
*/
if(parc > 1)
{
char *t = buffer; /* Current position within the buffer */
int i;
int tl; /* current length of presently being built string in t */
for (i = 2; i < (parc - 1); i++)
{
tl = ircsprintf(t, " %s", parv[i]);
t += tl;
}
ircsprintf(t, " :%s", parv[parc - 1]);
}
if((target_p = find_client(parv[1])) != NULL)
{
if(IsMe(target_p))
{
/*
* We shouldn't get numerics sent to us,
* any numerics we do get indicate a bug somewhere..
*/
/* ugh. this is here because of nick collisions. when two servers
* relink, they burst each other their nicks, then perform collides.
* if there is a nick collision, BOTH servers will kill their own
* nicks, and BOTH will kill the other servers nick, which wont exist,
* because it will have been already killed by the local server.
*
* unfortunately, as we cant guarantee other servers will do the
* "right thing" on a nick collision, we have to keep both kills.
* ergo we need to ignore ERR_NOSUCHNICK. --fl_
*/
/* quick comment. This _was_ tried. i.e. assume the other servers
* will do the "right thing" and kill a nick that is colliding.
* unfortunately, it did not work. --Dianora
*/
if(atoi(numeric) != ERR_NOSUCHNICK)
sendto_realops_flags(UMODE_ALL, L_ADMIN,
"*** %s(via %s) sent a %s numeric to me: %s",
source_p->name, client_p->name, numeric,
buffer);
return;
}
else if(target_p->from == client_p)
{
/* This message changed direction (nick collision?)
* ignore it.
*/
return;
}
/* csircd will send out unknown umode flag for +a (admin), drop it here. */
if((atoi(numeric) == ERR_UMODEUNKNOWNFLAG) && MyClient(target_p))
return;
/* Fake it for server hiding, if its our client */
if(ConfigServerHide.hide_servers && MyClient(target_p) && !IsOper(target_p))
sendto_one(target_p, ":%s %s %s%s", me.name, numeric, parv[1], buffer);
else
sendto_one(target_p, ":%s %s %s%s", source_p->name, numeric, parv[1],
buffer);
return;
}
else if((chptr = hash_find_channel(parv[1])) != NULL)
sendto_channel_local(ALL_MEMBERS, chptr,
":%s %s %s %s",
source_p->name, numeric, chptr->chname, buffer);
//.........这里部分代码省略.........