dnl Copyright (C) 1999-2005 Open Source Telecom Corporation.
dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks.
dnl
dnl This program is free software; you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by
dnl the Free Software Foundation; either version 2 of the License, or
dnl (at your option) any later version.
dnl
dnl This program is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
dnl GNU General Public License for more details.
dnl
dnl You should have received a copy of the GNU General Public License
dnl along with this program; if not, write to the Free Software
dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
dnl
dnl As a special exception to the GNU General Public License, if you
dnl distribute this file as part of a program that contains a configuration
dnl script generated by Autoconf, you may include it under the same
dnl distribution terms that you use for the rest of that program.

AC_DEFUN([OST_LIB_REENTRANT],[
    reentrant_lib=${ost_cv_thread_library}
    if test -z "$reentrant_lib" ; then
        reentrant_lib=c_r
    fi
    if test "c" = "$reentrant_lib" ; then
        reentrant_lib=c_r
    fi
    if test "none" = "$reentrant_lib" ; then
        reentrant_lib=c_r
    fi

    AC_CHECK_FUNCS(setenv)
    AC_CHECK_LIB($reentrant_lib, localtime_r,[
        AC_DEFINE(HAVE_STRTOK_R, [1], [reentrant strtok])
        AC_DEFINE(HAVE_LOCALTIME_R, [1], [reentrant localtime])],[
        AC_CHECK_LIB(c, strtok_r, AC_DEFINE(HAVE_STRTOK_R))
        AC_CHECK_LIB(c, localtime_r, AC_DEFINE(HAVE_LOCALTIME_R))
    ])
        AC_CHECK_LIB($reentrant_lib, readdir_r,[
            AC_DEFINE(HAVE_READDIR_R, [1], [reentrant readdir])],[
            AC_CHECK_LIB(c, readdir_r, AC_DEFINE(HAVE_READDIR_R, [1]))
    ])
    AC_CHECK_LIB($reentrant_lib, strerror_r,[
        AC_DEFINE(HAVE_STRERROR_R, [1], [reentrant strerror])],[
        AC_CHECK_LIB(c, strerror_r, AC_DEFINE(HAVE_STRERROR_R, [1]))
    ])
    AC_CHECK_LIB($reentrant_lib, getpwuid_r,[
        AC_DEFINE(HAVE_GETPWUID_R, [1], [reentrant getuid])
        AC_DEFINE(HAVE_GETPWNAM_R, [1], [reentrant getnam])],[
        AC_CHECK_LIB(c, getpwuid_r, AC_DEFINE(HAVE_GETPWUID_R))
        AC_CHECK_LIB(c, getpwnam_r, AC_DEFINE(HAVE_GETPWNAM_R))
    ])
    AC_CHECK_LIB($reentrant_lib, getgrnam_r,[
        AC_DEFINE(HAVE_GETGRNAM_R, [1], [reentrant getgrnam])],[
        AC_CHECK_LIB(c, getgrnam_r, AC_DEFINE(HAVE_GETGRNAM_R))
    ])
    AH_BOTTOM([

#ifndef HAVE_STRERROR_R
#define strerror_r(e, b, l) b = ::strerror(e)
#endif

#ifndef HAVE_GETPWUID_R
#define getpwuid_r(uid, rec, buf, size, ptr) ptr = ::getpwuid(uid)
#define getpwnam_r(name, rec, buf, size, ptr) ptr = ::getpwnam(name)
#endif

    ])
])

