/*
- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2005, 2009, 2011, 2015 Apple Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
- *
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License"). You may not use this file except in compliance with the
- * License. Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
- *
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ *
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ *
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
- * License for the specific language governing rights and limitations
- * under the License.
- *
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ *
* @APPLE_LICENSE_HEADER_END@
*/
+/*
+ * Modification History
+ *
+ * May 1, 2003 Allan Nathanson <ajn@apple.com>
+ * - add console [session] information SPIs
+ *
+ * June 1, 2001 Allan Nathanson <ajn@apple.com>
+ * - public API conversion
+ *
+ * January 2, 2001 Allan Nathanson <ajn@apple.com>
+ * - initial revision
+ */
+
#include <SystemConfiguration/SystemConfiguration.h>
+#include <SystemConfiguration/SCValidation.h>
+#include <SystemConfiguration/SCPrivate.h>
+
+
+#undef kSCPropUsersConsoleUserName
+#define kSCPropUsersConsoleUserName CFSTR("Name")
+
+#undef kSCPropUsersConsoleUserUID
+#define kSCPropUsersConsoleUserUID CFSTR("UID")
+
+#undef kSCPropUsersConsoleUserGID
+#define kSCPropUsersConsoleUserGID CFSTR("GID")
+
+#undef kSCPropUsersConsoleSessionInfo
+#define kSCPropUsersConsoleSessionInfo CFSTR("SessionInfo")
+
+
+// from CoreGraphics (CGSession.h)
+const CFStringRef kSCConsoleSessionUserName = CFSTR("kCGSSessionUserNameKey"); /* value is CFString */
+const CFStringRef kSCConsoleSessionUID = CFSTR("kCGSSessionUserIDKey"); /* value is CFNumber (a uid_t) */
+const CFStringRef kSCConsoleSessionConsoleSet = CFSTR("kCGSSessionConsoleSetKey"); /* value is CFNumber */
+const CFStringRef kSCConsoleSessionOnConsole = CFSTR("kCGSSessionOnConsoleKey"); /* value is CFBoolean */
+const CFStringRef kSCConsoleSessionLoginDone = CFSTR("kCGSessionLoginDoneKey"); /* value is CFBoolean */
+
+// from CoreGraphics (CGSSession.h)
+const CFStringRef kSCConsoleSessionID = CFSTR("kCGSSessionIDKey"); /* value is CFNumber */
+
+// for loginwindow
+const CFStringRef kSCConsoleSessionSystemSafeBoot = CFSTR("kCGSSessionSystemSafeBoot"); /* value is CFBoolean */
+const CFStringRef kSCConsoleSessionLoginwindowSafeLogin = CFSTR("kCGSSessionLoginwindowSafeLogin"); /* value is CFBoolean */
CFStringRef
-SCDKeyCreateConsoleUser()
+SCDynamicStoreKeyCreateConsoleUser(CFAllocatorRef allocator)
{
- return SCDKeyCreate(CFSTR("%@/%@/%@"),
- CFSTR("state:"), // FIXME!!! (should be kSCCacheDomainState)
- kSCCompUsers,
- kSCEntUsersConsoleUser);
+ return SCDynamicStoreKeyCreate(allocator,
+ CFSTR("%@/%@/%@"),
+ kSCDynamicStoreDomainState,
+ kSCCompUsers,
+ kSCEntUsersConsoleUser);
}
-SCDStatus
-SCDConsoleUserGet(char *user, int userlen, uid_t *uid, gid_t *gid)
+CFStringRef
+SCDynamicStoreCopyConsoleUser(SCDynamicStoreRef store,
+ uid_t *uid,
+ gid_t *gid)
{
- CFDictionaryRef dict;
- SCDHandleRef handle = NULL;
- CFStringRef key;
- SCDSessionRef session = NULL;
- SCDStatus status;
-
- /* get current user */
- status = SCDOpen(&session, CFSTR("SCDConsoleUserGet"));
- if (status != SCD_OK) {
- goto done;
- }
+ CFStringRef consoleUser = NULL;
+ CFDictionaryRef dict = NULL;
+ CFStringRef key;
- key = SCDKeyCreateConsoleUser();
- status = SCDGet(session, key, &handle);
+ key = SCDynamicStoreKeyCreateConsoleUser(NULL);
+ dict = SCDynamicStoreCopyValue(store, key);
CFRelease(key);
- if (status != SCD_OK) {
+ if (!isA_CFDictionary(dict)) {
+ _SCErrorSet(kSCStatusNoKey);
goto done;
}
- dict = SCDHandleGetData(handle);
-
- if (user && (userlen > 0)) {
- CFStringRef consoleUser;
-
- bzero(user, userlen);
- if (CFDictionaryGetValueIfPresent(dict,
- kSCPropUsersConsoleUserName,
- (void **)&consoleUser)) {
- CFIndex len;
- CFRange range;
-
- range = CFRangeMake(0, CFStringGetLength(consoleUser));
- (void)CFStringGetBytes(consoleUser,
- range,
- kCFStringEncodingMacRoman,
- 0,
- FALSE,
- user,
- userlen,
- &len);
- }
+ consoleUser = CFDictionaryGetValue(dict, kSCPropUsersConsoleUserName);
+ consoleUser = isA_CFString(consoleUser);
+ if (!consoleUser) {
+ _SCErrorSet(kSCStatusNoKey);
+ goto done;
}
+ CFRetain(consoleUser);
+
if (uid) {
CFNumberRef num;
SInt32 val;
- if (CFDictionaryGetValueIfPresent(dict,
- kSCPropUsersConsoleUserUID,
- (void **)&num)) {
+ num = CFDictionaryGetValue(dict, kSCPropUsersConsoleUserUID);
+ if (isA_CFNumber(num)) {
if (CFNumberGetValue(num, kCFNumberSInt32Type, &val)) {
*uid = (uid_t)val;
}
CFNumberRef num;
SInt32 val;
- if (CFDictionaryGetValueIfPresent(dict,
- kSCPropUsersConsoleUserGID,
- (void **)&num)) {
+ num = CFDictionaryGetValue(dict, kSCPropUsersConsoleUserGID);
+ if (isA_CFNumber(num)) {
if (CFNumberGetValue(num, kCFNumberSInt32Type, &val)) {
*gid = (gid_t)val;
}
done :
- if (handle) SCDHandleRelease(handle);
- if (session) (void) SCDClose(&session);
- return status;
+ if (dict) CFRelease(dict);
+ return consoleUser;
+}
+
+
+CFArrayRef
+SCDynamicStoreCopyConsoleInformation(SCDynamicStoreRef store)
+{
+ CFDictionaryRef dict = NULL;
+ CFArrayRef info = NULL;
+ CFStringRef key;
+
+ key = SCDynamicStoreKeyCreateConsoleUser(NULL);
+ dict = SCDynamicStoreCopyValue(store, key);
+ CFRelease(key);
+ if (!isA_CFDictionary(dict)) {
+ _SCErrorSet(kSCStatusNoKey);
+ goto done;
+ }
+
+ info = CFDictionaryGetValue(dict, kSCPropUsersConsoleSessionInfo);
+ info = isA_CFArray(info);
+ if (info == NULL) {
+ _SCErrorSet(kSCStatusNoKey);
+ goto done;
+ }
+
+ CFRetain(info);
+
+ done :
+
+ if (dict) CFRelease(dict);
+ return info;
}
-SCDStatus
-SCDConsoleUserSet(const char *user, uid_t uid, gid_t gid)
+Boolean
+SCDynamicStoreSetConsoleInformation(SCDynamicStoreRef store,
+ const char *user,
+ uid_t uid,
+ gid_t gid,
+ CFArrayRef sessions)
{
CFStringRef consoleUser;
- CFMutableDictionaryRef dict = NULL;
- SCDHandleRef handle = NULL;
- CFStringRef key = SCDKeyCreateConsoleUser();
- CFNumberRef num;
- SCDSessionRef session = NULL;
- SCDStatus status;
+ CFMutableDictionaryRef dict = NULL;
+ CFStringRef key = SCDynamicStoreKeyCreateConsoleUser(NULL);
+ Boolean ok = FALSE;
- status = SCDOpen(&session, CFSTR("SCDConsoleUserSet"));
- if (status != SCD_OK) {
+ if ((user == NULL) && (sessions == NULL)) {
+ ok = SCDynamicStoreRemoveValue(store, key);
goto done;
}
+ dict = CFDictionaryCreateMutable(NULL,
+ 0,
+ &kCFTypeDictionaryKeyCallBacks,
+ &kCFTypeDictionaryValueCallBacks);
+
+ if (user != NULL) {
+ CFNumberRef num;
+
+ consoleUser = CFStringCreateWithCString(NULL, user, kCFStringEncodingMacRoman);
+ CFDictionarySetValue(dict, kSCPropUsersConsoleUserName, consoleUser);
+ CFRelease(consoleUser);
+
+ num = CFNumberCreate(NULL, kCFNumberSInt32Type, (SInt32 *)&uid);
+ CFDictionarySetValue(dict, kSCPropUsersConsoleUserUID, num);
+ CFRelease(num);
+
+ num = CFNumberCreate(NULL, kCFNumberSInt32Type, (SInt32 *)&gid);
+ CFDictionarySetValue(dict, kSCPropUsersConsoleUserGID, num);
+ CFRelease(num);
+ }
+
+ if (sessions != NULL) {
+ CFDictionarySetValue(dict, kSCPropUsersConsoleSessionInfo, sessions);
+ }
+
+ ok = SCDynamicStoreSetValue(store, key, dict);
+
+ done :
+
+ if (dict) CFRelease(dict);
+ if (key) CFRelease(key);
+ return ok;
+}
+
+
+Boolean
+SCDynamicStoreSetConsoleUser(SCDynamicStoreRef store,
+ const char *user,
+ uid_t uid,
+ gid_t gid)
+{
+ CFStringRef consoleUser;
+ CFMutableDictionaryRef dict = NULL;
+ CFStringRef key = SCDynamicStoreKeyCreateConsoleUser(NULL);
+ CFNumberRef num;
+ Boolean ok = FALSE;
+
if (user == NULL) {
- (void)SCDRemove(session, key);
+ ok = SCDynamicStoreRemoveValue(store, key);
goto done;
}
CFDictionarySetValue(dict, kSCPropUsersConsoleUserGID, num);
CFRelease(num);
- handle = SCDHandleInit();
- SCDHandleSetData(handle, dict);
-
- status = SCDLock(session);
- if (status != SCD_OK) {
- goto done;
- }
- (void)SCDRemove(session, key);
- (void)SCDAdd (session, key, handle);
- status = SCDUnlock(session);
+ ok = SCDynamicStoreSetValue(store, key, dict);
done :
- if (dict) CFRelease(dict);
- if (handle) SCDHandleRelease(handle);
- if (key) CFRelease(key);
- if (session) (void) SCDClose(&session);
- return status;
+ if (dict) CFRelease(dict);
+ if (key) CFRelease(key);
+ return ok;
}