]> git.saurik.com Git - apple/configd.git/blobdiff - SystemConfiguration.fproj/SCDConsoleUser.c
configd-1061.40.2.tar.gz
[apple/configd.git] / SystemConfiguration.fproj / SCDConsoleUser.c
index 1eb518a44d707a30f63ffeb3d7f7b8d91b57aadf..35a2cc5bfa2f2ad574e2bf9bb3cc5c34fb094319 100644 (file)
@@ -1,28 +1,32 @@
 /*
 /*
- * 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@
  *
  * @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,
  * 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
  *
  * @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
  *
  * June 1, 2001                        Allan Nathanson <ajn@apple.com>
  * - public API conversion
  *
 #include <SystemConfiguration/SCValidation.h>
 #include <SystemConfiguration/SCPrivate.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
 SCDynamicStoreKeyCreateConsoleUser(CFAllocatorRef allocator)
 {
 CFStringRef
 SCDynamicStoreKeyCreateConsoleUser(CFAllocatorRef allocator)
 {
@@ -53,19 +86,6 @@ SCDynamicStoreCopyConsoleUser(SCDynamicStoreRef      store,
        CFStringRef             consoleUser     = NULL;
        CFDictionaryRef         dict            = NULL;
        CFStringRef             key;
        CFStringRef             consoleUser     = NULL;
        CFDictionaryRef         dict            = NULL;
        CFStringRef             key;
-       Boolean                 tempSession     = FALSE;
-
-       if (!store) {
-               store = SCDynamicStoreCreate(NULL,
-                                            CFSTR("SCDynamicStoreCopyConsoleUser"),
-                                            NULL,
-                                            NULL);
-               if (!store) {
-                       SCLog(_sc_verbose, LOG_INFO, CFSTR("SCDynamicStoreCreate() failed"));
-                       return NULL;
-               }
-               tempSession = TRUE;
-       }
 
        key  = SCDynamicStoreKeyCreateConsoleUser(NULL);
        dict = SCDynamicStoreCopyValue(store, key);
 
        key  = SCDynamicStoreKeyCreateConsoleUser(NULL);
        dict = SCDynamicStoreCopyValue(store, key);
@@ -110,10 +130,91 @@ SCDynamicStoreCopyConsoleUser(SCDynamicStoreRef   store,
 
     done :
 
 
     done :
 
-       if (tempSession)        CFRelease(store);
        if (dict)               CFRelease(dict);
        return consoleUser;
        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;
+}
+
+
+Boolean
+SCDynamicStoreSetConsoleInformation(SCDynamicStoreRef  store,
+                                   const char          *user,
+                                   uid_t               uid,
+                                   gid_t               gid,
+                                   CFArrayRef          sessions)
+{
+       CFStringRef             consoleUser;
+       CFMutableDictionaryRef  dict            = NULL;
+       CFStringRef             key             = SCDynamicStoreKeyCreateConsoleUser(NULL);
+       Boolean                 ok              = FALSE;
+
+       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;
 }
 
 
 }
 
 
@@ -127,20 +228,7 @@ SCDynamicStoreSetConsoleUser(SCDynamicStoreRef     store,
        CFMutableDictionaryRef  dict            = NULL;
        CFStringRef             key             = SCDynamicStoreKeyCreateConsoleUser(NULL);
        CFNumberRef             num;
        CFMutableDictionaryRef  dict            = NULL;
        CFStringRef             key             = SCDynamicStoreKeyCreateConsoleUser(NULL);
        CFNumberRef             num;
-       Boolean                 ok              = TRUE;
-       Boolean                 tempSession     = FALSE;
-
-       if (!store) {
-               store = SCDynamicStoreCreate(NULL,
-                                            CFSTR("SCDynamicStoreSetConsoleUser"),
-                                            NULL,
-                                            NULL);
-               if (!store) {
-                       SCLog(_sc_verbose, LOG_INFO, CFSTR("SCDynamicStoreCreate() failed"));
-                       return FALSE;
-               }
-               tempSession = TRUE;
-       }
+       Boolean                 ok              = FALSE;
 
        if (user == NULL) {
                ok = SCDynamicStoreRemoveValue(store, key);
 
        if (user == NULL) {
                ok = SCDynamicStoreRemoveValue(store, key);
@@ -170,6 +258,5 @@ SCDynamicStoreSetConsoleUser(SCDynamicStoreRef      store,
 
        if (dict)               CFRelease(dict);
        if (key)                CFRelease(key);
 
        if (dict)               CFRelease(dict);
        if (key)                CFRelease(key);
-       if (tempSession)        CFRelease(store);
        return ok;
 }
        return ok;
 }