// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef DEVICE_UDEV_LINUX_UDEV_H_
#define DEVICE_UDEV_LINUX_UDEV_H_

#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>

#if !defined(USE_UDEV)
#error "USE_UDEV not defined"
#endif

// Adapted from libudev.h.
#define udev_list_entry_foreach(list_entry, first_entry) \
  for (list_entry = first_entry; list_entry != NULL;     \
       list_entry = ::device::udev_list_entry_get_next(list_entry))

// Forward declarations of opaque structs.
struct udev;
struct udev_device;
struct udev_enumerate;
struct udev_list_entry;
struct udev_monitor;

namespace device {

const char* udev_device_get_action(udev_device* udev_device);
const char* udev_device_get_devnode(udev_device* udev_device);
udev_device* udev_device_get_parent(udev_device* udev_device);
udev_device* udev_device_get_parent_with_subsystem_devtype(
    udev_device* udev_device,
    const char* subsystem,
    const char* devtype);
const char* udev_device_get_property_value(udev_device* udev_device,
                                           const char* key);
const char* udev_device_get_subsystem(udev_device* udev_device);
const char* udev_device_get_sysattr_value(udev_device* udev_device,
                                          const char* sysattr);
const char* udev_device_get_sysname(udev_device* udev_device);
const char* udev_device_get_syspath(udev_device* udev_device);
udev_device* udev_device_new_from_devnum(udev* udev, char type, dev_t devnum);
udev_device* udev_device_new_from_syspath(udev* udev, const char* syspath);
void udev_device_unref(udev_device* udev_device);
int udev_enumerate_add_match_subsystem(udev_enumerate* udev_enumerate,
                                       const char* subsystem);
udev_list_entry* udev_enumerate_get_list_entry(udev_enumerate* udev_enumerate);
udev_enumerate* udev_enumerate_new(udev* udev);
int udev_enumerate_scan_devices(udev_enumerate* udev_enumerate);
void udev_enumerate_unref(udev_enumerate* udev_enumerate);
udev_list_entry* udev_list_entry_get_next(udev_list_entry* list_entry);
const char* udev_list_entry_get_name(udev_list_entry* list_entry);
int udev_monitor_enable_receiving(udev_monitor* udev_monitor);
int udev_monitor_filter_add_match_subsystem_devtype(udev_monitor* udev_monitor,
                                                    const char* subsystem,
                                                    const char* devtype);
int udev_monitor_get_fd(udev_monitor* udev_monitor);
udev_monitor* udev_monitor_new_from_netlink(udev* udev, const char* name);
udev_device* udev_monitor_receive_device(udev_monitor* udev_monitor);
void udev_monitor_unref(udev_monitor* udev_monitor);
udev* udev_new();
void udev_set_log_fn(
    struct udev* udev,
    void (*log_fn)(struct udev* udev, int priority, const char* file, int line,
                   const char* fn, const char* format, va_list args));
void udev_set_log_priority(struct udev* udev, int priority);
void udev_unref(udev* udev);

}  // namespace device

#endif  // DEVICE_UDEV_LINUX_UDEV_H_
