blob: 1b8da1480820eb248682a48c724729a5263fbe52 [file] [log] [blame]
//
// Copyright 2018 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// system_utils_posix.cpp: Implementation of POSIX OS-specific functions.
#include "system_utils.h"
#include <array>
#include <dlfcn.h>
#include <unistd.h>
namespace angle
{
Optional<std::string> GetCWD()
{
std::array<char, 4096> pathBuf;
char *result = getcwd(pathBuf.data(), pathBuf.size());
if (result == nullptr)
{
return Optional<std::string>::Invalid();
}
return std::string(pathBuf.data());
}
bool SetCWD(const char *dirName)
{
return (chdir(dirName) == 0);
}
bool UnsetEnvironmentVar(const char *variableName)
{
return (unsetenv(variableName) == 0);
}
bool SetEnvironmentVar(const char *variableName, const char *value)
{
return (setenv(variableName, value, 1) == 0);
}
std::string GetEnvironmentVar(const char *variableName)
{
const char *value = getenv(variableName);
return (value == nullptr ? std::string() : std::string(value));
}
const char *GetPathSeparator()
{
return ":";
}
class PosixLibrary : public Library
{
public:
PosixLibrary(const char *libraryName)
{
char buffer[1000];
int ret = snprintf(buffer, 1000, "%s.%s", libraryName, GetSharedLibraryExtension());
if (ret > 0 && ret < 1000)
{
mModule = dlopen(buffer, RTLD_NOW);
}
}
~PosixLibrary() override
{
if (mModule)
{
dlclose(mModule);
}
}
void *getSymbol(const char *symbolName) override
{
if (!mModule)
{
return nullptr;
}
return dlsym(mModule, symbolName);
}
void *getNative() const override { return mModule; }
private:
void *mModule = nullptr;
};
Library *OpenSharedLibrary(const char *libraryName)
{
return new PosixLibrary(libraryName);
}
} // namespace angle