void write_h_file(const char *fname) { node_t *ndp; char *cptr; char *cast; FILE *fp; token_t *ttab; int ntab; int i; int once = 0; int idx_en = 0; fp = fopen(fname, "w"); if(!fp) { perror(fname); exit(1); } fprintf(fp, str_header, input_name ? input_name : "<stdin>", cmdline); fprintf(fp, "#ifndef __WMCGENERATED_H\n"); fprintf(fp, "#define __WMCGENERATED_H\n"); fprintf(fp, "\n"); /* Write severity and facility aliases */ get_tokentable(&ttab, &ntab); fprintf(fp, "/* Severity codes */\n"); for(i = 0; i < ntab; i++) { if(ttab[i].type == tok_severity && ttab[i].alias) { cptr = dup_u2c(WMC_DEFAULT_CODEPAGE, ttab[i].alias); fprintf(fp, "#define %s\t0x%x\n", cptr, ttab[i].token); free(cptr); } } fprintf(fp, "\n"); fprintf(fp, "/* Facility codes */\n"); for(i = 0; i < ntab; i++) { if(ttab[i].type == tok_facility && ttab[i].alias) { cptr = dup_u2c(WMC_DEFAULT_CODEPAGE, ttab[i].alias); fprintf(fp, "#define %s\t0x%x\n", cptr, ttab[i].token); free(cptr); } } fprintf(fp, "\n"); /* Write the message codes */ fprintf(fp, "/* Message definitions */\n"); for(ndp = nodehead; ndp; ndp = ndp->next) { switch(ndp->type) { case nd_comment: cptr = dup_u2c(WMC_DEFAULT_CODEPAGE, ndp->u.comment+1); killnl(cptr, 0); killcomment(cptr); if(*cptr) fprintf(fp, "/* %s */\n", cptr); else fprintf(fp, "\n"); free(cptr); break; case nd_msg: if(!once) { /* * Search for an English text. * If not found, then use the first in the list */ once++; for(i = 0; i < ndp->u.msg->nmsgs; i++) { if(ndp->u.msg->msgs[i]->lan == 0x409) { idx_en = i; break; } } fprintf(fp, "\n"); } fprintf(fp, "/* MessageId : 0x%08x */\n", ndp->u.msg->realid); cptr = dup_u2c(ndp->u.msg->msgs[idx_en]->cp, ndp->u.msg->msgs[idx_en]->msg); killnl(cptr, 0); killcomment(cptr); fprintf(fp, "/* Approximate msg: %s */\n", cptr); free(cptr); cptr = dup_u2c(WMC_DEFAULT_CODEPAGE, ndp->u.msg->sym); if(ndp->u.msg->cast) cast = dup_u2c(WMC_DEFAULT_CODEPAGE, ndp->u.msg->cast); else cast = NULL; switch(ndp->u.msg->base) { case 8: if(cast) fprintf(fp, "#define %s\t((%s)0%oL)\n\n", cptr, cast, ndp->u.msg->realid); else fprintf(fp, "#define %s\t0%oL\n\n", cptr, ndp->u.msg->realid); break; case 10: if(cast) fprintf(fp, "#define %s\t((%s)%dL)\n\n", cptr, cast, ndp->u.msg->realid); else fprintf(fp, "#define %s\t%dL\n\n", cptr, ndp->u.msg->realid); break; case 16: if(cast) fprintf(fp, "#define %s\t((%s)0x%08xL)\n\n", cptr, cast, ndp->u.msg->realid); else fprintf(fp, "#define %s\t0x%08xL\n\n", cptr, ndp->u.msg->realid); break; default: internal_error(__FILE__, __LINE__, "Invalid base for number print\n"); } free(cptr); free(cast); break; default: internal_error(__FILE__, __LINE__, "Invalid node type %d\n", ndp->type); } } fprintf(fp, "\n#endif\n"); fclose(fp); }
/** Searches for a K/G-line for a client. If one is found, notify the * user and disconnect them. * @param cptr Client to search for. * @return 0 if client is accepted; -1 if client was locally denied * (K-line); -2 if client was globally denied (G-line); -3 if client * was globally IP denied (Z-line). */ int find_kill(struct Client *cptr) { const char* host; const char* name; const char* realname; const char* country; const char* continent; const char* version; struct DenyConf* deny; struct Gline* agline = NULL; struct Zline* azline = NULL; assert(0 != cptr); if (!cli_user(cptr)) return 0; host = cli_sockhost(cptr); name = cli_user(cptr)->username; realname = cli_info(cptr); country = cli_countrycode(cptr); continent = cli_continentcode(cptr); version = cli_version(cptr); assert(strlen(host) <= HOSTLEN); assert((name ? strlen(name) : 0) <= HOSTLEN); assert((realname ? strlen(realname) : 0) <= REALLEN); assert((country ? strlen(country) : 0) <= 3); assert((continent ? strlen(continent) : 0) <= 3); assert((version ? strlen(version) : 0) <= VERSIONLEN); /* 2000-07-14: Rewrote this loop for massive speed increases. * -- Isomer */ if (!find_except_conf(cptr, EFLAG_KLINE)) { for (deny = denyConfList; deny; deny = deny->next) { if (deny->usermask && match(deny->usermask, name)) continue; if (deny->realmask && match(deny->realmask, realname)) continue; if (deny->countrymask && country && match(deny->countrymask, country)) continue; if (deny->continentmask && continent && match(deny->continentmask, continent)) continue; if (feature_bool(FEAT_CTCP_VERSIONING) && feature_bool(FEAT_CTCP_VERSIONING_KILL)) { if (deny->version && version && match(deny->version, version)) continue; } if (deny->bits > 0) { if (!ipmask_check(&cli_ip(cptr), &deny->address, deny->bits)) continue; } else if (deny->hostmask && match(deny->hostmask, host)) continue; if ((deny->flags & DENY_FLAGS_AUTHEX) && IsAccount(cptr)) { if (!EmptyString(deny->mark) && EmptyString(cli_killmark(cptr))) ircd_strncpy(cli_killmark(cptr), deny->mark, BUFSIZE); continue; } if (EmptyString(deny->message)) send_reply(cptr, SND_EXPLICIT | ERR_YOUREBANNEDCREEP, ":Connection from your host is refused on this server."); else { if (deny->flags & DENY_FLAGS_FILE) killcomment(cptr, deny->message); else send_reply(cptr, SND_EXPLICIT | ERR_YOUREBANNEDCREEP, ":%s.", deny->message); } return -1; } } /* Check Zlines here just in case a spoofed IP matches */ if (!feature_bool(FEAT_DISABLE_ZLINES) && (azline = zline_lookup(cptr, 0))) { /* * find active zlines * added a check against the user's IP address to find_zline() */ send_reply(cptr, SND_EXPLICIT | ERR_YOUREBANNEDCREEP, ":%s.", ZlineReason(azline)); return -3; } /* Don't need to do an except lookup here as it's done in gline_lookup() */ if (!feature_bool(FEAT_DISABLE_GLINES) && (agline = gline_lookup(cptr, 0))) { /* * find active glines * added a check against the user's IP address to find_gline() -Kev */ send_reply(cptr, SND_EXPLICIT | ERR_YOUREBANNEDCREEP, ":%s.", GlineReason(agline)); return -2; } return 0; }