		/* Copyright 2000-2004 The Apache Software Foundation
		 *
		 * Licensed under the Apache License, Version 2.0 (the "License");
		 * you may not use this file except in compliance with the License.
		 * You may obtain a copy of the License at
		 *
		 *     http://www.apache.org/licenses/LICENSE-2.0
		 *
		 * Unless required by applicable law or agreed to in writing, software
		 * distributed under the License is distributed on an "AS IS" BASIS,
		 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
		 * See the License for the specific language governing permissions and
		 * limitations under the License.
		 */
		
		#include "apr_strings.h"
		#include "apr_portable.h"
		#include "apr_user.h"
		#include "apr_private.h"
		#ifdef HAVE_PWD_H
		#include <pwd.h>
		#endif
		#if APR_HAVE_SYS_TYPES_H
		#include <sys/types.h>
		#endif
		#if APR_HAVE_UNISTD_H
		#include <unistd.h> /* for _POSIX_THREAD_SAFE_FUNCTIONS */
		#endif
		#define APR_WANT_MEMFUNC
		#include "apr_want.h"
		
		#define PWBUF_SIZE 512
		
		static apr_status_t getpwnam_safe(const char *username,
		                                  struct passwd *pw,
		                                  char pwbuf[PWBUF_SIZE])
           1    {
           1        struct passwd *pwptr;
		#if APR_HAS_THREADS && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETPWNAM_R)
		    /* IRIX getpwnam_r() returns 0 and sets pwptr to NULL on failure */
           1        if (!getpwnam_r(username, pw, pwbuf, PWBUF_SIZE, &pwptr) && pwptr) {
		        /* nothing extra to do on success */
		#else
		    if ((pwptr = getpwnam(username)) != NULL) {
		        memcpy(pw, pwptr, sizeof *pw);
		#endif
		    }
		    else {
      ######            if (errno == 0) {
		            /* this can happen with getpwnam() on FreeBSD 4.3 */
      ######                return APR_EGENERAL;
		        }
      ######            return errno;
		    }
           1        return APR_SUCCESS;
		}
		
		APR_DECLARE(apr_status_t) apr_uid_homepath_get(char **dirname,
		                                               const char *username,
		                                               apr_pool_t *p)
      ######    {
      ######        struct passwd pw;
      ######        char pwbuf[PWBUF_SIZE];
      ######        apr_status_t rv;
		
      ######        if ((rv = getpwnam_safe(username, &pw, pwbuf)) != APR_SUCCESS)
      ######            return rv;
		
		#ifdef OS2
		    /* Need to manually add user name for OS/2 */
		    *dirname = apr_pstrcat(p, pw.pw_dir, pw.pw_name, NULL);
		#else
      ######        *dirname = apr_pstrdup(p, pw.pw_dir);
		#endif
      ######        return APR_SUCCESS;
		}
		
		
		
		APR_DECLARE(apr_status_t) apr_uid_current(apr_uid_t *uid,
		                                          apr_gid_t *gid,
		                                          apr_pool_t *p)
           4    {
           4        *uid = getuid();
           4        *gid = getgid();
		  
           4        return APR_SUCCESS;
		}
		
		
		
		
		APR_DECLARE(apr_status_t) apr_uid_get(apr_uid_t *uid, apr_gid_t *gid,
		                                      const char *username, apr_pool_t *p)
           1    {
           1        struct passwd pw;
           1        char pwbuf[PWBUF_SIZE];
           1        apr_status_t rv;
		        
           1        if ((rv = getpwnam_safe(username, &pw, pwbuf)) != APR_SUCCESS)
      ######            return rv;
		
           1        *uid = pw.pw_uid;
           1        *gid = pw.pw_gid;
		
           1        return APR_SUCCESS;
		}
		
		APR_DECLARE(apr_status_t) apr_uid_name_get(char **username, apr_uid_t userid,
		                                           apr_pool_t *p)
           1    {
           1        struct passwd *pw;
		#if APR_HAS_THREADS && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETPWUID_R)
           1        struct passwd pwd;
           1        char pwbuf[PWBUF_SIZE];
		
           1        if (getpwuid_r(userid, &pwd, pwbuf, sizeof(pwbuf), &pw)) {
		#else
		    if ((pw = getpwuid(userid)) == NULL) {
		#endif
      ######            return errno;
		    }
           1        *username = apr_pstrdup(p, pw->pw_name);
           1        return APR_SUCCESS;
		}
