diff --git a/CoreFoundation/Base.subproj/CFPlatform.c b/CoreFoundation/Base.subproj/CFPlatform.c index 9b74d07e82..52363ea6c2 100644 --- a/CoreFoundation/Base.subproj/CFPlatform.c +++ b/CoreFoundation/Base.subproj/CFPlatform.c @@ -284,8 +284,29 @@ CF_EXPORT CFStringRef CFCopyUserName(void) { #else #error Dont know how to compute user name on this platform #endif - if (!result) + if (!result) { result = (CFStringRef)CFRetain(CFSTR("")); + } + + return result; +} + +CF_EXPORT CFStringRef CFCopyFullUserName(void) { + CFStringRef result = NULL; +#if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED || DEPLOYMENT_TARGET_EMBEDDED_MINI || DEPLOYMENT_TARGET_LINUX || DEPLOYMENT_TARGET_FREEBSD + uid_t euid; + __CFGetUGIDs(&euid, NULL); + struct passwd *upwd = getpwuid(euid ? euid : getuid()); + if (upwd && upwd->pw_gecos) { + result = CFStringCreateWithCString(kCFAllocatorSystemDefault, upwd->pw_gecos, kCFPlatformInterfaceStringEncoding); + } +#else +#error Don't know how to compute full user name on this platform +#endif + if (!result) { + result = (CFStringRef)CFRetain(CFSTR("")); + } + return result; } diff --git a/CoreFoundation/Base.subproj/CFPriv.h b/CoreFoundation/Base.subproj/CFPriv.h index 60c02a9863..bec593c338 100644 --- a/CoreFoundation/Base.subproj/CFPriv.h +++ b/CoreFoundation/Base.subproj/CFPriv.h @@ -159,6 +159,9 @@ CFStringRef CFGetUserName(void); CF_EXPORT CFStringRef CFCopyUserName(void); +CF_EXPORT +CFStringRef CFCopyFullUserName(void); + CF_EXPORT CFURLRef CFCopyHomeDirectoryURLForUser(CFStringRef uName); /* Pass NULL for the current user's home directory */ diff --git a/Foundation/FileManager.swift b/Foundation/FileManager.swift index 1e4f046b4c..ce6b43a52f 100644 --- a/Foundation/FileManager.swift +++ b/Foundation/FileManager.swift @@ -746,7 +746,7 @@ extension FileManager { extension FileManager { open var homeDirectoryForCurrentUser: URL { - return homeDirectory(forUser: CFCopyUserName().takeRetainedValue()._swiftObject)! + return homeDirectory(forUser: NSUserName())! } open var temporaryDirectory: URL { diff --git a/Foundation/NSPathUtilities.swift b/Foundation/NSPathUtilities.swift index 36632b404b..92808ada55 100755 --- a/Foundation/NSPathUtilities.swift +++ b/Foundation/NSPathUtilities.swift @@ -588,6 +588,11 @@ public func NSUserName() -> String { return userName._swiftObject } +public func NSFullUserName() -> String { + let userName = CFCopyFullUserName().takeRetainedValue() + return userName._swiftObject +} + internal func _NSCreateTemporaryFile(_ filePath: String) throws -> (Int32, String) { let template = "." + filePath + ".tmp.XXXXXX" let maxLength = Int(PATH_MAX) + 1 diff --git a/Foundation/ProcessInfo.swift b/Foundation/ProcessInfo.swift index f7e5dcac8f..af3f9aac15 100644 --- a/Foundation/ProcessInfo.swift +++ b/Foundation/ProcessInfo.swift @@ -140,4 +140,12 @@ open class ProcessInfo: NSObject { open var systemUptime: TimeInterval { return CFGetSystemUptime() } + + open var userName: String { + return NSUserName() + } + + open var fullUserName: String { + return NSFullUserName() + } }