diff --git a/flang-rt/lib/runtime/extensions.cpp b/flang-rt/lib/runtime/extensions.cpp index 6b553ff97e5ab..e70dff3997233 100644 --- a/flang-rt/lib/runtime/extensions.cpp +++ b/flang-rt/lib/runtime/extensions.cpp @@ -264,6 +264,38 @@ int RTNAME(Chdir)(const char *name) { #endif } +int FORTRAN_PROCEDURE_NAME(hostnm)(char *hn, int length) { + std::int32_t status{0}; + + if (!hn || length < 0) { + return EINVAL; + } + +#ifdef _WIN32 + DWORD dwSize{static_cast(length)}; + + // Note: Winsock has gethostname(), but use Win32 API GetComputerNameEx(), + // in order to avoid adding dependency on Winsock. + if (!GetComputerNameExA(ComputerNameDnsHostname, hn, &dwSize)) { + status = GetLastError(); + } +#else + if (gethostname(hn, length) < 0) { + status = errno; + } +#endif + + if (status == 0) { + // Find zero terminator and fill the string from the + // zero terminator to the end with spaces + char *str_end{hn + length}; + char *str_zero{std::find(hn, str_end, '\0')}; + std::fill(str_zero, str_end, ' '); + } + + return status; +} + int FORTRAN_PROCEDURE_NAME(ierrno)() { return errno; } void FORTRAN_PROCEDURE_NAME(qsort)(int *array, int *len, int *isize, diff --git a/flang/include/flang/Runtime/extensions.h b/flang/include/flang/Runtime/extensions.h index db2245875e85a..06ae7f35d9b5b 100644 --- a/flang/include/flang/Runtime/extensions.h +++ b/flang/include/flang/Runtime/extensions.h @@ -60,7 +60,7 @@ uid_t RTNAME(GetUID)(); void FORTRAN_PROCEDURE_NAME(getlog)(char *name, std::int64_t length); // GNU extension subroutine HOSTNM(C) -void FORTRAN_PROCEDURE_NAME(hostnm)(char *name, std::int64_t length); +int FORTRAN_PROCEDURE_NAME(hostnm)(char *hn, int length); std::intptr_t RTNAME(Malloc)(std::size_t size);