/**
 * engine.cpp (2007-03-05)
 *
 * -- CABAL -- engine (useful functions)
 *
 * Copyright (c) 2007, NOD Team. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *	* Redistributions of source code must retain the above copyright
 *	  notice, this list of conditions and the following disclaimer.
 *	* Redistributions in binary form must reproduce the above copyright
 *	  notice, this list of conditions and the following disclaimer in the
 *	  documentation and/or other materials provided with the distribution.
 *	* Neither the name of the NOD Team nor the names of its contributors
 *	  may be used to endorse or promote products derived from this
 *	  software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "engine.h"

bool daemonize()
{
	if (daemon (1, 1) != 0)
	{
		cout << "Error: unable to daemonize into background\n";
		exit (1);
	}
	else
	{
		cout << "ENGINE: successfully daemonized into background\n";
		return daemon (1, 1) == 0;
	}
}

time_t gettime()
{
	time_t t;
	return time (&t);
}

char *eTime (time_t t)
{
	char *nt = asctime (localtime (&t));

	nt[strlen (nt) - 1] = 0;

	return nt;
}

char *eCountry (char *c)
{
	if (!*c)
		return "Enter the correct code of country";
	else
		sscanf (c, "%s", c);

	struct countries {
		char *code;
		char *country;
	} countries[] = {
		"AC", "Ascension Island",
		"AD", "Andorra",
		"AE", "United Arab Emirates",
		"AF", "Afghanistan",
		"AG", "Antigua and Barbuda",
		"AI", "Anguilla",
		"AL", "Albania",
		"AM", "Armenia",
		"AN", "Netherlands Antilles",
		"AO", "Angola",
		"AQ", "Antarctica",
		"AR", "Argentina",
		"AS", "American Samoa",
		"AT", "Austria",
		"AU", "Australia",
		"AW", "Aruba",
		"AX", "Aland Islands",
		"AZ", "Azerbaijan",
		"BA", "Bosnia and Herzegovina",
		"BB", "Barbados",
		"BD", "Bangladesh",
		"BE", "Belgium",
		"BF", "Burkina Faso",
		"BG", "Bulgaria",
		"BH", "Bahrain",
		"BI", "Burundi",
		"BJ", "Benin",
		"BM", "Bermuda",
		"BN", "Brunei Darussalam",
		"BO", "Bolivia",
		"BR", "Brazil",
		"BS", "Bahamas",
		"BT", "Bhutan",
		"BU", "Burma",
		"BV", "Bouvet Island",
		"BW", "Botswana",
		"BY", "Belarus",
		"BZ", "Belize",
		"CA", "Canada",
		"CC", "Cocos (Keeling) Islands",
		"CD", "The Democratic Republic of the Congo",
		"CF", "Central African Republic",
		"CG", "Congo",
		"CH", "Switzerland",
		"CI", "Cote d'Ivoire (Ivory Coast)",
		"CK", "Cook Islands",
		"CL", "Chile",
		"CM", "Cameroon",
		"CN", "China",
		"CO", "Colombia",
		"CR", "Costa Rica",
		"CS", "Serbia and Montenegro",
		"CU", "Cuba",
		"CV", "Cape Verde",
		"CX", "Christmas Island",
		"CY", "Cyprus",
		"CZ", "Czech Republic",
		"DE", "Germany",
		"DJ", "Djibouti",
		"DK", "Denmark",
		"DM", "Dominica",
		"DO", "Dominican Republic",
		"DZ", "Algeria",
		"EC", "Ecuador",
		"EE", "Estonia",
		"EG", "Egypt",
		"EH", "Western Sahara",
		"ER", "Eritrea",
		"ES", "Spain (including Canary Islands, Ceuta and Melilla)",
		"ET", "Ethiopia",
		"EU", "European Union",
		"FI", "Finland",
		"FJ", "Fiji",
		"FK", "Falkland Islands (Malvinas)",
		"FM", "Federated States of Micronesia",
		"FO", "Faroe Islands",
		"FR", "France",
		"GA", "Gabon",
		"GD", "Grenada",
		"GE", "Georgia",
		"GF", "French Guiana",
		"GG", "Guernsey",
		"GH", "Ghana",
		"GI", "Gibraltar",
		"GL", "Greenland",
		"GM", "Gambia",
		"GN", "Guinea",
		"GP", "Guadeloupe",
		"GQ", "Equatorial Guinea",
		"GR", "Greece",
		"GS", "South Georgia and the South Sandwich Islands",
		"GT", "Guatemala",
		"GU", "Guam",
		"GW", "Guinea-Bissau",
		"GY", "Guyana",
		"HK", "Hong Kong",
		"HM", "Heard Island and McDonald Islands",
		"HN", "Honduras",
		"HR", "Croatia",
		"HT", "Haiti",
		"HU", "Hungary",
		"ID", "Indonesia",
		"IE", "Ireland",
		"IL", "Israel",
		"IM", "Isle of Man",
		"IN", "India",
		"IO", "British Indian Ocean Territory (including Diego Garcia)",
		"IQ", "Iraq",
		"IR", "Islamic Republic of Iran",
		"IS", "Iceland",
		"IT", "Italy",
		"JE", "Jersey",
		"JM", "Jamaica",
		"JO", "Jordan",
		"JP", "Japan",
		"KE", "Kenya",
		"KG", "Kyrgyzstan",
		"KH", "Cambodia",
		"KI", "Kiribati",
		"KM", "Comoros",
		"KN", "Saint Kitts and Nevis",
		"KP", "Democratic People's Republic of Korea (North Korea)",
		"KR", "Republic of Korea (South Korea)",
		"KW", "Kuwait",
		"KY", "Cayman Islands",
		"KZ", "Kazakhstan",
		"LA", "Lao People's Democratic Republic",
		"LB", "Lebanon",
		"LC", "Saint Lucia",
		"LI", "Liechtenstein",
		"LK", "Sri Lanka",
		"LR", "Liberia",
		"LS", "Lesotho",
		"LT", "Lithuania",
		"LU", "Luxembourg",
		"LV", "Latvia",
		"LY", "Libyan Arab Jamahiriya",
		"MA", "Morocco",
		"MC", "Monaco",
		"MD", "Republic of Moldova",
		"MG", "Madagascar",
		"MH", "Marshall Islands",
		"MK", "Macedonia",
		"ML", "Mali",
		"MM", "Myanmar",
		"MN", "Mongolia",
		"MO", "Macao",
		"MP", "Northern Mariana Islands",
		"MQ", "Martinique",
		"MR", "Mauritania",
		"MS", "Montserrat",
		"MT", "Malta",
		"MU", "Mauritius",
		"MV", "Maldives",
		"MW", "Malawi",
		"MX", "Mexico",
		"MY", "Malaysia",
		"MZ", "Mozambique",
		"NA", "Namibia",
		"NC", "New Caledonia",
		"NE", "Niger",
		"NF", "Norfolk Island",
		"NG", "Nigeria",
		"NI", "Nicaragua",
		"NL", "Netherlands",
		"NO", "Norway",
		"NP", "Nepal",
		"NR", "Nauru",
		"NU", "Niue",
		"NZ", "New Zealand",
		"OM", "Oman",
		"PA", "Panama",
		"PE", "Peru",
		"PF", "French Polynesia (including Clipperton Island)",
		"PG", "Papua New Guinea",
		"PH", "Philippines",
		"PK", "Pakistan",
		"PL", "Poland",
		"PM", "Saint Pierre and Miquelon",
		"PN", "Pitcairn",
		"PR", "Puerto Rico",
		"PS", "Palestinian Territory, Occupied",
		"PT", "Portugal",
		"PW", "Palau",
		"PY", "Paraguay",
		"QA", "Qatar",
		"RE", "Reunion",
		"RO", "Romania",
		"RU", "Russian Federation",
		"RW", "Rwanda",
		"SA", "Saudi Arabia",
		"SB", "Solomon Islands",
		"SC", "Seychelles",
		"SD", "Sudan",
		"SE", "Sweden",
		"SG", "Singapore",
		"SH", "Saint Helena (including Ascension Island and Tristan da Cunha)",
		"SI", "Slovenia",
		"SJ", "Svalbard and Jan Mayen consisting of Svalbard and Jan Mayen",
		"SK", "Slovakia",
		"SL", "Sierra Leone",
		"SM", "San Marino",
		"SN", "Senegal",
		"SO", "Somalia",
		"SR", "Suriname",
		"ST", "Sao Tome and Principe",
		"SU", "Soviet Union",
		"SV", "El Salvador",
		"SY", "Syrian Arab Republic",
		"SZ", "Swaziland",
		"TC", "Turks and Caicos Islands",
		"TD", "Chad",
		"TF", "French Southern Territories",
		"TG", "Togo",
		"TH", "Thailand",
		"TJ", "Tajikistan",
		"TK", "Tokelau",
		"TL", "Timor-Leste (East Timor)",
		"TM", "Turkmenistan",
		"TN", "Tunisia",
		"TO", "Tonga",
		"TR", "Turkey",
		"TT", "Trinidad and Tobago",
		"TV", "Tuvalu",
		"TW", "Taiwan, Province of China",
		"TZ", "United Republic of Tanzania",
		"UA", "Ukraine",
		"UG", "Uganda",
		"UK", "United Kingdom",
		"UM", "United States Minor Outlying Islands",
		"US", "United States",
		"UY", "Uruguay",
		"UZ", "Uzbekistan",
		"VA", "Holy See (Vatican City State)",
		"VC", "Saint Vincent and the Grenadines",
		"VE", "Venezuela",
		"VG", "Virgin Islands, British",
		"VI", "Virgin Islands, U.S.",
		"VN", "Viet Nam",
		"VU", "Vanuatu",
		"WF", "Wallis and Futuna",
		"WS", "Samoa",
		"YE", "Yemen",
		"YT", "Mayotte",
		"ZA", "South Africa",
		"ZM", "Zambia",
		"ZW", "Zimbabwe",
		0
	};

	for (int e = 0; countries[e].code; e++)
		if (!strcasecmp (countries[e].code, c))
			return countries[e].country;

	return "Incorrect country code, try again";
}
