#include <stdio.h>    //printf(3)
#include <stdlib.h>   //exit(3)
#include <unistd.h>   //fork(3), chdir(3), sysconf(3)
#include <signal.h>   //signal(3)
#include <sys/stat.h> //umask(3)
#include <syslog.h>   //syslog(3), openlog(3), closelog(3)
#include <iostream>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <iostream>
#include <fstream>
#include <string>
#include <curl/curl.h>
#define MAXHOSTNAME 256
#define DESTURL "http://wttr.in/"
#define DESTURLEND "?format=3"
using namespace std;

const char* offices[] = {
    "Brisbane",
    "Canberra",
    "Melbourne",
    "Perth",
    "Sydney",
    "Beijing",
    "Shanghai",
    "Shenzhen",
    "Hong Kong",
    "Bangalore",
    "New%20Delhi",
    "Kolkata",
    "Mumbai",
    "Pune",
    "Jakarta",
    "Tokyo",
    "Nagoya",
    "Osaka",
    "Fukuoka",
    "Seoul",
    "Kuala%20Lumpur",
    "Auckland",
    "Wellington",
    "Makati%20City",
    "Singapore",
    "Taipei",
    "Bangkok",
    "London",
    "Amsterdam",
    "Barcelona",
    "Berlin",
    "Brno",
    "Brussels",
    "Copenhagen",
    "Berlin",
    "Cork",
    "Dublin",
    "Düsseldorf",
    "Farnborough",
    "Frankfurt%20am%20Main",
    "Helsinki",
    "Madrid",
    "Milan",
    "Moscow",
    "Grasbrunn",
    "Neuchâtel",
    "Newcastle%20Upon%20Tyne",
    "Oslo",
    "Prague",
    "Puteaux",
    "Rome",
    "Stockholm",
    "Stuttgart",
    "Cherkasy",
    "Vienna",
    "Warsaw",
    "Waterford",
    "Zürich",
    "Dubai",
    "İstanbul",
    "Ra’anana",
    "Riyadh",
    "Sandton",
    "Buenos%20Aires",
    "Brasília",
    "Fortaleza",
    "Rio%20de%20Janeiro",
    "São%20Paulo",
    "Santiago",
    "Bogota",
    "Ciudad%20de%20México",
    "Monterrey",
    "Lima",
    "Montreal",
    "Toronto",
    "Raleigh",
    "Boston",
    "Ann%20Arbor",
    "Atlanta",
    "Washington",
    "North Charleston",
    "Charlotte",
    "Chicago",
    "San%20Francisco",
    "New%20York",
    "Dallas",
    "Denver",
    "Durham",
    "Huntsville",
    "Los%20Angeles",
    "Mahwah",
    "Minneapolis",
    "Richmond",
    "St.%20Louis",
    "Sunnyvale",
    "McLean",
    "Westford",
    NULL };

int curlUrl( const char* myOffice, size_t myUrlLength )
{
    std::string fullUrl;
    CURL *curl;
    CURLcode res;

    // create a URL from 2 constants and an office string
    fullUrl.append( DESTURL );
    fullUrl.append( myOffice );
    fullUrl.append( DESTURLEND );
    // make a C string of the same size and copy to it
    int fullUrlSize = fullUrl.length();
    char charFullArray[ fullUrlSize + 1 ];
    strcpy( charFullArray,  fullUrl.c_str() );

    // setup curl, grab the combined URL, and clean up
    curl = curl_easy_init();
    if(curl)
    {
        curl_easy_setopt(curl, CURLOPT_URL, charFullArray);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
    }

    return res;
} 

int main()
{
    int ttl=999999;
    int delay=10;

    pid_t pid = fork();

    if (pid == 0)
    {
        // child process
        openlog("testapp",LOG_PID,LOG_DAEMON);

        // iterate over the list of Red Hat offices and get the weather for each
        for ( int i=0; offices[i] != NULL; i++ )
        {
            curlUrl( ( "http://wttr.in?%sformat=3", offices[i]), sizeof( ( "http://wttr.in?%sformat=3", offices[i]) ) );
            sleep(delay);
        }

        syslog(LOG_NOTICE,"testapp child process ended");
        closelog();
        return(EXIT_SUCCESS);
    }
    if (pid > 0)
    {
        // parent process
        string filename = "/var/run/testapp.pid";
        ofstream o(filename.c_str());
        o << pid << endl;

        ifstream meminfo;
        meminfo.open("/proc/meminfo");
        meminfo.close();

        openlog("testapp",LOG_PID,LOG_DAEMON);

        /* disabling this due to startup timeout
        do
        {
            syslog(LOG_NOTICE,"daemon ttl %d",ttl);
            sleep(delay);
            ttl-=delay;
        } while ( ttl > 0 );
        syslog(LOG_NOTICE,"daemon ttl expired");*/

        syslog(LOG_NOTICE,"testapp parent process ended");
        closelog();
        return(EXIT_SUCCESS);
    }
}
