[flang-commits] [flang] 731b295 - [flang] Handle missing LOGIN_NAME_MAX definition in runtime (#77775)

via flang-commits flang-commits at lists.llvm.org
Thu Jan 11 07:08:47 PST 2024


Author: Rainer Orth
Date: 2024-01-11T16:08:43+01:00
New Revision: 731b29560d02f21210d2224226dd5378afa5090f

URL: https://github.com/llvm/llvm-project/commit/731b29560d02f21210d2224226dd5378afa5090f
DIFF: https://github.com/llvm/llvm-project/commit/731b29560d02f21210d2224226dd5378afa5090f.diff

LOG: [flang] Handle missing LOGIN_NAME_MAX definition in runtime (#77775)

18af032c0e16252effeb6dfd02113812388f1d31 broke the Solaris build:
```
/vol/llvm/src/llvm-project/dist/flang/runtime/extensions.cpp:60:24: error: use of undeclared identifier 'LOGIN_NAME_MAX'
   60 |   const int nameMaxLen{LOGIN_NAME_MAX + 1};
      |                        ^
/vol/llvm/src/llvm-project/dist/flang/runtime/extensions.cpp:61:12: warning: variable length arrays in C++ are a Clang extension [-Wvla-cxx-extension]
   61 |   char str[nameMaxLen];
      |            ^~~~~~~~~~
/vol/llvm/src/llvm-project/dist/flang/runtime/extensions.cpp:61:12: note: initializer of 'nameMaxLen' is unknown
/vol/llvm/src/llvm-project/dist/flang/runtime/extensions.cpp:60:13: note: declared here
   60 |   const int nameMaxLen{LOGIN_NAME_MAX + 1};
      |             ^
```
`flang/unittests/Runtime/CommandTest.cpp` has the same issue.

As documented in Solaris 11.4 `limits.h(3HEAD)`, `LOGIN_NAME_MAX` can be
undefined. To determine the value, `sysconf(3C)` needs to be used
instead.

Beside that portable method, Solaris also provides a non-standard
`LOGNAME_MAX` which could be used, but I've preferred the standard route
instead which would support other targets with the same issue.

Tested on `amd64-pc-solaris2.11` and `x86_64-pc-linux-gnu`.

Added: 
    

Modified: 
    flang/runtime/extensions.cpp
    flang/unittests/Runtime/CommandTest.cpp

Removed: 
    


################################################################################
diff  --git a/flang/runtime/extensions.cpp b/flang/runtime/extensions.cpp
index 8fc132aeff4ee1..f72acf83a4409f 100644
--- a/flang/runtime/extensions.cpp
+++ b/flang/runtime/extensions.cpp
@@ -100,7 +100,14 @@ void FORTRAN_PROCEDURE_NAME(getarg)(
 // CALL GETLOG(USRNAME)
 void FORTRAN_PROCEDURE_NAME(getlog)(std::byte *arg, std::int64_t length) {
 #if _REENTRANT || _POSIX_C_SOURCE >= 199506L
-  const int nameMaxLen{LOGIN_NAME_MAX + 1};
+  int nameMaxLen;
+#ifdef LOGIN_NAME_MAX
+  nameMaxLen = LOGIN_NAME_MAX + 1;
+#else
+  nameMaxLen = sysconf(_SC_LOGIN_NAME_MAX) + 1;
+  if (nameMaxLen == -1)
+    nameMaxLen = _POSIX_LOGIN_NAME_MAX + 1;
+#endif
   char str[nameMaxLen];
 
   int error{getlogin_r(str, nameMaxLen)};

diff  --git a/flang/unittests/Runtime/CommandTest.cpp b/flang/unittests/Runtime/CommandTest.cpp
index 30574dcbdda19d..668a3508653e4d 100644
--- a/flang/unittests/Runtime/CommandTest.cpp
+++ b/flang/unittests/Runtime/CommandTest.cpp
@@ -691,7 +691,14 @@ TEST_F(EnvironmentVariables, GetlogGetName) {
 #if _REENTRANT || _POSIX_C_SOURCE >= 199506L
 TEST_F(EnvironmentVariables, GetlogPadSpace) {
   // guarantee 1 char longer than max, last char should be pad space
-  const int charLen{LOGIN_NAME_MAX + 2};
+  int charLen;
+#ifdef LOGIN_NAME_MAX
+  charLen = LOGIN_NAME_MAX + 2;
+#else
+  charLen = sysconf(_SC_LOGIN_NAME_MAX) + 2;
+  if (charLen == -1)
+    charLen = _POSIX_LOGIN_NAME_MAX + 2;
+#endif
   char input[charLen];
 
   FORTRAN_PROCEDURE_NAME(getlog)


        


More information about the flang-commits mailing list