[clang-tools-extra] [llvm] [clang] [flang] [flang] GETLOG runtime and extension implementation: get login username (PR #74628)
@@ -10,13 +10,29 @@ // extensions that will eventually be implemented in Fortran. #include "flang/Runtime/extensions.h" +#include "flang/Runtime/character.h" #include "flang/Runtime/command.h" #include "flang/Runtime/descriptor.h" #include "flang/Runtime/io-api.h" +#if _REENTRANT || _POSIX_C_SOURCE >= 199506L +// System is posix-compliant and has getlogin_r +#include +#endif + extern "C" { namespace Fortran::runtime { + +void GetUsernameEnvVar( +const char *envName, std::byte *arg, std::int64_t length) { + Descriptor name{ + *Descriptor::Create(1, sizeof(envName), const_cast(envName), 0)}; jeanPerier wrote: I think that when @klausler suggested using sizeof(), the type was a `char[n]`, here it is a `const char*` so I expect this will be 8 on 64bits machines which is OK by accident for `USERNAME`, but just wrong in general. https://github.com/llvm/llvm-project/pull/74628 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [llvm] [clang] [flang] [flang] GETLOG runtime and extension implementation: get login username (PR #74628)
@@ -37,5 +79,34 @@ void FORTRAN_PROCEDURE_NAME(getarg)( (void)RTNAME(GetCommandArgument)( n, &value, nullptr, nullptr, __FILE__, __LINE__); } + +// CALL GETLOG(USRNAME) +void FORTRAN_PROCEDURE_NAME(getlog)(std::int8_t *arg, std::int64_t length) { + const int nameMaxLen{LOGIN_NAME_MAX + 1}; + char str[nameMaxLen]; + + int error{getlogin_r(str, nameMaxLen)}; + Terminator terminator{__FILE__, __LINE__}; + if (error != 0) { +// if there is error, then get username from environment variable +#ifdef _WIN32 +const int charLen = 9; +char envName[charLen] = "USERNAME"; +#else +const int charLen = 8; +char envName[charLen] = "LOGNAME"; +#endif +std::size_t n{std::strlen(envName)}; yi-wu-arm wrote: thanks for pointing this out, I will use `charLen` instead, since its there already. https://github.com/llvm/llvm-project/pull/74628 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [llvm] [clang] [flang] [flang] GETLOG runtime and extension implementation: get login username (PR #74628)
@@ -37,5 +79,34 @@ void FORTRAN_PROCEDURE_NAME(getarg)( (void)RTNAME(GetCommandArgument)( n, &value, nullptr, nullptr, __FILE__, __LINE__); } + +// CALL GETLOG(USRNAME) +void FORTRAN_PROCEDURE_NAME(getlog)(std::int8_t *arg, std::int64_t length) { + const int nameMaxLen{LOGIN_NAME_MAX + 1}; + char str[nameMaxLen]; + + int error{getlogin_r(str, nameMaxLen)}; + Terminator terminator{__FILE__, __LINE__}; + if (error != 0) { +// if there is error, then get username from environment variable +#ifdef _WIN32 +const int charLen = 9; klausler wrote: It needn't be `static` or `const`. https://github.com/llvm/llvm-project/pull/74628 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits