AMQP-CPP/src/programname.h

99 lines
1.7 KiB
C++

/**
* ProgramName.h
*
* Helper class that detects the name of the program
*
* @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
* @copyright 2023 Copernica BV
*/
/**
* Include guard
*/
#pragma once
/**
* Dependencies
*/
#include <limits.h>
#if defined(_WIN32) || defined(_WIN64)
#include "Windows.h"
#define PATH_MAX MAX_PATH
#else
#include <unistd.h>
#endif
/**
* Begin of namespace
*/
namespace AMQP {
/**
* Class definition
*/
class ProgramName
{
private:
/**
* Path of the program
* @var char[]
*/
char _path[PATH_MAX];
/**
* Is the _path valid?
* @var bool
*/
bool _valid;
public:
/**
* Constructor
*/
ProgramName()
{
#if defined(_WIN32) || defined(_WIN64)
// the the
auto size = GetModuleFileNameA(NULL, _path, PATH_MAX);
// -1 is returned on error, otherwise the size
_valid = size >= 0;
// set trailing null byte
_path[size == PATH_MAX ? PATH_MAX-1 : size] = '\0';
#else
// read the link target
auto size = readlink("/proc/self/exe", _path, PATH_MAX);
// -1 is returned on error, otherwise the size
_valid = size >= 0;
// set trailing null byte
_path[size == PATH_MAX ? PATH_MAX-1 : size] = '\0';
#endif
}
/**
* Destructor
*/
virtual ~ProgramName() = default;
/**
* Cast to a const char *
* @return const char *
*/
operator const char * () const
{
// empty string when not valid
if (!_valid) return "";
// return path to executable
return _path;
}
};
/**
* End of namespace
*/
}