예제 #1
0
void TestStringSizeIs()
{
    std::string file = "..\\Ch14\\data\\count-size";
    std::vector<std::string> vec;
    PushString(file, vec);

    for (const auto& v : vec)
    {
        std::cout << v << " ";
    }
    std::cout << std::endl;

    for (size_t i = 1; i != 10; i++)
    {
        StringSizeIs ssi(i);
        std::cout << "The count of " << i << " size words is: " << count_if(vec.begin(), vec.end(), ssi) << std::endl;
    }
}
  /**
   * Same as {@code System.arraycopy(src, 0, dest, 0, length)}.
   * 
   * @param      src       the source array.
   * @param      srcSize   the size of the source array.
   * @param      dest      the destination array.
   * @param      destSize  the size of the destination array.
   * @param      length    the number of array elements to be copied.
   */
  void CryptoHelper::copyByteArray(const byte src[], size_t srcSize, byte dest[], size_t destSize, size_t copySize)
  {
    ASSERT(src);
    ASSERT(srcSize);
    ASSERT(dest);
    ASSERT(destSize);
    ASSERT(srcSize >= copySize);
    ASSERT(destSize >= copySize);

    if(!src)
      throw IllegalArgumentException("Source array cannot be nul");

    if(!dest)
      throw IllegalArgumentException("Destination array cannot be nul");

    try
    {
      // Will throw if ptr wraps. T* and size_t causing trouble on Linux
      SafeInt<size_t> ssi((size_t)src); ssi += srcSize;
      g_dummy = (void*)(size_t)ssi;
      SafeInt<size_t> dsi((size_t)dest); dsi += destSize;
      g_dummy = (void*)(size_t)dsi;
    }
    catch(const SafeIntException&)
    {
      throw IllegalArgumentException("Source or destination array pointer wrap");
    }

    const size_t req = std::min(copySize, std::min(srcSize, destSize));
    ASSERT(req > 0);
    ASSERT(req == copySize);

    if(req != copySize)
      throw IllegalArgumentException("Copy size exceeds source or destination size");

    ESAPI_MS_NO_WARNING(4996);
    std::copy(src, src+req, dest);
    ESAPI_MS_DEF_WARNING(4996);
  }
CL_Error CL_RIFFImage::Locate(char const * iname, int const enum_id)
{
	_LOGPRINT(("RIF File image finder called for %s, id %d\n",iname,enum_id));
	
	if (!Env_Chunk)
		_LOGPUT("WARNING! no .RIF file loaded\n");
	
	if (!Env_Chunk) return CLE_RIFFERROR;

	switch (imode)
	{
		case CLM_ATTACHEDPALETTE:
		case CLM_16BIT:
		case CLM_24BIT:
		case CLM_32BIT:
		case CLM_GLOBALPALETTE:
		case CLM_TLTPALETTE:
			break;
		default:
			_LOGPUT("WARNING! undefined video mode\n");
			return CLE_INVALIDDXMODE;
	}

	// remove projectsubdirectory from start of image name if it is there
	unsigned int const psdirlen = strlen(projectsubdirectory);
	if (!strncmp(projectsubdirectory,iname,psdirlen))
	iname += psdirlen;
	
	List<Chunk *> envdl (Env_Chunk->lookup_child("REBENVDT"));

	if (!envdl.size())
	{
		_LOGPUT("WARNING! no environment data chunk\n");
		return CLE_RIFFERROR;
	}

	Environment_Data_Chunk * envd = (Environment_Data_Chunk *) envdl.first_entry();

	CL_Error retval = CLE_OK;
	Environment_Game_Mode_Chunk * egmc = 0;
	if (game_mode)
	{
		if (*game_mode)
		{
			List<Chunk *> egmcl (envd->lookup_child("GAMEMODE"));

			for (LIF<Chunk *> egmci(&egmcl); !egmci.done(); egmci.next())
			{
				Environment_Game_Mode_Chunk * egmcm = (Environment_Game_Mode_Chunk *) egmci();
				if (egmcm->id_equals(game_mode))
				{
					egmc = egmcm;
					break;
				}
			}

			if (!egmc) retval = CLE_INVALIDGAMEMODE;
				// only returns this error if the game mode cannot be found *and* the image is not listed
		}
	}

	if (name)
	{
		delete[] name;
		name = 0;
	}
	if (iname) name = strip_file_extension(strip_path(iname));

	char * rcname = 0;
	if (iname)
	{
		if (strchr(iname,'\\'))
		{
			rcname = new char[strlen(iname)+1];
			strcpy(rcname,iname);
			*strchr(rcname,'\\')=0;
		}
		else if (strchr(iname,'/'))
		{
			rcname = new char[strlen(iname)+1];
			strcpy(rcname,iname);
			*strchr(rcname,'/')=0;
		}
	}

	if (egmc)
	{
		int shapefoundingm = rcname ? 0 : 1;
		// Get the matching image 'Processor' chunk
		List<Chunk *> micl = egmc->lookup_child("MATCHIMG");

		Matching_Images_Chunk * mic = 0;
		if (micl.size()) mic = (Matching_Images_Chunk *)micl.first_entry();
		
		List<Chunk *> rcl = egmc->lookup_child("RIFCHILD");

		for (LIF<Chunk *> rci(&rcl); !rci.done(); rci.next())
		{
			RIF_Child_Chunk * rcm = (RIF_Child_Chunk *) rci();

			if (rcname)
			{
				if (_stricmp(rcname,rcm->rifname) && (*rcname || *rcm->filename))
					continue;
				shapefoundingm = 1;
			}

			for (LIF<BMP_Flags> bmpfi(&rcm->bmps); !bmpfi.done(); bmpfi.next())
			{
				BMP_Flags bmpft(bmpfi());
				strip_file_extension(bmpft.filename);

				if (iname ? !_stricmp(name,strip_path(bmpft.filename)) : enum_id == bmpft.enum_id)
				{
					// select image descriptor
					ImageDescriptor const idsc
						(
							*rcm->filename ? 
								(IDscFlags)((bmpft.flags & ChunkBMPFlag_FixedPalette ?
									IDSCF_FIXEDPALETTE
								:
									IDSCF_0)
								|IDSCF_INCLUDED)
							:
								IDSCF_0,
							bmpfi().filename,
							*rcm->filename ? rcm->rifname : 0
						);
					ImageDescriptor const * p_idsc = &idsc;

					if (mic) p_idsc = &mic->GetLoadImage(idsc);
					else _LOGPRINT(("WARNING! no rule to find matching images in game mode %s\n",egmc->header->mode_identifier));

					// load this image
					GetPath(*p_idsc,envd,bmpft.flags);

					if (fname)
					{
						if (rcname)
						{
							delete[] rcname;
							rcname = 0;
						}
						flags.located = 1;
						return CLE_OK;
					}
				}
			}
		}
		
		List<Chunk *> ssc = egmc->lookup_child("SHBMPNAM");

		for (LIF<Chunk *> ssi(&ssc); !ssi.done(); ssi.next())
		{
			External_Shape_BMPs_Store_Chunk * ss = (External_Shape_BMPs_Store_Chunk *) ssi();

			if (rcname)
				if (_stricmp(rcname,ss->shapename) && *rcname)
					continue;

			for (LIF<BMP_Name> bmpfi(&ss->bmps); !bmpfi.done(); bmpfi.next())
			{
				BMP_Name bmpft(bmpfi());
				strip_file_extension(bmpft.filename);

				if (iname ? !_stricmp(name,strip_path(bmpft.filename)) : enum_id == bmpft.enum_id)
				{

					// select image descriptor
					ImageDescriptor const idsc
						(
							(IDscFlags)((bmpft.flags & ChunkBMPFlag_FixedPalette ?
								IDSCF_FIXEDPALETTE
							:
								IDSCF_0)
							|(ss->GetExtendedData()->flags & GBF_SPRITE ?
								IDSCF_SPRITE
							:
								IDSCF_SUBSHAPE)
							|IDSCF_INCLUDED),
							bmpfi().filename,
							ss->shapename,
							bmpft.flags & ChunkBMPFlag_FixedPalette ? ss->rifname : 0
						);
					ImageDescriptor const * p_idsc = &idsc;

					if (mic) p_idsc = &mic->GetLoadImage(idsc);
					else _LOGPRINT(("WARNING! no rule to find matching images in game mode %s\n",egmc->header->mode_identifier));

					#if TRY_OLD_DIRS // temporary until all textures move to SubShps/All directory
					if (*p_idsc == idsc)
					{
						// select image descriptor
						ImageDescriptor const idsc2
							(
								(IDscFlags)((bmpft.flags & ChunkBMPFlag_FixedPalette ?
									IDSCF_FIXEDPALETTE
								:
									IDSCF_0)
								|(ss->GetExtendedData()->flags & GBF_SPRITE ?
									IDSCF_SPRITE
								:
									IDSCF_0)
								|IDSCF_INCLUDED),
								bmpfi().filename,
								ss->shapename,
								bmpft.flags & ChunkBMPFlag_FixedPalette ? ss->rifname : 0
							);
						ImageDescriptor const * p_idsc2 = &idsc2;

						if (mic) p_idsc2 = &mic->GetLoadImage(idsc2);
						else _LOGPRINT(("WARNING! no rule to find matching images in game mode %s\n",egmc->header->mode_identifier));

						if (*p_idsc2 != idsc2)
						{
							_LOGPUT("WARNING! Not listed as in SubShps directory\n");
							p_idsc = p_idsc2;
						}
					}
					#endif

					// load this image
					GetPath(*p_idsc,envd,bmpft.flags);
					
					if (fname)
					{
						if (rcname)
						{
							delete[] rcname;
							rcname = 0;
						}
						flags.located = 1;
						return CLE_OK;
					}
				}
			}
		}
		
		if (rcname)
		{
			if (!shapefoundingm)
				_LOGPRINT(("WARNING! shape/sprite %s not found in this RIF file\n",rcname));
			else
				_LOGPRINT(("WARNING! shape/sprite %s does not appear to list %s\n",rcname,name));
		}

	}

	List<Chunk *> micl = envd->lookup_child("MATCHIMG");
	
	Matching_Images_Chunk * mic_fix = 0;
	Matching_Images_Chunk * mic_nrm = 0;
	
	for (LIF<Chunk *> mici(&micl); !mici.done(); mici.next())
	{
		Matching_Images_Chunk * mic = (Matching_Images_Chunk *)mici();
		if (mic->flags & MICF_FIXEDPALETTE)
			mic_fix = mic;
		else
			mic_nrm = mic;
	}
		
	List<Chunk_With_Children *> shapesandsprites;
	
	List<Chunk *> shlst = Env_Chunk->lookup_child("REBSHAPE");
	for (LIF<Chunk *> shLIF(&shlst); !shLIF.done(); shLIF.next())
	{	
		List<Chunk *> shxflst = ((Shape_Chunk *)shLIF())->lookup_child("SHPEXTFL");
		if (shxflst.size())
		{
			shapesandsprites.add_entry( (Shape_External_File_Chunk *)shxflst.first_entry() );
		}
	}
	shlst = Env_Chunk->lookup_child("RSPRITES");
	if (shlst.size())
	{
		List<Chunk *> splst = ((Chunk_With_Children *)shlst.first_entry())->lookup_child("SPRIHEAD");

		for (LIF<Chunk *> spLIF(&splst); !spLIF.done(); spLIF.next())
		{	
			shapesandsprites.add_entry( (Chunk_With_Children *)spLIF() );
		}
	}

	int shapefound = rcname ? 0 : 1;
	
	for (LIF<Chunk_With_Children *> sasLIF(&shapesandsprites); !sasLIF.done(); sasLIF.next())
	{	
		char * subrifname = riff_basename(sasLIF());

		if (rcname)
		{
			if (_stricmp(subrifname,rcname)) // must match shapes name exactly
			{
				delete[] subrifname;
				continue;
			}
			shapefound = 1;
		}
		
		List<Chunk *> blsclst = sasLIF()->lookup_child("BMPLSTST");
		if (blsclst.size())
		{
			Bitmap_List_Store_Chunk * gbnc = (Bitmap_List_Store_Chunk *) blsclst.first_entry();

			for (LIF<BMP_Name> bmpni(&gbnc->bmps); !bmpni.done(); bmpni.next())
			{
				BMP_Name bmpnt(bmpni());
				strip_file_extension(bmpnt.filename);

				if (iname ? !_stricmp(name,strip_path(bmpnt.filename)) : enum_id == bmpnt.enum_id)
				{
				
					// select image descriptor
					char * riffname = riff_basename(envd);
					ImageDescriptor const idsc
						(
							(IDscFlags)((bmpnt.flags & ChunkBMPFlag_FixedPalette ?
								IDSCF_FIXEDPALETTE
							:
								IDSCF_0)
							|(gbnc->GetExtendedData()->flags & GBF_SPRITE ?
								IDSCF_SPRITE
							:
								IDSCF_SUBSHAPE)
							|IDSCF_INCLUDED),
							bmpni().filename,
							subrifname,
							bmpnt.flags & ChunkBMPFlag_FixedPalette ? riffname : 0
						);
					ImageDescriptor const * p_idsc = &idsc;
					delete[] riffname;

					if (bmpnt.flags & ChunkBMPFlag_FixedPalette)
					{
						if (mic_fix) p_idsc = &mic_fix->GetLoadImage(idsc);
						else _LOGPUT("WARNING! no rule to find fixed palette matching images in environment data\n");
					}
					else
					{
						if (mic_nrm) p_idsc = &mic_nrm->GetLoadImage(idsc);
						else _LOGPUT("WARNING! no rule to find matching images in environment data (interface engine?)\n");
					}

					#if TRY_OLD_DIRS // temporary until all textures move to SubShps/All directory
					if (*p_idsc == idsc)
					{
						// select image descriptor
						char * riffname = riff_basename(envd);
						ImageDescriptor const idsc2
							(
								(IDscFlags)((bmpnt.flags & ChunkBMPFlag_FixedPalette ?
									IDSCF_FIXEDPALETTE
								:
									IDSCF_0)
								|(gbnc->GetExtendedData()->flags & GBF_SPRITE ?
									IDSCF_SPRITE
								:
									IDSCF_0)
								|IDSCF_INCLUDED),
								bmpni().filename,
								subrifname,
								bmpnt.flags & ChunkBMPFlag_FixedPalette ? riffname : 0
							);
						ImageDescriptor const * p_idsc2 = &idsc2;
						delete[] riffname;

						if (bmpnt.flags & ChunkBMPFlag_FixedPalette)
						{
							if (mic_fix) p_idsc2 = &mic_fix->GetLoadImage(idsc2);
							else _LOGPUT("WARNING! no rule to find fixed palette matching images in environment data\n");
						}
						else
						{
							if (mic_nrm) p_idsc2 = &mic_nrm->GetLoadImage(idsc2);
							else _LOGPUT("WARNING! no rule to find matching images in environment data (interface engine?)\n");
						}
						if (*p_idsc2 != idsc2)
						{
							_LOGPUT("WARNING! Not listed as in SubShps directory\n");
							p_idsc = p_idsc2;
						}
					}
					#endif

					// load this image
					GetPath(*p_idsc,envd,bmpnt.flags);
					
					if (fname)
					{
						delete[] subrifname;
						if (rcname)
						{
							delete[] rcname;
							rcname = 0;
						}
						flags.located = 1;
						return CLE_OK;
					}
				}
			}
		}
		delete[] subrifname;
	}

	if (rcname)
	{
		if (!shapefound)
			_LOGPRINT(("WARNING! shape/sprite %s not found in this RIF file\n",rcname));
		else
			_LOGPRINT(("WARNING! shape/sprite %s does not appear to list %s\n",rcname,name));
		delete[] rcname;
		rcname = 0;
	}
	
	// not found in game textures, so look in default
	
	else // but only if there is no virtual shape directory
	{
		List<Chunk *> gbncl = envd->lookup_child("BMPNAMES");
		if (gbncl.size())
		{
			Global_BMP_Name_Chunk * gbnc = (Global_BMP_Name_Chunk *) gbncl.first_entry();

			for (LIF<BMP_Name> bmpni(&gbnc->bmps); !bmpni.done(); bmpni.next())
			{
				BMP_Name bmpnt(bmpni());
				strip_file_extension(bmpnt.filename);

				if (iname ? !_stricmp(name,strip_path(bmpnt.filename)) : enum_id == bmpnt.enum_id)
				{
					// select image descriptor
					ImageDescriptor const idsc (bmpnt.flags & ChunkBMPFlag_FixedPalette ? IDSCF_FIXEDPALETTE : IDSCF_0, bmpni().filename);
					ImageDescriptor const * p_idsc = &idsc;

					if (bmpnt.flags & ChunkBMPFlag_FixedPalette)
					{
						if (mic_fix) p_idsc = &mic_fix->GetLoadImage(idsc);
						else _LOGPUT("WARNING! no rule to find fixed palette matching images in environment data\n");
					}
					else
					{
						if (mic_nrm) p_idsc = &mic_nrm->GetLoadImage(idsc);
						else _LOGPUT("WARNING! no rule to find matching images in environment data (interface engine?)\n");
					}

					// load this image
					GetPath(*p_idsc,envd,bmpnt.flags);
					
					if (fname)
					{
						flags.located = 1;
						return CLE_OK;
					}
				}
			}
		}
	}

	if (retval != CLE_OK) return retval;
	return CLE_FINDERROR;
}
예제 #4
0
void
setconfig (char *name, char *value, struct config_data *cfg)
{
	int len, dstlen;
	void *src, *dst;
	char tmpname[128];
	int i;

#define CONF0(NAMESTR, CFG) \
	setdst (name, NAMESTR, &CFG, sizeof CFG, &dst, &dstlen)
#define CONF(NAME) \
	CONF0 (#NAME, cfg->NAME)
#define CONF1(NAMEFMT, ARG1, CFG) \
	snprintf (tmpname, sizeof tmpname, NAMEFMT, ARG1), \
	CONF0 (tmpname, CFG)

	name = strdup (name);
	len = strlen (value);
	src = strdup (value);
	dst = NULL;
	dstlen = 0;
	/* idman */
	ss (file, &name, &src, &len, "idman.crl01File", "idman.crl01");
	ss (file, &name, &src, &len, "idman.crl02File", "idman.crl02");
	ss (file, &name, &src, &len, "idman.crl03File", "idman.crl03");
	ss (file, &name, &src, &len, "idman.pkc01File", "idman.pkc01");
	ss (file, &name, &src, &len, "idman.pkc02File", "idman.pkc02");
	ss (file, &name, &src, &len, "idman.pkc03File", "idman.pkc03");
	ss (uintnum, &name, &src, &len, "idman.randomSeedSize",
	    "idman.randomSeedSize");
	ss (uintnum, &name, &src, &len, "idman.maxPinLen", "idman.maxPinLen");
	ss (uintnum, &name, &src, &len, "idman.minPinLen", "idman.minPinLen");
	ss (authmethod, &name, &src, &len, "idman.authenticationMethod",
	    "idman.authenticationMethod");
	/* VPN */
	ss (file, &name, &src, &len, "vpn.vpnCertFileV4", "vpn.vpnCertV4");
	ss (file, &name, &src, &len, "vpn.vpnCaCertFileV4", "vpn.vpnCaCertV4");
	ss (file, &name, &src, &len, "vpn.vpnRsaKeyFileV4", "vpn.vpnRsaKeyV4");
	ss (file, &name, &src, &len, "vpn.vpnCertFileV6", "vpn.vpnCertV6");
	ss (file, &name, &src, &len, "vpn.vpnCaCertFileV6", "vpn.vpnCaCertV6");
	ss (file, &name, &src, &len, "vpn.vpnRsaKeyFileV6", "vpn.vpnRsaKeyV6");
	/* storage */
	for (i = 0; i < NUM_OF_STORAGE_KEYS; i++)
		ssi (keyplace, &name, &src, &len,
		     "storage.encryptionKey%d.place", "storage.keys[%d]", i);
	for (i = 0; i < NUM_OF_STORAGE_KEYS_CONF; i++) {
		ssi (storage_conf_guid, &name, &src, &len,
		     "storage.conf%d.guid", "storage.keys_conf[%d].guid", i);
		ssi (storage_conf_type, &name, &src, &len,
		     "storage.conf%d.type", "storage.keys_conf[%d].type", i);
		ssi (u8num, &name, &src, &len, "storage.conf%d.host_id",
		     "storage.keys_conf[%d].host_id", i);
		ssi (u16num, &name, &src, &len, "storage.conf%d.device_id",
		     "storage.keys_conf[%d].device_id", i);
		ssi (u64num, &name, &src, &len, "storage.conf%d.lba_low",
		     "storage.keys_conf[%d].lba_low", i);
		ssi (u64num, &name, &src, &len, "storage.conf%d.lba_high",
		     "storage.keys_conf[%d].lba_high", i);
		ssi (noconv, &name, &src, &len, "storage.conf%d.crypto_name",
		     "storage.keys_conf[%d].crypto_name", i);
		ssi (u8num, &name, &src, &len, "storage.conf%d.keyindex",
		     "storage.keys_conf[%d].keyindex", i);
		ssi (u16num, &name, &src, &len, "storage.conf%d.keybits",
		     "storage.keys_conf[%d].keybits", i);
		ssi (noconv, &name, &src, &len, "storage.conf%d.extend",
		     "storage.keys_conf[%d].extend", i);
	}
	/* vmm */
	ss (uintnum, &name, &src, &len, "vmm.f11panic", "vmm.f11panic");
	ss (uintnum, &name, &src, &len, "vmm.f12msg", "vmm.f12msg");
	ss (uintnum, &name, &src, &len, "vmm.auto_reboot", "vmm.auto_reboot");
	ss (uintnum, &name, &src, &len, "vmm.shell", "vmm.shell");
	ss (uintnum, &name, &src, &len, "vmm.dbgsh", "vmm.dbgsh");
	ss (uintnum, &name, &src, &len, "vmm.status", "vmm.status");
	ss (uintnum, &name, &src, &len, "vmm.boot_active", "vmm.boot_active");
	ss (uintnum, &name, &src, &len, "vmm.tty_pro1000", "vmm.tty_pro1000");
	ss (mac_addr, &name, &src, &len, "vmm.tty_pro1000_mac_address",
	    "vmm.tty_pro1000_mac_address");
	ss (uintnum, &name, &src, &len, "vmm.tty_rtl8169", "vmm.tty_rtl8169");
	ss (mac_addr, &name, &src, &len, "vmm.tty_rtl8169_mac_address",
	    "vmm.tty_rtl8169_mac_address");
	ss (uintnum, &name, &src, &len, "vmm.driver.ata", "vmm.driver.ata");
	ss (uintnum, &name, &src, &len, "vmm.driver.usb.uhci", "vmm.driver.usb.uhci");
	ss (uintnum, &name, &src, &len, "vmm.driver.usb.ehci", "vmm.driver.usb.ehci");
	ss (uintnum, &name, &src, &len, "vmm.driver.concealEHCI",
	    "vmm.driver.concealEHCI");
	ss (uintnum, &name, &src, &len, "vmm.driver.conceal1394",
	    "vmm.driver.conceal1394");
	ss (uintnum, &name, &src, &len, "vmm.driver.concealPRO1000",
	    "vmm.driver.concealPRO1000");
	ss (uintnum, &name, &src, &len, "vmm.driver.vpn.PRO100",
	    "vmm.driver.vpn.PRO100");
	ss (uintnum, &name, &src, &len, "vmm.driver.vpn.PRO1000",
	    "vmm.driver.vpn.PRO1000");
	ss (uintnum, &name, &src, &len, "vmm.driver.vpn.RTL8169",
	    "vmm.driver.vpn.RTL8169");
	ss (uintnum, &name, &src, &len, "vmm.driver.vpn.ve",
	    "vmm.driver.vpn.ve");
	ss (uintnum, &name, &src, &len, "vmm.iccard.enable",
	    "vmm.iccard.enable");
	ss (uintnum, &name, &src, &len, "vmm.iccard.status",
	    "vmm.iccard.status");
	/* idman */
	CONF (idman.crl01);
	CONF (idman.crl02);
	CONF (idman.crl03);
	CONF (idman.pkc01);
	CONF (idman.pkc02);
	CONF (idman.pkc03);
	CONF (idman.randomSeedSize);
	CONF (idman.maxPinLen);
	CONF (idman.minPinLen);
	CONF (idman.authenticationMethod);
	/* VPN */
	CONF (vpn.mode);
	CONF (vpn.virtualGatewayMacAddress);
	CONF (vpn.bindV4);
	CONF (vpn.guestIpAddressV4);
	CONF (vpn.guestIpSubnetV4);
	CONF (vpn.guestMtuV4);
	CONF (vpn.guestVirtualGatewayIpAddressV4);
	CONF (vpn.dhcpV4);
	CONF (vpn.dhcpLeaseExpiresV4);
	CONF (vpn.dhcpDnsV4);
	CONF (vpn.dhcpDomainV4);
	CONF (vpn.adjustTcpMssV4);
	CONF (vpn.hostIpAddressV4);
	CONF (vpn.hostIpSubnetV4);
	CONF (vpn.hostMtuV4);
	CONF (vpn.hostIpDefaultGatewayV4);
	CONF (vpn.optionV4ArpExpires);
	CONF (vpn.optionV4ArpDontUpdateExpires);
	CONF (vpn.vpnGatewayAddressV4);
	CONF (vpn.vpnAuthMethodV4);
	CONF (vpn.vpnPasswordV4);
	CONF (vpn.vpnIdStringV4);
	CONF (vpn.vpnCertV4);
	CONF (vpn.vpnCaCertV4);
	CONF (vpn.vpnRsaKeyV4);
	CONF (vpn.vpnSpecifyIssuerV4);
	CONF (vpn.vpnPhase1CryptoV4);
	CONF (vpn.vpnPhase1HashV4);
	CONF (vpn.vpnPhase1LifeSecondsV4);
	CONF (vpn.vpnPhase1LifeKilobytesV4);
	CONF (vpn.vpnWaitPhase2BlankSpanV4);
	CONF (vpn.vpnPhase2CryptoV4);
	CONF (vpn.vpnPhase2HashV4);
	CONF (vpn.vpnPhase2LifeSecondsV4);
	CONF (vpn.vpnPhase2LifeKilobytesV4);
	CONF (vpn.vpnConnectTimeoutV4);
	CONF (vpn.vpnIdleTimeoutV4);
	CONF (vpn.vpnPingTargetV4);
	CONF (vpn.vpnPingIntervalV4);
	CONF (vpn.vpnPingMsgSizeV4);
	CONF (vpn.bindV6);
	CONF (vpn.guestIpAddressPrefixV6);
	CONF (vpn.guestIpAddressSubnetV6);
	CONF (vpn.guestMtuV6);
	CONF (vpn.guestVirtualGatewayIpAddressV6);
	CONF (vpn.raV6);
	CONF (vpn.raLifetimeV6);
	CONF (vpn.raDnsV6);
	CONF (vpn.hostIpAddressV6);
	CONF (vpn.hostIpAddressSubnetV6);
	CONF (vpn.hostMtuV6);
	CONF (vpn.hostIpDefaultGatewayV6);
	CONF (vpn.optionV6NeighborExpires);
	CONF (vpn.vpnGatewayAddressV6);
	CONF (vpn.vpnAuthMethodV6);
	CONF (vpn.vpnPasswordV6);
	CONF (vpn.vpnIdStringV6);
	CONF (vpn.vpnCertV6);
	CONF (vpn.vpnCaCertV6);
	CONF (vpn.vpnRsaKeyV6);
	CONF (vpn.vpnSpecifyIssuerV6);
	CONF (vpn.vpnPhase1CryptoV6);
	CONF (vpn.vpnPhase1HashV6);
	CONF (vpn.vpnPhase1LifeSecondsV6);
	CONF (vpn.vpnPhase1LifeKilobytesV6);
	CONF (vpn.vpnWaitPhase2BlankSpanV6);
	CONF (vpn.vpnPhase2CryptoV6);
	CONF (vpn.vpnPhase2HashV6);
	CONF (vpn.vpnPhase2LifeSecondsV6);
	CONF (vpn.vpnPhase2LifeKilobytesV6);
	CONF (vpn.vpnPhase2StrictIdV6);
	CONF (vpn.vpnConnectTimeoutV6);
	CONF (vpn.vpnIdleTimeoutV6);
	CONF (vpn.vpnPingTargetV6);
	CONF (vpn.vpnPingIntervalV6);
	CONF (vpn.vpnPingMsgSizeV6);
	/* storage */
	for (i = 0; i < NUM_OF_STORAGE_KEYS; i++)
		CONF1 ("storage.keys[%d]", i, cfg->storage.keys[i]);
	for (i = 0; i < NUM_OF_STORAGE_KEYS_CONF; i++) {
		CONF1 ("storage.keys_conf[%d].guid", i,
		       cfg->storage.keys_conf[i].guid);
		CONF1 ("storage.keys_conf[%d].type", i,
		       cfg->storage.keys_conf[i].type);
		CONF1 ("storage.keys_conf[%d].host_id", i,
		       cfg->storage.keys_conf[i].host_id);
		CONF1 ("storage.keys_conf[%d].device_id", i,
		       cfg->storage.keys_conf[i].device_id);
		CONF1 ("storage.keys_conf[%d].lba_low", i,
		       cfg->storage.keys_conf[i].lba_low);
		CONF1 ("storage.keys_conf[%d].lba_high", i,
		       cfg->storage.keys_conf[i].lba_high);
		CONF1 ("storage.keys_conf[%d].crypto_name", i,
		       cfg->storage.keys_conf[i].crypto_name);
		CONF1 ("storage.keys_conf[%d].keyindex", i,
		       cfg->storage.keys_conf[i].keyindex);
		CONF1 ("storage.keys_conf[%d].keybits", i,
		       cfg->storage.keys_conf[i].keybits);
		CONF1 ("storage.keys_conf[%d].extend", i,
		       cfg->storage.keys_conf[i].extend);
	}
	/* vmm */
	CONF (vmm.f11panic);
	CONF (vmm.f12msg);
	CONF (vmm.auto_reboot);
	CONF (vmm.shell);
	CONF (vmm.dbgsh);
	CONF (vmm.status);
	CONF (vmm.boot_active);
	CONF (vmm.tty_pro1000);
	CONF (vmm.tty_pro1000_mac_address);
	CONF (vmm.tty_rtl8169);
	CONF (vmm.tty_rtl8169_mac_address);
	CONF (vmm.driver.ata);
	CONF (vmm.driver.usb.uhci);
	CONF (vmm.driver.usb.ehci);
	CONF (vmm.driver.concealEHCI);
	CONF (vmm.driver.conceal1394);
	CONF (vmm.driver.concealPRO1000);
	CONF (vmm.driver.vpn.PRO100);
	CONF (vmm.driver.vpn.PRO1000);
	CONF (vmm.driver.vpn.RTL8169);
	CONF (vmm.driver.vpn.ve);
	CONF (vmm.driver.pci_conceal);
	CONF (vmm.iccard.enable);
	CONF (vmm.iccard.status);
	if (!dst) {
		fprintf (stderr, "unknown config \"%s\"\n", name);
		exit (EXIT_FAILURE);
	}
	if (len > dstlen) {
		fprintf (stderr, "config \"%s\" is too long\n", name);
		exit (EXIT_FAILURE);
	}
	memset (dst, 0, dstlen);
	memcpy (dst, src, len);
	free (name);
	free (src);
}
예제 #5
0
파일: scheduler.c 프로젝트: KrzysiekJ/ling
proc_t *scheduler_next(proc_t *current, int reds_left)
{
	set_phase(PHASE_NEXT);
	uint32_t reds_used = SLICE_REDUCTIONS -reds_left;
	ssi(SYS_STATS_CTX_SWITCHES);
	ssa(SYS_STATS_REDUCTIONS, reds_used);
	current->total_reds += reds_used;
	proc_t *next_proc = 0;
	uint64_t ticks = monotonic_clock(); // freeze time

	assert(current->my_queue == MY_QUEUE_NONE);

#ifdef PROFILE_HARNESS
static uint64_t proc_started_ns = 0;
	if (proc_started_ns != 0)
		prof_slice_complete(current->pid,
			current->result.what, current->cap.ip, proc_started_ns, ticks);
#endif

	proc_t *expired;
	while ((expired = wait_list_expired(&queues.on_timed_receive, ticks)) != 0)
	{
		expired->cap.ip = expired->result.jump_to;
		if (scheduler_park_runnable_N(expired) < 0)
			scheduler_exit_process(expired, A_NO_MEMORY);
	}

	int memory_exhausted = 0;
	switch (current->result.what)
	{
	case SLICE_RESULT_YIELD:
		if (scheduler_park_runnable_N(current) < 0)
			memory_exhausted = 1;
		break;
	case SLICE_RESULT_WAIT:
		if (current->result.until_when == LING_INFINITY)
		{
			if (proc_list_put_N(&queues.on_infinite_receive, current) < 0)
				memory_exhausted = 1;
			else
				current->my_queue = MY_QUEUE_INF_WAIT;
		}
		else
		{
			if (wait_list_put_N(&queues.on_timed_receive,
					current, current->result.until_when) < 0)
				memory_exhausted = 1;
			else
				current->my_queue = MY_QUEUE_TIMED_WAIT;
		}
		break;
	case SLICE_RESULT_DONE:
		scheduler_exit_process(current, A_NORMAL);
		break;

	case SLICE_RESULT_PURGE_PROCS:
		// purge_module() call may have detected processes lingering on the old
		// code - terminate them
		if (scheduler_park_runnable_N(current) < 0)
			memory_exhausted = 1;
		for (int i = 0; i < num_purged; i++)
			if (scheduler_signal_exit_N(purgatory[i], current->pid, A_KILL) < 0)
				memory_exhausted = 1;
		num_purged = 0;
		break;

	case SLICE_RESULT_EXIT:
		scheduler_exit_process(current, current->result.reason);
		// what about the returned value when main function just returns?
		break;
	case SLICE_RESULT_EXIT2:
		// only needed to implement erlang:exit/2
		if (scheduler_park_runnable_N(current) < 0 ||
				(scheduler_signal_exit_N(current->result.victim,
								         current->pid, 
								         current->result.reason2) < 0))
			memory_exhausted = 1;
		break;
	case SLICE_RESULT_ERROR:
		scheduler_exit_process(current, current->result.reason);
		// how is this different from SLICE_RESULT_EXIT?
		break;
	case SLICE_RESULT_THROW:
		scheduler_exit_process(current, current->result.reason);
		// how is this different from SLICE_RESULT_EXIT?
		break;
	default:
	{
		assert(current->result.what == SLICE_RESULT_OUTLET_CLOSE);
		if (scheduler_park_runnable_N(current) < 0)
			memory_exhausted = 1;
		outlet_t *closing = current->result.closing;
		//assert(is_atom(current->result.why));
		outlet_close(closing, current->result.why);
		break;
	}
	}

	if (memory_exhausted)
		scheduler_exit_process(current, A_NO_MEMORY);

do_pending:

	ticks = monotonic_clock();
	while ((expired = wait_list_expired(&queues.on_timed_receive, ticks)) != 0)
	{
		expired->cap.ip = expired->result.jump_to;
		if (scheduler_park_runnable_N(expired) < 0)
			scheduler_exit_process(expired, A_NO_MEMORY);
	}

	set_phase(PHASE_EVENTS);
	// software events/timeouts
	net_check_timeouts();
	etimer_expired(ticks);
	// 'hardware' events
	int nr_fired = events_do_pending();
	update_event_times(nr_fired, ticks);
	set_phase(PHASE_NEXT);

	// select_runnable
	if (!proc_queue_is_empty(&queues.high_prio))
		next_proc = proc_queue_get(&queues.high_prio);
	else if (normal_count < NORMAL_ADVANTAGE)
	{
		if (!proc_queue_is_empty(&queues.normal_prio))
			next_proc = proc_queue_get(&queues.normal_prio);
		else if (!proc_queue_is_empty(&queues.low_prio))
			next_proc = proc_queue_get(&queues.low_prio);
		normal_count++;
	}
	else
	{
		if (!proc_queue_is_empty(&queues.low_prio))
			next_proc = proc_queue_get(&queues.low_prio);
		else if (!proc_queue_is_empty(&queues.normal_prio))
			next_proc = proc_queue_get(&queues.normal_prio);
		normal_count = 0;
	}

	if (next_proc == 0)
	{
		// no runnable processes; poll for events from all three sources

		// Beware that events_poll() reports events 5us after they occur. If
		// a new event is expected very soon we are better off polling event
		// bits manually (using events_do_pending())

		// Devote a portion of time until the next event to gc waiting processes
		garbage_collect_waiting_processes(expect_event_in_ns /2);

		if (expect_event_in_ns < MANUAL_POLLING_THRESHOLD)
			goto do_pending;

		uint64_t next_ticks = wait_list_timeout(&queues.on_timed_receive);
		uint64_t closest_timeout = etimer_closest_timeout();
		if (closest_timeout < next_ticks)
			next_ticks = closest_timeout;

		closest_timeout = lwip_closest_timeout();
		if (closest_timeout < next_ticks)
			next_ticks = closest_timeout;

		scheduler_runtime_update();
		events_poll(next_ticks);		// LING_INFINITY is big enough
		scheduler_runtime_start();

		goto do_pending;
	}

	next_proc->my_queue = MY_QUEUE_NONE;
	
	//TODO: update stats

#ifdef PROFILE_HARNESS
	proc_started_ns = ticks;
#endif

	set_phase(PHASE_ERLANG);
	return next_proc;
}
예제 #6
0
void IMG_createslice(Image_t *img, const char *name, uaddr_t addr) {
    assert(img != NULL);
    #if 1

    //printf("creating slice for %s\n", name);
    // Create module if not created yet
    sqlq_t sqsel(img->db, "SELECT modid FROM tab_module WHERE name = @N");
    sqsel.bind_str(1, name);
    int modid = sqsel.answer();
    if (modid == 0) {
        sqlq_t ssi(img->db, "INSERT INTO tab_module(name) VALUES(@A)");
        ssi.bind_str(1, name);
        ssi.run();
        modid = sqsel.answer();
        if (modid == 0) {
            printf("ERROR\n");
        }
    }
    // get segment for this slice
    sqlq_t segq(img->db, "SELECT segid FROM tab_segment WHERE address <= @A AND address + size > @B");
    segq.bind_int(1, addr);
    segq.bind_int(2, addr);
    int segid = segq.answer();
    if (segid == 0) {
        return;
    }

    // adjust previous slices' sizes

    int secid = uaddr_sec(addr);
    int secsize = IMG_getsecsize(img, secid);
    uaddr_t secstart = uaddr_mk(secid, 0);
    uaddr_t secend = uaddr_mk(secid, secsize);
    // passa por todos os slices deste seg
    sqlq_t sq(img->db, "SELECT address,size FROM tab_modslice WHERE address >= @A AND address < @B ORDER BY address ASC");
    sq.bind_int(1, secstart);
    sq.bind_int(2, secend);
    int size = secend - addr;
    while(sq.step()) {
        int this_start = sq.col_int(0);
        int this_size = sq.col_int(1);
        int this_end = this_start + this_size;
        if (this_end <= addr) {
            // do nothing
        // Achei um slice antes do meu que tem que ser cortado
        } else if (this_start < addr && this_end > addr) {
            //if (this_start > addr) {
            // muda o size do atual
            sqlq_t upd(img->db, "update tab_modslice set size=@a where address=@b");
            uaddr_t this_new_end = addr;
            int this_new_size = this_new_end - this_start;

            upd.bind_int(1, this_new_size);
            upd.bind_int(2, this_start);
            if (!upd.run()) {
                printf("; update slice size error\n");
            }
            //size = this_end - addr;
            //break;
        // Achei um slice depois do meu, entao vou me aparar
        } else if (addr < this_start) {
            size = this_start - addr;
            break;
        } else {
            printf("SLICE POSITIONING ERROR\n");
        }
    }
    // Insert this slice
    sqlq_t ins(img->db, "INSERT INTO tab_modslice(address, size, module, segment) VALUES(@A, @B, @C, @D)");
    ins.bind_int(1, addr);
    ins.bind_int(2, size);
    ins.bind_int(3, modid);
    ins.bind_int(4, segid);
    if (!ins.run()) {
        printf("; Create slice error\n");
    } else {
        //printf("; Created slice %s\n", name);
    }
    #endif

    #if 0

    sqlq_t s(img->db, "INSERT INTO tab_modslice(address, size, module, segment) VALUES(@A, @B, @C, @D, @E, @F)");
    s.bind_str(1, name);
    s.bind_str(2, sclass);
    s.bind_int(3, align);
    s.bind_int(4, use);
    s.bind_int(5, addr);
    s.bind_int(6, priority);
    if (!s.run()) {
        printf("; Create segment error\n");
    } else {
        printf("; Created segment %s\n", name);
    }
    #endif
}