blob: 32047a498d22f8b6d2fb14cae0afdf9d44f45534 [file] [log] [blame]
// Copyright 2018 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 <dirent.h>
#include <glob.h>
#include <sys/types.h>
#include <iostream>
#include <string>
#include <vector>
#include <fuchsia/maxwell/internal/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/fdio/fd.h>
#include <lib/fdio/fdio.h>
#include <lib/fdio/directory.h>
#include <src/lib/fxl/command_line.h>
#include "src/lib/files/file.h"
#include <src/lib/fxl/log_settings_command_line.h>
#include <src/lib/fxl/strings/string_printf.h>
#include "peridot/lib/module_manifest_source/package_util.h"
using ::fuchsia::maxwell::internal::ModulePackageIndexer;
using ::fuchsia::maxwell::internal::ModulePackageIndexerPtr;
// This function finds the ModulePackageIndexer fidl service that the
// module_resolver runs.
std::string FindModulePackageIndexerService() {
// The ModulePackageIndexer service is run by the module_resolver component
// under current sys realm. The structured path of to this service is:
// /hub//r/user-<userid>/<koid>/c/module_resolver/<koid>/out/debug
auto glob_str =
fxl::StringPrintf("/hub/r/user-*/*/c/module_resolver/*/out/debug/%s",
ModulePackageIndexer::Name_);
glob_t globbuf;
std::string service_path;
FXL_CHECK(glob(glob_str.data(), 0, nullptr, &globbuf) == 0);
if (globbuf.gl_pathc > 0) {
service_path = globbuf.gl_pathv[0];
}
if (globbuf.gl_pathc > 1) {
FXL_DLOG(WARNING) << "Found more than one module resolver.";
}
globfree(&globbuf);
return service_path;
}
int main(int argc, const char** argv) {
async::Loop loop(&kAsyncLoopConfigAttachToThread);
const auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
fxl::SetLogSettingsFromCommandLine(command_line);
if (command_line.positional_args().size() != 2) {
std::cerr << "Usage: " << command_line.argv0()
<< " <package name> <version>";
return 1;
}
auto service_path = FindModulePackageIndexerService();
FXL_CHECK(!service_path.empty())
<< "Could not find a running module resolver. Is the user logged in?";
ModulePackageIndexerPtr indexer;
auto req_handle = indexer.NewRequest().TakeChannel();
if (fdio_service_connect(service_path.c_str(), req_handle.get()) != ZX_OK) {
FXL_LOG(FATAL) << "Could not connect to service " << service_path;
return 1;
}
const auto& package_name = command_line.positional_args()[0];
const auto& package_version = command_line.positional_args()[1];
indexer->IndexManifest(
package_name,
modular::GetModuleManifestPathFromPackage(package_name, package_version));
return 0;
}