/*
* Copyright (c) 2017, The Linux Foundation. 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 Linux Foundation 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 "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* 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 "OsHandler.h"
#include <memory>
#include <iostream> //TODO - maybe to remove
#ifdef __OS3__
#include <sys/signal.h>
#endif
#include "Host.h"
using namespace std; //TODO - maybe to remove

#ifndef _WINDOWS
void sig_quit_handler(int signum)
{
    if (signum == SIGQUIT || signum == SIGTSTP)
    {
        printf("Exiting host_manager_11ad as per user request\n");
        Host::GetHost().StopHost();
        exit(signum);
    }
    else if (signum == SIGPIPE)
    {
        //printf("Connection lost\n");
    }
}
#endif

// *************************************************************************************************

void OsHandler::HandleOsSignals()
{
#ifndef _WINDOWS
    //LOG_INFO << "Handle linux SIQQUIT signal" << endl;
    signal(SIGQUIT, sig_quit_handler);
    signal(SIGPIPE, sig_quit_handler);
    signal(SIGTSTP, sig_quit_handler);
#endif

}

// *************************************************************************************************

void OsHandler::OsSleep(int sleep_period)
{
#ifdef _WINDOWS
    Sleep(sleep_period);
#else
    usleep(sleep_period * SECOND_IN_MILLISECONDS);
#endif
}

//void OsHandler::OsError(const char* error_message, ...)
//{
//    va_list argptr;
//    va_start(argptr, error_message);
//
//#ifdef _WINDOWS
//    vfprintf(stderr, error_message, argptr);
//
//    exit(0);
//#else
//    vfprintf(stderr, error_message, argptr);
//
//    exit(0);
//#endif
//
//    va_end(argptr);
//}

