static int u_delinvite(struct chanset_t *c, char *who, int doit) { int j, i = 0; maskrec *t; maskrec **u = c ? &(c->invites) : &global_invites; char temp[256]; if (!strchr(who, '!') && str_isdigit(who)) { j = atoi(who); j--; for (; (*u) && j; u = &((*u)->next), j--); if (*u) { strncpyz(temp, (*u)->mask, sizeof temp); i = 1; } else return -j - 1; } else { /* Find matching host, if there is one */ for (; *u && !i; u = &((*u)->next)) if (!rfc_casecmp((*u)->mask, who)) { strncpyz(temp, who, sizeof temp); i = 1; break; } if (!*u) return 0; } if (i && doit) { if (!noshare) { char *mask = str_escape(temp, ':', '\\'); if (mask) { /* Distribute chan invites differently */ if (c) shareout(c, "-invc %s %s\n", c->dname, mask); else shareout(NULL, "-inv %s\n", mask); nfree(mask); } } if (lastdeletedmask) nfree(lastdeletedmask); lastdeletedmask = nmalloc(strlen((*u)->mask) + 1); strcpy(lastdeletedmask, (*u)->mask); nfree((*u)->mask); if ((*u)->desc) nfree((*u)->desc); if ((*u)->user) nfree((*u)->user); t = *u; *u = (*u)->next; nfree(t); } return i; }
const char * skip_numbers (const char *s) { const char *su = s; for (; *su; str_cnext_char (&su)) if (!str_isdigit (su)) break; return su; }
int deflag_translate(const char *buf) { if (str_isdigit(buf)) return (atoi(buf)); if (!strcasecmp(buf, "ignore")) return P_IGNORE; else if (!strcasecmp(buf, "deop")) return P_DEOP; else if (!strcasecmp(buf, "kick")) return P_KICK; else if (!strcasecmp(buf, "delete") || !strcasecmp(buf, "remove")) return P_DELETE; return P_IGNORE; }
deflag_t deflag_translate(const char *buf) { if (str_isdigit(buf)) return (static_cast<deflag_t>(atoi(buf))); if (!strcasecmp(buf, "ignore")) return DEFLAG_IGNORE; else if (!strcasecmp(buf, "deop")) return DEFLAG_DEOP; else if (!strcasecmp(buf, "kick")) return DEFLAG_KICK; else if (!strcasecmp(buf, "delete") || !strcasecmp(buf, "remove")) return DEFLAG_DELETE; else if (!strcasecmp(buf, "react")) return DEFLAG_REACT; return DEFLAG_IGNORE; }
gchar * mc_search__get_one_symbol (const char *charset, const char *str, gsize str_len, gboolean * just_letters) { gchar *converted_str; const gchar *next_char; gsize tmp_len; #ifdef HAVE_CHARSET gsize converted_str_len; gchar *converted_str2; if (charset == NULL) charset = cp_source; converted_str = mc_search__recode_str (str, str_len, charset, cp_display, &converted_str_len); #else (void) charset; converted_str = g_strndup (str, str_len); #endif next_char = str_cget_next_char (converted_str); tmp_len = next_char - converted_str; converted_str[tmp_len] = '\0'; #ifdef HAVE_CHARSET converted_str2 = mc_search__recode_str (converted_str, tmp_len, cp_display, charset, &converted_str_len); #endif if (just_letters) { if (str_isalnum (converted_str) && !str_isdigit (converted_str)) *just_letters = TRUE; else *just_letters = FALSE; } #ifdef HAVE_CHARSET g_free (converted_str); return converted_str2; #else return converted_str; #endif }
int get_input(t_env *e) { char *line; ft_putendl("- Choose a column:"); while (get_next_line(0, &line) > 0) { e->input = ft_atoi(line); if (str_isdigit(line) == -1 || e->input < 0 || e->input > e->w - 1 || e->board[0][e->input] != '.') { ft_putstr("invalid input\n"); ft_putendl("- Choose a column:"); ft_strdel(&line); } else break ; } ft_strdel(&line); return (0); }
/* Set sticky attribute for a mask. */ static int u_setsticky_mask(struct chanset_t *chan, maskrec *u, char *uhost, int sticky, char *botcmd) { int j; if (str_isdigit(uhost)) j = atoi(uhost); else j = -1; while (u) { if (j >= 0) j--; if (!j || ((j < 0) && !rfc_casecmp(u->mask, uhost))) { if (sticky > 0) u->flags |= MASKREC_STICKY; else if (!sticky) u->flags &= ~MASKREC_STICKY; else /* We don't actually want to change, just skip over */ return 0; if (!j) strcpy(uhost, u->mask); if (!noshare) shareout(chan, "%s %s %d %s\n", botcmd, uhost, sticky, (chan) ? chan->dname : ""); return 1; } u = u->next; } if (j >= 0) return -j; return 0; }
void CTeeFiles::Save() { const int sz = 32; for(int i = 0; i < m_aTees.size(); i++) { CTee *pTee = Get(i); bool Rename = false; char aFilename[41]; // + ".tee" + "xxx_" char aBuf[512]; if(pTee->m_aFilename[0] == '\0') { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "teefile%d%s%s%s%d%d%d%d", i, pTee->m_aName, pTee->m_aClan, pTee->m_aSkin, pTee->m_UseCustomColor, pTee->m_ColorBody, pTee->m_ColorFeet, pTee->m_Country); str_format(aFilename, sizeof(aFilename), "%03d_%s.tee", i, md5(aBuf)); } else { if(!(str_isdigit(pTee->m_aFilename[0]) && str_isdigit(pTee->m_aFilename[1]) && str_isdigit(pTee->m_aFilename[2]) && pTee->m_aFilename[3] == '_')) { str_format(aFilename, sizeof(aFilename), "%03d_%s", i, pTee->m_aFilename); Rename = true; } else { char aNewIndex[4]; char aOldIndex[4]; str_format(aNewIndex, sizeof(aNewIndex), "%03d", i); str_format(aOldIndex, sizeof(aOldIndex), pTee->m_aFilename); str_format(aFilename, sizeof(aFilename), pTee->m_aFilename); if(str_toint(aNewIndex) != str_toint(aOldIndex)) { for(int i = 0; i < 3; i++) aFilename[i] = aNewIndex[i]; Rename = true; } } } if(Rename) { char OldName[512]; char NewName[512]; str_format(OldName, sizeof(OldName), "xclient/teefiles/%s", pTee->m_aFilename); str_format(NewName, sizeof(NewName), "xclient/teefiles/%s", aFilename); Storage()->RenameFile(OldName, NewName, IStorage::TYPE_SAVE); Storage()->RemoveFile(OldName, IStorage::TYPE_SAVE); str_format(aBuf, sizeof(aBuf), "renamed '%s' to %s", pTee->m_aFilename, aFilename); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "console", aBuf); } str_format(aBuf, sizeof(aBuf), "xclient/teefiles/%s", aFilename); IOHANDLE File = Storage()->OpenFile(aBuf, IOFLAG_WRITE, IStorage::TYPE_SAVE); if(!File) continue; char aTeeEntry[NUM_TEE_ENTRIES][sz]; str_format(aTeeEntry[TEE_NAME], sz, pTee->m_aName); str_format(aTeeEntry[TEE_CLAN], sz, pTee->m_aClan); str_format(aTeeEntry[TEE_SKIN], sz, pTee->m_aSkin); str_format(aTeeEntry[TEE_USECUSTOMCOLOR], sz, "%d", pTee->m_UseCustomColor); str_format(aTeeEntry[TEE_COLORBODY], sz, "%d", pTee->m_ColorBody); str_format(aTeeEntry[TEE_COLORFEET], sz, "%d", pTee->m_ColorFeet); str_format(aTeeEntry[TEE_COUNTRY], sz, "%d", pTee->m_Country); for(int j = 0; j < NUM_TEE_ENTRIES; j++) { if(!File) { str_format(aBuf, sizeof(aBuf), "failed to save '%s' at line %d", aFilename, j); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "console", aBuf); io_close(File); mem_zero(aTeeEntry[j], sizeof(aTeeEntry[j])); break; } io_write(File, aTeeEntry[j], str_length(aTeeEntry[j])); io_write_newline(File); } io_close(File); } }
static void cmd_stick_yn(int idx, char *par, int yn) { int i = 0, j; struct chanset_t *chan = NULL; char *stick_type = NULL, s[UHOSTLEN] = "", chname[81] = "", type = 0, *str_type = NULL; maskrec *channel_list = NULL; stick_type = newsplit(&par); strlcpy(s, newsplit(&par), sizeof s); strlcpy(chname, newsplit(&par), sizeof chname); if (strcasecmp(stick_type, "exempt") && strcasecmp(stick_type, "invite") && strcasecmp(stick_type, "ban")) { strlcpy(chname, s, sizeof chname); strlcpy(s, stick_type, sizeof s); stick_type = "ban"; } if (!s[0]) { dprintf(idx, "Usage: %sstick [ban/exempt/invite] <hostmask or number> [channel]\n", yn ? "" : "un"); return; } /* Now deal with exemptions */ if (!strcasecmp(stick_type, "exempt")) { type = 'e'; str_type = "exempt"; } else if (!strcasecmp(stick_type, "invite")) { type = 'I'; str_type = "invite"; } else if (!strcasecmp(stick_type, "ban")) { type = 'b'; str_type = "ban"; } else return; if (!chname[0]) { channel_list = (type == 'b' ? global_bans : type == 'e' ? global_exempts : global_invites); i = u_setsticky_mask(NULL, channel_list, s, (dcc[idx].user->flags & USER_MASTER) ? yn : -1, type); if (i > 0) { putlog(LOG_CMDS, "*", "#%s# %sstick %s %s", dcc[idx].nick, yn ? "" : "un", str_type, s); dprintf(idx, "%stuck %s: %s\n", yn ? "S" : "Uns", str_type, s); if (!conf.bot->hub) { struct chanset_t *achan = NULL; for (achan = chanset; achan != NULL; achan = achan->next) check_this_mask(type, achan, s, yn); } else write_userfile(idx); return; } strlcpy(chname, dcc[idx].u.chat->con_chan, sizeof chname); } /* Channel-specific mask? */ if (!(chan = findchan_by_dname(chname))) { dprintf(idx, "No such channel.\n"); return; } get_user_flagrec(dcc[idx].user, &user, chan->dname); if (privchan(user, chan, PRIV_OP)) { dprintf(idx, "No such channel.\n"); return; } channel_list = (type == 'b' ? chan->bans : type == 'e' ? chan->exempts : chan->invites); if (str_isdigit(s)) { /* substract the numer of global masks to get the number of the channel masks */ j = atoi(s); j -= count_mask(type == 'b' ? global_bans : type == 'e' ? global_exempts : global_invites); simple_snprintf(s, sizeof s, "%d", j); } j = u_setsticky_mask(chan, channel_list, s, yn, type); if (j > 0) { putlog(LOG_CMDS, "*", "#%s# %sstick %s %s %s", dcc[idx].nick, yn ? "" : "un", str_type, s, chname); dprintf(idx, "%stuck %s %s: %s\n", yn ? "S" : "Uns", chname, str_type, s); if (!conf.bot->hub) check_this_mask(type, chan, s, yn); else write_userfile(idx); return; } dprintf(idx, "No such %s.\n", str_type); }
static void cmd_mns_mask(const char type, int idx, char *par) { const char *cmd = (type == 'b' ? "ban" : type == 'e' ? "exempt" : "invite"); if (!par[0]) { usage: dprintf(idx, "Usage: -%s <hostmask> [channel]\n", cmd); return; } int i = 0, j; struct chanset_t *chan = NULL; char s[UHOSTLEN] = "", *who = NULL, *chname = NULL, *mask = NULL; masklist *m = NULL; who = newsplit(&par); if (par[0] && strchr(CHANMETA, par[0])) chname = newsplit(&par); /* Did they mix up the two params? */ if (!chname && strchr(CHANMETA, who[0])) { if (par[0]) { chname = who; who = newsplit(&par); } else { goto usage; } } if (!chname) chname = dcc[idx].u.chat->con_chan; if (chname || !(dcc[idx].user->flags & USER_MASTER)) { if (!chname) chname = dcc[idx].u.chat->con_chan; get_user_flagrec(dcc[idx].user, &user, chname); if (strchr(CHANMETA, chname[0]) && privchan(user, findchan_by_dname(chname), PRIV_OP)) { dprintf(idx, "No such channel.\n"); return; } if (!chk_op(user, findchan_by_dname(chname))) return; } strlcpy(s, who, sizeof s); i = u_delmask(type, NULL, s, (dcc[idx].user->flags & USER_MASTER)); if (i > 0) { if (lastdeletedmask) mask = lastdeletedmask; else mask = s; putlog(LOG_CMDS, "*", "#%s# -%s %s", dcc[idx].nick, cmd, mask); dprintf(idx, "%s %s: %s\n", "Removed", cmd, s); if (!conf.bot->hub) { for (chan = chanset; chan != NULL; chan = chan->next) add_mode(chan, '-', type, mask); } else write_userfile(idx); return; } /* Channel-specific ban? */ if (chname) chan = findchan_by_dname(chname); if (chan) { m = type == 'b' ? chan->channel.ban : type == 'e' ? chan->channel.exempt : chan->channel.invite; if (str_isdigit(who) && (i = atoi(who)) > 0) { simple_snprintf(s, sizeof s, "%d", i); j = u_delmask(type, chan, s, 1); if (j > 0) { if (lastdeletedmask) mask = lastdeletedmask; else mask = s; putlog(LOG_CMDS, "*", "#%s# (%s) -%s %s", dcc[idx].nick, chan->dname, cmd, mask); dprintf(idx, "Removed %s channel %s: %s\n", chan->dname, cmd, mask); if (!conf.bot->hub) add_mode(chan, '-', type, mask); else write_userfile(idx); return; } i = 0; for (; m && m->mask && m->mask[0]; m = m->next) { if ((!u_equals_mask(type == 'b' ? global_bans : type == 'e' ? global_exempts : global_invites, m->mask)) && (!u_equals_mask(type == 'b' ? chan->bans : type == 'e' ? chan->exempts : chan->invites, m->mask))) { i++; if (i == -j) { dprintf(idx, "%s %s '%s' on %s.\n", "Removed", cmd, m->mask, chan->dname); putlog(LOG_CMDS, "*", "#%s# (%s) -%s %s [on channel]", dcc[idx].nick, chan->dname, cmd, who); if (!conf.bot->hub) add_mode(chan, '-', type, m->mask); else write_userfile(idx); return; } } } } else { j = u_delmask(type, chan, who, 1); if (j > 0) { putlog(LOG_CMDS, "*", "#%s# (%s) -%s %s", dcc[idx].nick, dcc[idx].u.chat->con_chan, cmd, who); dprintf(idx, "Removed %s channel %s: %s\n", chname, cmd, who); if (!conf.bot->hub) add_mode(chan, '-', type, who); else write_userfile(idx); return; } for (; m && m->mask && m->mask[0]; m = m->next) { if (!rfc_casecmp(m->mask, who)) { dprintf(idx, "%s %s '%s' on %s.\n", "Removed", cmd, m->mask, chan->dname); putlog(LOG_CMDS, "*", "#%s# (%s) -%s %s [on channel]", dcc[idx].nick, chan->dname, cmd, who); if (!conf.bot->hub) add_mode(chan, '-', type, m->mask); else write_userfile(idx); return; } } } } dprintf(idx, "No such %s.\n", cmd); }
_export bool str_isalnum(char ch) { return str_isalpha(ch) || str_isdigit(ch); }