/* dlopen_main.c - consumer that dlopen's the library by SONAME
 * Build: gcc -o app_dlopen dlopen_main.c -ldl
 * Run:   LD_LIBRARY_PATH=. ./app_dlopen
 *
 * Demonstrates: pinning SONAME in dlopen() protects you from bad upgrades
 * (refuses to load when SONAME doesn't match).
 */
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>

struct gpu_info {
    int gpu_id;
    int temperature;
};

typedef void (*gpu_info_get_fn)(struct gpu_info *);

int main(void) {
    /* Pin to SONAME "libgpu.so.1" - like go-dcgm pinning to libdcgm.so.4 */
    void *handle = dlopen("libgpu.so.1", RTLD_NOW);
    if (!handle) {
        fprintf(stderr, "dlopen: %s\n", dlerror());
        return 1;
    }

    gpu_info_get_fn fn = (gpu_info_get_fn)dlsym(handle, "gpu_info_get");
    if (!fn) {
        fprintf(stderr, "dlsym: %s\n", dlerror());
        return 1;
    }

    struct gpu_info info = {0};
    fn(&info);
    printf("gpu_id=%d temperature=%d\n", info.gpu_id, info.temperature);

    dlclose(handle);
    return 0;
}
