#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <xf86drm.h>

static void print_driver(const char *node)
{
    int fd = open(node, O_RDWR);
    if (fd < 0) {
        perror(node);
        return;
    }

    drmVersionPtr v = drmGetVersion(fd);
    if (v) {
        printf("%s: '%s'\n", node, v->name ?: "(null)");
        drmFreeVersion(v);
    } else {
        fprintf(stderr, "%s: drmGetVersion failed\n", node);
    }

    close(fd);
}

int main(int argc, char *argv[])
{
    drmDevicePtr devices[16];
    int n = drmGetDevices2(0, devices, 16);
    if (n < 0) {
        fprintf(stderr, "drmGetDevices2 failed\n");
        return 1;
    }

    for (int i = 0; i < n; i++) {
        const char *node = NULL;
        if (devices[i]->available_nodes & (1 << DRM_NODE_RENDER))
            node = devices[i]->nodes[DRM_NODE_RENDER];
        else if (devices[i]->available_nodes & (1 << DRM_NODE_PRIMARY))
            node = devices[i]->nodes[DRM_NODE_PRIMARY];
        if (node)
            print_driver(node);
    }

    drmFreeDevices(devices, n);
    return 0;
}
