/*
 * Copyright 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
 */

/*
 * Extremely simple dynamic loader, must never be linked with anything other
 * than the standard C library.  Its purpose is to try to load a dynamic module
 * and verify the presence of one symbol, if that's given.
 */

#include <stdio.h>
#include <stdlib.h>
#include <openssl/core.h>
#include "simpledynamic.h"

static int test_load(const char *path, const char *symbol)
{
#ifdef SD_INIT
    SD sd = SD_INIT;
    SD_SYM sym;
    int ret;

    if (!sd_load(path, &sd, SD_MODULE))
        return 0;
    ret = symbol == NULL || sd_sym(sd, symbol, &sym);
    if (!sd_close(sd))
        ret = 0;
    return ret;
#else
    fprintf(stderr, "No dynamic loader\n");
    return 0;
#endif
}

int main(int argc, char *argv[])
{
    const char *m, *s;

    if (argc != 2 && argc != 3) {
        fprintf(stderr, "Usage: %s sharedobject [ entrypoint ]\n", argv[0]);
        return 1;
    }

    m = argv[1];
    s = argc == 3 ? argv[2] : NULL;

    return test_load(m, s) ? 0 : 1;
}
