/* SPDX-License-Identifier: LGPL-2.1-or-later */

#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

#include "libudev.h"

#define handle_error_errno(error, msg)                          \
        ({                                                      \
                errno = abs(error);                             \
                perror(msg);                                    \
                EXIT_FAILURE;                                   \
        })

static void* thread(void *p) {
        struct udev_device **d = p;

        *d = udev_device_unref(*d);

        return NULL;
}

int main(int argc, char *argv[]) {
        struct udev_device *loopback;
        struct udev_list_entry *entry, *e;
        pthread_t t;
        int r;

        loopback = udev_device_new_from_syspath(NULL, "/sys/class/net/lo");
        if (!loopback)
                return handle_error_errno(errno, "Failed to create loopback device object");

        entry = udev_device_get_properties_list_entry(loopback);
        udev_list_entry_foreach(e, entry)
                printf("%s=%s\n", udev_list_entry_get_name(e), udev_list_entry_get_value(e));

        r = pthread_create(&t, NULL, thread, &loopback);
        if (r != 0)
                return handle_error_errno(r, "Failed to create thread");

        r = pthread_join(t, NULL);
        if (r != 0)
                return handle_error_errno(r, "Failed to wait thread finished");

        if (loopback)
                return handle_error_errno(r, "loopback device is not unref()ed");

        return 0;
}
