blob: 574a7a430dbf5665598b5eb94c2ceff1efd458a8 [file] [log] [blame]
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#include "platform/globals.h"
#if defined(HOST_OS_FUCHSIA)
#include "bin/namespace.h"
#include <errno.h>
#include <fcntl.h>
#include <fdio/namespace.h>
#include "bin/fdutils.h"
#include "bin/file.h"
#include "platform/signal_blocker.h"
namespace dart {
namespace bin {
Namespace* Namespace::Create(const char* path) {
UNIMPLEMENTED();
return NULL;
}
Namespace::~Namespace() {
if (namespc_ != kNone) {
fdio_ns_t* ns = reinterpret_cast<fdio_ns_t*>(namespc_);
zx_status_t status = fdio_ns_destroy(ns);
ASSERT(status == ZX_OK);
}
}
intptr_t Namespace::Default() {
return kNone;
}
const char* Namespace::GetCurrent(Namespace* namespc) {
if ((namespc == NULL) || (namespc->namespc() == kNone)) {
// TODO(zra): When there are isolate-specific namespaces, extract it from
// the namespace instead of calling getcwd.
char buffer[PATH_MAX];
if (getcwd(buffer, PATH_MAX) == NULL) {
return NULL;
}
return DartUtils::ScopedCopyCString(buffer);
}
// TODO(zra): Allow changing the current working directory when there is
// a non-default namespace.
return DartUtils::ScopedCopyCString("/");
}
bool Namespace::SetCurrent(Namespace* namespc, const char* path) {
if ((namespc == NULL) || (namespc->namespc() == kNone)) {
return (NO_RETRY_EXPECTED(chdir(path)) == 0);
}
// TODO(zra): If a non-default namespace is set up, changing the current
// working directoy is disallowed. We should relax this restriction when
// isolate-specific cwds are implemented.
errno = ENOSYS;
return false;
}
bool Namespace::ResolvePath(Namespace* namespc,
const char* path,
intptr_t* dirfd,
const char** resolved_path) {
ASSERT(dirfd != NULL);
ASSERT(resolved_path != NULL);
if ((namespc == NULL) || (namespc->namespc() == kNone)) {
*dirfd = AT_FDCWD;
*resolved_path = path;
return false;
}
fdio_ns_t* ns = reinterpret_cast<fdio_ns_t*>(namespc->namespc());
*dirfd = fdio_ns_opendir(ns);
ASSERT(*dirfd >= 0);
if (File::IsAbsolutePath(path)) {
if (strcmp(path, File::PathSeparator()) == 0) {
*resolved_path = ".";
} else {
*resolved_path = &path[1];
}
} else {
*resolved_path = path;
}
return true;
}
NamespaceScope::NamespaceScope(Namespace* namespc, const char* path) {
owns_fd_ = Namespace::ResolvePath(namespc, path, &fd_, &path_);
}
NamespaceScope::~NamespaceScope() {
if (owns_fd_) {
FDUtils::SaveErrorAndClose(fd_);
}
}
} // namespace bin
} // namespace dart
#endif // defined(HOST_OS_FUCHSIA)