summaryrefslogtreecommitdiff
path: root/ACE
diff options
context:
space:
mode:
authorolli <olli@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2011-03-11 12:12:40 +0000
committerolli <olli@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2011-03-11 12:12:40 +0000
commit8757d55d32fca9a07a3434ce8f53d2f6d7d54605 (patch)
tree0ebf07e7bc836df6cfca84368fda88c8ad14030d /ACE
parent6560923ab7f2ab855eb5b1320d0b984d6d28c890 (diff)
downloadATCD-8757d55d32fca9a07a3434ce8f53d2f6d7d54605.tar.gz
ChangeLogTag: Fri Mar 11 12:09:00 UTC 2011 Olli Savia <ops@iki.fi>
Diffstat (limited to 'ACE')
-rw-r--r--ACE/ChangeLog25
-rw-r--r--ACE/ace/OS_NS_pwd.h10
-rw-r--r--ACE/ace/OS_NS_pwd.inl78
-rw-r--r--ACE/ace/config-aix-5.x.h1
-rw-r--r--ACE/ace/config-cygwin32.h2
-rw-r--r--ACE/ace/config-freebsd.h1
-rw-r--r--ACE/ace/config-hpux-11.00.h3
-rw-r--r--ACE/ace/config-kfreebsd.h3
-rw-r--r--ACE/ace/config-linux.h1
-rw-r--r--ACE/ace/config-lynxos.h2
-rw-r--r--ACE/ace/config-netbsd.h1
-rw-r--r--ACE/ace/config-openbsd.h2
-rw-r--r--ACE/ace/config-openvms.h2
-rw-r--r--ACE/ace/config-rtems.h1
-rw-r--r--ACE/ace/config-sunos5.5.h6
-rw-r--r--ACE/ace/config-win32-interix.h1
-rw-r--r--ACE/tests/OS_Test.cpp32
17 files changed, 83 insertions, 88 deletions
diff --git a/ACE/ChangeLog b/ACE/ChangeLog
index e80a220eb9f..f798736396e 100644
--- a/ACE/ChangeLog
+++ b/ACE/ChangeLog
@@ -1,3 +1,28 @@
+Fri Mar 11 12:09:00 UTC 2011 Olli Savia <ops@iki.fi>
+
+ * ace/OS_NS_pwd.h:
+ * ace/OS_NS_pwd.inl:
+ Rewrote getpwnam_r(). Changed API to conform POSIX.
+ Fixes Bug #3952.
+
+ * ace/config-aix-5.x.h:
+ * ace/config-cygwin32.h:
+ * ace/config-freebsd.h:
+ * ace/config-hpux-11.00.h:
+ * ace/config-kfreebsd.h:
+ * ace/config-linux.h:
+ * ace/config-lynxos.h:
+ * ace/config-netbsd.h:
+ * ace/config-openbsd.h:
+ * ace/config-openvms.h:
+ * ace/config-rtems.h:
+ * ace/config-sunos5.5.h:
+ * ace/config-win32-interix.h:
+ Config changes due getpwnam_r() rewrite and API change.
+
+ * tests/OS_Test.cpp:
+ Added atest for getpwnam_r().
+
Thu Mar 10 16:42:30 UTC 2011 Phil Mesnier <mesnier_p@ociweb.com>
* bin/fuzz.pl:
diff --git a/ACE/ace/OS_NS_pwd.h b/ACE/ace/OS_NS_pwd.h
index 7e3bef0907d..252285d88cb 100644
--- a/ACE/ace/OS_NS_pwd.h
+++ b/ACE/ace/OS_NS_pwd.h
@@ -53,10 +53,12 @@ namespace ACE_OS
struct passwd *getpwnam (const char *user);
ACE_NAMESPACE_INLINE_FUNCTION
- struct passwd *getpwnam_r (const char *name,
- struct passwd *pwent,
- char *buffer,
- int buflen);
+ int getpwnam_r (const char *name,
+ struct passwd *pwd,
+ char *buffer,
+ size_t bufsize,
+ struct passwd **result);
+
ACE_NAMESPACE_INLINE_FUNCTION
void setpwent (void);
//@}
diff --git a/ACE/ace/OS_NS_pwd.inl b/ACE/ace/OS_NS_pwd.inl
index 99ece415aa5..b8d03a0e824 100644
--- a/ACE/ace/OS_NS_pwd.inl
+++ b/ACE/ace/OS_NS_pwd.inl
@@ -37,71 +37,29 @@ ACE_OS::getpwnam (const char *name)
#endif /* ACE_LACKS_PWD_FUNCTIONS */
}
-ACE_INLINE struct passwd *
-ACE_OS::getpwnam_r (const char *name, struct passwd *pwent,
- char *buffer, int buflen)
+ACE_INLINE int
+ACE_OS::getpwnam_r (const char *name,
+ struct passwd *pwd,
+ char *buffer,
+ size_t bufsize,
+ struct passwd **result)
{
-#if defined (ACE_HAS_POSIX_GETPWNAM_R)
- struct passwd *result = 0;
-
- int const status = ::getpwnam_r (name, pwent, buffer, buflen, &result);
-
- if (status != 0)
- {
- errno = status;
- result = 0;
- }
- return result;
-#elif !defined (ACE_LACKS_PWD_FUNCTIONS)
-# if defined (ACE_HAS_REENTRANT_FUNCTIONS)
-# if !defined (ACE_LACKS_PWD_REENTRANT_FUNCTIONS)
-# if defined (ACE_HAS_PTHREADS) && \
- !defined (ACE_HAS_STHREADS) || \
- defined (HPUX_11)
- struct passwd *result = 0;
- int status;
- // VAC++ doesn't correctly grok the ::getpwnam_r - the function is redefined
- // in pwd.h, and that redefinition is used here
-# if defined (__IBMCPP__) && (__IBMCPP__ >= 400) /* VAC++ 4 */
- status = _posix_getpwnam_r (name, pwent, buffer, buflen, &result);
-# else
- status = ::getpwnam_r (name, pwent, buffer, buflen, &result);
-# endif /* __IBMCPP__ && (__IBMCPP__ >= 400) */
- if (status != 0)
- {
- errno = status;
- result = 0;
- }
- return result;
-# elif defined (AIX)
- if (::getpwnam_r (name, pwent, buffer, buflen) == -1)
- return 0;
- else
- return pwent;
-# else
- return ::getpwnam_r (name, pwent, buffer, buflen);
-# endif /* ACE_HAS_PTHREADS */
-# else
- ACE_UNUSED_ARG (name);
- ACE_UNUSED_ARG (pwent);
- ACE_UNUSED_ARG (buffer);
- ACE_UNUSED_ARG (buflen);
- ACE_NOTSUP_RETURN (0);
-# endif /* ! ACE_LACKS_PWD_REENTRANT_FUNCTIONS */
-# else
+#if defined (ACE_LACKS_PWD_FUNCTIONS)
ACE_UNUSED_ARG (name);
- ACE_UNUSED_ARG (pwent);
+ ACE_UNUSED_ARG (pwd);
ACE_UNUSED_ARG (buffer);
- ACE_UNUSED_ARG (buflen);
+ ACE_UNUSED_ARG (bufsize);
+ ACE_UNUSED_ARG (result);
ACE_NOTSUP_RETURN (0);
-# endif /* ACE_HAS_REENTRANT_FUNCTIONS */
+#elif defined (ACE_HAS_NONSTD_GETPWNAM_R)
+ if (::getpwnam_r (pwd, const_cast<char*>(name), buffer, bufsize) == -1)
+ return -1;
+
+ *result = pwd;
+ return 0;
#else
- ACE_UNUSED_ARG (name);
- ACE_UNUSED_ARG (pwent);
- ACE_UNUSED_ARG (buffer);
- ACE_UNUSED_ARG (buflen);
- ACE_NOTSUP_RETURN (0);
-#endif /* ACE_HAS_POSIX_GETPWNAM_R */
+ return ::getpwnam_r (name, pwd, buffer, bufsize, result);
+#endif /* ACE_LACKS_PWD_FUNCTIONS */
}
ACE_INLINE void
diff --git a/ACE/ace/config-aix-5.x.h b/ACE/ace/config-aix-5.x.h
index 56cbe17ff14..04869085c1d 100644
--- a/ACE/ace/config-aix-5.x.h
+++ b/ACE/ace/config-aix-5.x.h
@@ -312,7 +312,6 @@
#undef ACE_LACKS_NETINET_TCP_H
#define ACE_HAS_3_PARAM_READDIR_R
-#define ACE_HAS_POSIX_GETPWNAM_R
#define ACE_HAS_SCANDIR
#define ACE_SCANDIR_CMP_USES_VOIDPTR
#define ACE_SCANDIR_SEL_LACKS_CONST
diff --git a/ACE/ace/config-cygwin32.h b/ACE/ace/config-cygwin32.h
index e075b51c3e2..198da4f12a9 100644
--- a/ACE/ace/config-cygwin32.h
+++ b/ACE/ace/config-cygwin32.h
@@ -64,7 +64,6 @@
#define ACE_HAS_VOIDPTR_SOCKOPT 1
#define ACE_HAS_UALARM 1
#define ACE_HAS_STRNLEN 1
-#define ACE_HAS_POSIX_GETPWNAM_R 1
#define ACE_HAS_POSIX_NONBLOCK 1
#define ACE_HAS_POSIX_TIME
#define ACE_HAS_CLOCK_GETTIME 1
@@ -73,7 +72,6 @@
#define ACE_DEFAULT_BASE_ADDR ((char *) 0x8000000)
#define ACE_HAS_NONCONST_SELECT_TIMEVAL
#define ACE_HAS_SVR4_DYNAMIC_LINKING
-//#define ACE_HAS_SYSV_IPC
#define ACE_HAS_VOIDPTR_MMAP
#define ACE_HAS_CPLUSPLUS_HEADERS
#define ACE_HAS_POLL
diff --git a/ACE/ace/config-freebsd.h b/ACE/ace/config-freebsd.h
index b5a156d8bdd..6c85b1784ce 100644
--- a/ACE/ace/config-freebsd.h
+++ b/ACE/ace/config-freebsd.h
@@ -160,7 +160,6 @@ enum schedparam_policy {
#if (__FreeBSD_version < 501000)
# define ACE_LACKS_STDINT_H
-# define ACE_LACKS_PWD_REENTRANT_FUNCTIONS
#endif
#if (__FreeBSD_version >= 501000)
diff --git a/ACE/ace/config-hpux-11.00.h b/ACE/ace/config-hpux-11.00.h
index f8a6166c094..eabd4a4bb20 100644
--- a/ACE/ace/config-hpux-11.00.h
+++ b/ACE/ace/config-hpux-11.00.h
@@ -205,9 +205,6 @@
// Compiler/platform supports poll().
#define ACE_HAS_POLL
-/* Platform supports POSIX getpwnam_r() function */
-#define ACE_HAS_POSIX_GETPWNAM_R 1
-
// Platform supports POSIX O_NONBLOCK semantics.
#define ACE_HAS_POSIX_NONBLOCK
diff --git a/ACE/ace/config-kfreebsd.h b/ACE/ace/config-kfreebsd.h
index ffb0ce436f3..59d02857d96 100644
--- a/ACE/ace/config-kfreebsd.h
+++ b/ACE/ace/config-kfreebsd.h
@@ -153,9 +153,6 @@
/* Platform contains <poll.h> */
#define ACE_HAS_POLL 1
-/* Platform supports POSIX getpwnam_r() function */
-#define ACE_HAS_POSIX_GETPWNAM_R 1
-
/* Platform supports POSIX O_NONBLOCK semantics */
#define ACE_HAS_POSIX_NONBLOCK 1
diff --git a/ACE/ace/config-linux.h b/ACE/ace/config-linux.h
index b29b896b9e1..fcc2d124133 100644
--- a/ACE/ace/config-linux.h
+++ b/ACE/ace/config-linux.h
@@ -26,7 +26,6 @@
#define ACE_HAS_THREAD_SPECIFIC_STORAGE
#define ACE_HAS_RECURSIVE_THR_EXIT_SEMANTICS
#define ACE_HAS_2_PARAM_ASCTIME_R_AND_CTIME_R
-#define ACE_HAS_POSIX_GETPWNAM_R
#define ACE_HAS_REENTRANT_FUNCTIONS
#include /**/ "ace/post.h"
diff --git a/ACE/ace/config-lynxos.h b/ACE/ace/config-lynxos.h
index 0af94f525c1..a28545a4db4 100644
--- a/ACE/ace/config-lynxos.h
+++ b/ACE/ace/config-lynxos.h
@@ -101,7 +101,6 @@
#define ACE_LACKS_MKTEMP_PROTOTYPE
#define ACE_LACKS_NETDB_REENTRANT_FUNCTIONS
#define ACE_LACKS_PUTENV_PROTOTYPE
-#define ACE_LACKS_PWD_REENTRANT_FUNCTIONS /*fixme */
#define ACE_LACKS_REALPATH
#define ACE_LACKS_RLIMIT_NOFILE
#define ACE_LACKS_RWLOCK_T
@@ -169,6 +168,7 @@
#else
// LynxOS 5.0 Removals
# define ACE_HAS_LYNXOS4_SIGNALS
+# define ACE_HAS_NONSTD_GETPWNAM_R
# define ACE_HAS_SEMUN
# define ACE_HAS_STRBUF_T
# define ACE_HAS_SYSV_IPC
diff --git a/ACE/ace/config-netbsd.h b/ACE/ace/config-netbsd.h
index 4f35fc5db32..e4a2fd160c1 100644
--- a/ACE/ace/config-netbsd.h
+++ b/ACE/ace/config-netbsd.h
@@ -103,7 +103,6 @@
#define ACE_LACKS_PRI_T 1
#define ACE_LACKS_PTHREAD_THR_SIGSETMASK 1
#define ACE_LACKS_PTHREAD_YIELD 1
-#define ACE_LACKS_PWD_REENTRANT_FUNCTIONS 1
#define ACE_LACKS_RWLOCKATTR_PSHARED 1
#define ACE_LACKS_RWLOCK_T 1
#define ACE_LACKS_SETSCHED 1
diff --git a/ACE/ace/config-openbsd.h b/ACE/ace/config-openbsd.h
index 5f972e206d4..097c135781c 100644
--- a/ACE/ace/config-openbsd.h
+++ b/ACE/ace/config-openbsd.h
@@ -53,7 +53,6 @@
#define ACE_HAS_NONCONST_SELECT_TIMEVAL
#define ACE_HAS_NONCONST_SWAB
#define ACE_HAS_POLL
-#define ACE_HAS_POSIX_GETPWNAM_R
#define ACE_HAS_POSIX_NONBLOCK
#define ACE_HAS_POSIX_TIME
#define ACE_HAS_PTHREADS_STD
@@ -121,7 +120,6 @@
#define ACE_LACKS_PERFECT_MULTICAST_FILTERING
#define ACE_LACKS_PRI_T
#define ACE_LACKS_PTHREAD_THR_SIGSETMASK
-#define ACE_LACKS_PWD_REENTRANT_FUNCTIONS
#define ACE_LACKS_RAND_REENTRANT_FUNCTIONS
#define ACE_LACKS_RLIMIT_PROTOTYPE
#define ACE_LACKS_RWLOCK_T
diff --git a/ACE/ace/config-openvms.h b/ACE/ace/config-openvms.h
index 61e31f7bcc0..2bd63db5646 100644
--- a/ACE/ace/config-openvms.h
+++ b/ACE/ace/config-openvms.h
@@ -87,7 +87,7 @@
#define ACE_LACKS_SYMLINKS 1
-#define ACE_LACKS_PWD_REENTRANT_FUNCTIONS 1
+#define ACE_HAS_NONSTD_GETPWNAM_R
#define ACE_LACKS_RAND_REENTRANT_FUNCTIONS 1
#define ACE_HAS_P_READ_WRITE
diff --git a/ACE/ace/config-rtems.h b/ACE/ace/config-rtems.h
index f32098da5c6..f1e7a6cbf5a 100644
--- a/ACE/ace/config-rtems.h
+++ b/ACE/ace/config-rtems.h
@@ -76,7 +76,6 @@
# define ACE_HAS_PTHREAD_SCHEDPARAM
# define ACE_LACKS_THREAD_PROCESS_SCOPING
#else
-# define ACE_HAS_POSIX_GETPWNAM_R
# define ACE_HAS_2_PARAM_ASCTIME_R_AND_CTIME_R
#endif
diff --git a/ACE/ace/config-sunos5.5.h b/ACE/ace/config-sunos5.5.h
index 8a827749816..6591a7a8c73 100644
--- a/ACE/ace/config-sunos5.5.h
+++ b/ACE/ace/config-sunos5.5.h
@@ -282,12 +282,6 @@
# define ACE_HAS_CHARPTR_SHMDT
#endif
-// Platform has posix getpwnam_r
-#if (defined (_POSIX_C_SOURCE) && _POSIX_C_SOURCE - 0 >= 199506L) || \
- defined(_POSIX_PTHREAD_SEMANTICS)
-# define ACE_HAS_POSIX_GETPWNAM_R
-#endif /* _POSIX_C_SOURCE || _POSIX_PTHREAD_SEMANTICS */
-
#if !defined (ACE_MT_SAFE) || (ACE_MT_SAFE == 1)
#if defined (_REENTRANT) || \
(defined (_POSIX_C_SOURCE) && (_POSIX_C_SOURCE - 0 >= 199506L)) || \
diff --git a/ACE/ace/config-win32-interix.h b/ACE/ace/config-win32-interix.h
index 2e031bf91fe..030255c4102 100644
--- a/ACE/ace/config-win32-interix.h
+++ b/ACE/ace/config-win32-interix.h
@@ -33,7 +33,6 @@
#define ACE_HAS_NEW_NO_H
#define ACE_HAS_NONCONST_SELECT_TIMEVAL
#define ACE_HAS_POLL
-#define ACE_HAS_POSIX_GETPWNAM_R
#define ACE_HAS_POSIX_NONBLOCK
#define ACE_HAS_POSIX_TIME
#define ACE_HAS_PTHREADS_STD
diff --git a/ACE/tests/OS_Test.cpp b/ACE/tests/OS_Test.cpp
index 700d640b8c9..f77b042d454 100644
--- a/ACE/tests/OS_Test.cpp
+++ b/ACE/tests/OS_Test.cpp
@@ -648,6 +648,35 @@ snprintf_test (void)
}
static int
+getpwnam_r_test (void)
+{
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Testing getpwnam_r\n")));
+
+ int result = 0;
+
+ struct passwd pwd;
+ struct passwd *pwd_ptr;
+ char buf[1024];
+
+ if (ACE_OS::getpwnam_r (getlogin (),
+ &pwd,
+ buf,
+ sizeof (buf),
+ &pwd_ptr) != 0)
+ {
+ result = 1;
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("getpwnam_r() failed\n")));
+ }
+ else
+ {
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT (" User '%s' has uid=%d and gid=%d\n"),
+ pwd_ptr->pw_name, pwd_ptr->pw_uid, pwd_ptr->pw_gid));
+ }
+
+ return result;
+}
+
+static int
ctime_r_test (void)
{
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Testing ctime_r\n")));
@@ -1346,6 +1375,9 @@ run_main (int, ACE_TCHAR *[])
status = result;
#endif /* !ACE_LACKS_VSNPRINTF || ACE_HAS_TRIO */
+ if ((result = getpwnam_r_test ()) != 0)
+ status = result;
+
if ((result = ctime_r_test ()) != 0)
status = result;