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" 31362181Sdim#include "svn_dirent_uri.h" 32251881Speter 33251881Speter/* Get the current user's name from the OS */ 34251881Speterstatic const char * 35251881Speterget_os_username(apr_pool_t *pool) 36251881Speter{ 37251881Speter#if APR_HAS_USER 38251881Speter char *username; 39251881Speter apr_uid_t uid; 40251881Speter apr_gid_t gid; 41251881Speter 42251881Speter if (apr_uid_current(&uid, &gid, pool) == APR_SUCCESS && 43251881Speter apr_uid_name_get(&username, uid, pool) == APR_SUCCESS) 44251881Speter return username; 45251881Speter#endif 46251881Speter 47251881Speter return NULL; 48251881Speter} 49251881Speter 50251881Speter/* Return a UTF8 version of STR, or NULL on error. 51251881Speter Use POOL for any necessary allocation. */ 52251881Speterstatic const char * 53251881Speterutf8_or_nothing(const char *str, apr_pool_t *pool) { 54251881Speter if (str) 55251881Speter { 56251881Speter const char *utf8_str; 57251881Speter svn_error_t *err = svn_utf_cstring_to_utf8(&utf8_str, str, pool); 58251881Speter if (! err) 59251881Speter return utf8_str; 60251881Speter svn_error_clear(err); 61251881Speter } 62251881Speter return NULL; 63251881Speter} 64251881Speter 65251881Speterconst char * 66251881Spetersvn_user_get_name(apr_pool_t *pool) 67251881Speter{ 68251881Speter const char *username = get_os_username(pool); 69251881Speter return utf8_or_nothing(username, pool); 70251881Speter} 71251881Speter 72362181Sdim/* Most of the guts of svn_user_get_homedir(): everything except 73362181Sdim * canonicalizing the path. 74362181Sdim */ 75362181Sdimstatic const char * 76362181Sdimuser_get_homedir(apr_pool_t *pool) 77251881Speter{ 78251881Speter const char *username; 79251881Speter char *homedir; 80251881Speter 81251881Speter if (apr_env_get(&homedir, "HOME", pool) == APR_SUCCESS) 82251881Speter return utf8_or_nothing(homedir, pool); 83251881Speter 84251881Speter username = get_os_username(pool); 85251881Speter if (username != NULL && 86251881Speter apr_uid_homepath_get(&homedir, username, pool) == APR_SUCCESS) 87251881Speter return utf8_or_nothing(homedir, pool); 88251881Speter 89251881Speter return NULL; 90251881Speter} 91362181Sdim 92362181Sdimconst char * 93362181Sdimsvn_user_get_homedir(apr_pool_t *pool) 94362181Sdim{ 95362181Sdim const char *homedir = user_get_homedir(pool); 96362181Sdim 97362181Sdim if (homedir) 98362181Sdim return svn_dirent_canonicalize(homedir, pool); 99362181Sdim 100362181Sdim return NULL; 101362181Sdim} 102