bool get_config_subnet(const config_t *cfg, subnet_t ** result) { subnet_t subnet = {NULL}; if(!cfg) return false; if(!str2net(&subnet, cfg->value)) { logger(LOG_ERR, "Subnet expected for configuration variable %s in %s line %d", cfg->variable, cfg->file, cfg->line); return false; } /* Teach newbies what subnets are... */ if(((subnet.type == SUBNET_IPV4) && !maskcheck(&subnet.net.ipv4.address, subnet.net.ipv4.prefixlength, sizeof(ipv4_t))) || ((subnet.type == SUBNET_IPV6) && !maskcheck(&subnet.net.ipv6.address, subnet.net.ipv6.prefixlength, sizeof(ipv6_t)))) { logger(LOG_ERR, "Network address and prefix length do not match for configuration variable %s in %s line %d", cfg->variable, cfg->file, cfg->line); return false; } *(*result = new_subnet()) = subnet; return true; }
unsigned char *CmdEncode(unsigned int iChar) { unsigned char *szReturn = NULL; szReturn = new unsigned char[7]; memset(szReturn, 0, 7); if(iChar <= 127) { szReturn[0] = iChar; } else if(iChar >= 0x80 && iChar <= 0x7FF) { // 1 extra char, 110xxxxx 10xxxxxx (UCS-4 0000 0080-0000 007FF) szReturn[1] = 128; szReturn[1] += maskcheck(iChar, 0, 6); szReturn[0] = 192; szReturn[0] += maskcheck(iChar, 6, 5); } else if(iChar >= 0x800 && iChar <= 0xFFFF) { // 2 extra chars, 1110xxxx 10xxxxxx 10xxxxxx (UCS-4 0000 0800-0000 FFFF) szReturn[2] = 128; szReturn[2] += maskcheck(iChar, 0, 6); szReturn[1] = 128; szReturn[1] += maskcheck(iChar, 6, 6); szReturn[0] = 224; szReturn[0] += maskcheck(iChar, 12, 4); } else if(iChar >= 0x10000 && iChar <= 0x1FFFFF) { // 3 extra chars, 11110xxx 10xxxxx 10xxxxxx 10xxxxxx (UCS-4 0001 0000-001F FFFF) szReturn[3] = 128; szReturn[3] += maskcheck(iChar, 0, 6); szReturn[2] = 128; szReturn[2] += maskcheck(iChar, 6, 6); szReturn[1] = 128; szReturn[1] += maskcheck(iChar, 12, 6); szReturn[0] = 240; szReturn[0] += maskcheck(iChar, 18, 3); } else if(iChar >= 0x200000 && iChar <= 0x3FFFFFF) { // 4 extra chars, 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx (UCS-4 0020 0000-03FF FFFF) szReturn[4] = 128; szReturn[4] += maskcheck(iChar, 0, 6); szReturn[3] = 128; szReturn[3] += maskcheck(iChar, 6, 6); szReturn[2] = 128; szReturn[2] += maskcheck(iChar, 12, 6); szReturn[1] = 128; szReturn[1] += maskcheck(iChar, 18, 6); szReturn[0] = 240; szReturn[0] += maskcheck(iChar, 24, 2); } else if(iChar >= 0x4000000 && iChar <= 0x7FFFFFFF) { // 5 extra chars, 1111110x 10xxxxxx ... 10xxxxxx (UCS-4 0400 0000-7FFF FFFF) szReturn[5] = 128; szReturn[5] += maskcheck(iChar, 0, 6); szReturn[4] = 128; szReturn[4] += maskcheck(iChar, 6, 6); szReturn[3] = 128; szReturn[3] += maskcheck(iChar, 12, 6); szReturn[2] = 128; szReturn[2] += maskcheck(iChar, 18, 6); szReturn[1] = 128; szReturn[1] += maskcheck(iChar, 24, 6); szReturn[0] = 240; szReturn[0] += maskcheck(iChar, 30, 1); } else { delete[] szReturn; szReturn = NULL; } return szReturn; }