/*
 * Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

#include <stdlib.h>              /* For NULL */
#include <openssl/macros.h>      /* For NON_EMPTY_TRANSLATION_UNIT */
#include <openssl/e_os2.h>
#include "simpledynamic.h"

#if defined(DSO_DLFCN)

int sd_load(const char *filename, SD *lib, int type)
{
    int dl_flags = type;
#ifdef _AIX
    if (filename[strlen(filename) - 1] == ')')
        dl_flags |= RTLD_MEMBER;
#endif
    *lib = dlopen(filename, dl_flags);
    return *lib == NULL ? 0 : 1;
}

int sd_sym(SD lib, const char *symname, SD_SYM *sym)
{
    *sym = dlsym(lib, symname);
    return *sym != NULL;
}

int sd_close(SD lib)
{
    return dlclose(lib) != 0 ? 0 : 1;
}

const char *sd_error(void)
{
    return dlerror();
}

#elif defined(DSO_WIN32)

int sd_load(const char *filename, SD *lib, ossl_unused int type)
{
    *lib = LoadLibraryA(filename);
    return *lib == NULL ? 0 : 1;
}

int sd_sym(SD lib, const char *symname, SD_SYM *sym)
{
    *sym = (SD_SYM)GetProcAddress(lib, symname);
    return *sym != NULL;
}

int sd_close(SD lib)
{
    return FreeLibrary(lib) == 0 ? 0 : 1;
}

const char *sd_error(void)
{
    static char buffer[255];

    buffer[0] = '\0';
    FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), 0,
                   buffer, sizeof(buffer), NULL);
    return buffer;
}

#else

NON_EMPTY_TRANSLATION_UNIT

#endif
