/*
 * Copyright (c) 2012-2013 Stanford University
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR(S) DISCLAIM ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL AUTHORS BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef __SYSTEMEXCEPTION_H__
#define __SYSTEMEXCEPTION_H__

#include <string.h>

#ifndef _WIN32
#include <errno.h>
#endif

#include <string>
#include <exception>

class SystemException : public std::exception
{
public:
    SystemException() {
        errorString = "Exception: ";
        errorString += strerror(errno);
        errnum = errno;
    }
    SystemException(int errorNumber) {
        errorString = "Exception: ";
        errorString += strerror(errorNumber);
        errnum = errorNumber;
    }
    virtual ~SystemException() throw()
    {
    }
    virtual int getErrno() const throw()
    {
        return errnum;
    }
    virtual const char* what() const throw()
    {
        // Generate error string strerror_r
        return errorString.c_str();
    }
private:
    std::string errorString;
    int errnum;
};

#endif /* __SYSTEMEXCEPTION_H__ */
