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

#include "lib/usb-virtual-bus-launcher-helper/usb-virtual-bus-launcher-helper.h"

#include <lib/fdio/watcher.h>

#include <fbl/function.h>
#include <fbl/string.h>

namespace usb_virtual_bus {

using Callback = fbl::Function<zx_status_t(int, const char*)>;
zx_status_t WatcherCallback(int dirfd, int event, const char* fn, void* cookie) {
  return (*reinterpret_cast<Callback*>(cookie))(event, fn);
}

zx_status_t WatchDirectory(int dirfd, Callback* callback) {
  return fdio_watch_directory(dirfd, WatcherCallback, ZX_TIME_INFINITE, callback);
}

__EXPORT
zx_status_t WaitForAnyFile(int dirfd, int event, const char* name, void* cookie) {
  if (event != WATCH_EVENT_ADD_FILE) {
    return ZX_OK;
  }
  if (*name) {
    *reinterpret_cast<fbl::String*>(cookie) = fbl::String(name);
    return ZX_ERR_STOP;
  } else {
    return ZX_OK;
  }
}

__EXPORT
zx_status_t WaitForFile(int dirfd, int event, const char* fn, void* name) {
  if (event != WATCH_EVENT_ADD_FILE) {
    return ZX_OK;
  }
  return strcmp(static_cast<const char*>(name), fn) ? ZX_OK : ZX_ERR_STOP;
}

}  // namespace usb_virtual_bus
