1251881Speter/* 2251881Speter * user.c: APR wrapper functions for Subversion 3251881Speter * 4251881Speter * ==================================================================== 5251881Speter * Licensed to the Apache Software Foundation (ASF) under one 6251881Speter * or more contributor license agreements. See the NOTICE file 7251881Speter * distributed with this work for additional information 8251881Speter * regarding copyright ownership. The ASF licenses this file 9251881Speter * to you under the Apache License, Version 2.0 (the 10251881Speter * "License"); you may not use this file except in compliance 11251881Speter * with the License. You may obtain a copy of the License at 12251881Speter * 13251881Speter * http://www.apache.org/licenses/LICENSE-2.0 14251881Speter * 15251881Speter * Unless required by applicable law or agreed to in writing, 16251881Speter * software distributed under the License is distributed on an 17251881Speter * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 18251881Speter * KIND, either express or implied. See the License for the 19251881Speter * specific language governing permissions and limitations 20251881Speter * under the License. 21251881Speter * ==================================================================== 22251881Speter */ 23251881Speter 24251881Speter 25251881Speter#include <apr_pools.h> 26251881Speter#include <apr_user.h> 27251881Speter#include <apr_env.h> 28251881Speter 29251881Speter#include "svn_user.h" 30251881Speter#include "svn_utf.h" 31251881Speter 32251881Speter/* Get the current user's name from the OS */ 33251881Speterstatic const char * 34251881Speterget_os_username(apr_pool_t *pool) 35251881Speter{ 36251881Speter#if APR_HAS_USER 37251881Speter char *username; 38251881Speter apr_uid_t uid; 39251881Speter apr_gid_t gid; 40251881Speter 41251881Speter if (apr_uid_current(&uid, &gid, pool) == APR_SUCCESS && 42251881Speter apr_uid_name_get(&username, uid, pool) == APR_SUCCESS) 43251881Speter return username; 44251881Speter#endif 45251881Speter 46251881Speter return NULL; 47251881Speter} 48251881Speter 49251881Speter/* Return a UTF8 version of STR, or NULL on error. 50251881Speter Use POOL for any necessary allocation. */ 51251881Speterstatic const char * 52251881Speterutf8_or_nothing(const char *str, apr_pool_t *pool) { 53251881Speter if (str) 54251881Speter { 55251881Speter const char *utf8_str; 56251881Speter svn_error_t *err = svn_utf_cstring_to_utf8(&utf8_str, str, pool); 57251881Speter if (! err) 58251881Speter return utf8_str; 59251881Speter svn_error_clear(err); 60251881Speter } 61251881Speter return NULL; 62251881Speter} 63251881Speter 64251881Speterconst char * 65251881Spetersvn_user_get_name(apr_pool_t *pool) 66251881Speter{ 67251881Speter const char *username = get_os_username(pool); 68251881Speter return utf8_or_nothing(username, pool); 69251881Speter} 70251881Speter 71251881Speterconst char * 72251881Spetersvn_user_get_homedir(apr_pool_t *pool) 73251881Speter{ 74251881Speter const char *username; 75251881Speter char *homedir; 76251881Speter 77251881Speter if (apr_env_get(&homedir, "HOME", pool) == APR_SUCCESS) 78251881Speter return utf8_or_nothing(homedir, pool); 79251881Speter 80251881Speter username = get_os_username(pool); 81251881Speter if (username != NULL && 82251881Speter apr_uid_homepath_get(&homedir, username, pool) == APR_SUCCESS) 83251881Speter return utf8_or_nothing(homedir, pool); 84251881Speter 85251881Speter return NULL; 86251881Speter} 87