/* ircd allows forwards to existing channels; the target channel must be * +F or the setter must have ops in it */ static bool check_forward(const char *value, channel_t *c, mychan_t *mc, user_t *u, myuser_t *mu) { channel_t *target_c; mychan_t *target_mc; chanuser_t *target_cu; if (!VALID_GLOBAL_CHANNEL_PFX(value) || strlen(value) > 50) return false; if (u == NULL && mu == NULL) return true; target_c = channel_find(value); target_mc = mychan_from(target_c); if (target_c == NULL && target_mc == NULL) return false; if (target_c != NULL && target_c->modes & CMODE_FTARGET) return true; if (target_mc != NULL && target_mc->mlock_on & CMODE_FTARGET) return true; if (u != NULL) { target_cu = chanuser_find(target_c, u); if (target_cu != NULL && target_cu->modes & CSTATUS_OP) return true; if (chanacs_user_flags(target_mc, u) & CA_SET) return true; } else if (mu != NULL) if (chanacs_entity_has_flag(target_mc, entity(mu), CA_SET)) return true; return false; }
static bool check_forward(const char *value, channel_t *c, mychan_t *mc, user_t *u, myuser_t *mu) { channel_t *target_c; mychan_t *target_mc; if (!VALID_GLOBAL_CHANNEL_PFX(value) || strlen(value) > 50) return false; if (u == NULL && mu == NULL) return true; target_c = channel_find(value); target_mc = MYCHAN_FROM(target_c); if (target_c == NULL && target_mc == NULL) return false; return true; }