Ejemplo n.º 1
0
Archivo: conf.c Proyecto: 95ulisse/tinc
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;
}
Ejemplo n.º 2
0
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;
}