blob: d9db2e546041845cec54a4b79e7e6ab878fe7ce9 [file] [log] [blame]
// Copyright 2017 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 "filesystem/symlink.h"
#include <windows.h>
#include <winioctl.h>
#include <iostream>
namespace filesystem {
struct UniqueHandleTraits {
static HANDLE InvalidValue() { return INVALID_HANDLE_VALUE; }
static bool IsValid(HANDLE value) { return value != INVALID_HANDLE_VALUE; }
static void Free(HANDLE value) { CloseHandle(value); }
};
bool ReadSymbolicLink(const std::string& path, std::string* resolved_path) {
FXL_CHECK(false) << "Unimplemented";
return false;
}
std::string GetAbsoluteFilePath(const std::string& path) {
fxl::UniqueObject<HANDLE, UniqueHandleTraits> file(
CreateFileA(path.c_str(), FILE_READ_ATTRIBUTES,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL));
if (!file.is_valid()) {
return std::string();
}
char buffer[MAX_PATH];
DWORD ret = GetFinalPathNameByHandleA(file.get(), buffer, MAX_PATH,
FILE_NAME_NORMALIZED);
if (ret == 0 || ret > MAX_PATH) {
return std::string();
}
std::string result(buffer);
result.erase(0, strlen("\\\\?\\"));
return result;
}
} // namespace filesystem