Something went wrong. Try again.
Cider Isn't Darwin Emulation, Really
Something went wrong. Try again.
7.1 kB · 262 lines
C
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263/* * Copyright (c) 2000-2005, 2009, 2011, 2015 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * * 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, 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 loginwindowconst CFStringRef kSCConsoleSessionSystemSafeBoot = CFSTR("kCGSSessionSystemSafeBoot"); /* value is CFBoolean */const CFStringRef kSCConsoleSessionLoginwindowSafeLogin = CFSTR("kCGSSessionLoginwindowSafeLogin"); /* value is CFBoolean */
CFStringRefSCDynamicStoreKeyCreateConsoleUser(CFAllocatorRef allocator){ return SCDynamicStoreKeyCreate(allocator, CFSTR("%@/%@/%@"), kSCDynamicStoreDomainState, kSCCompUsers, kSCEntUsersConsoleUser);}
CFStringRefSCDynamicStoreCopyConsoleUser(SCDynamicStoreRef store, uid_t *uid, gid_t *gid){ CFStringRef consoleUser = NULL; CFDictionaryRef dict = NULL; CFStringRef key;
key = SCDynamicStoreKeyCreateConsoleUser(NULL); dict = SCDynamicStoreCopyValue(store, key); CFRelease(key); if (!isA_CFDictionary(dict)) { _SCErrorSet(kSCStatusNoKey); goto done; }
consoleUser = CFDictionaryGetValue(dict, kSCPropUsersConsoleUserName); consoleUser = isA_CFString(consoleUser); if (!consoleUser) { _SCErrorSet(kSCStatusNoKey); goto done; }
CFRetain(consoleUser);
if (uid) { CFNumberRef num; SInt32 val;
num = CFDictionaryGetValue(dict, kSCPropUsersConsoleUserUID); if (isA_CFNumber(num)) { if (CFNumberGetValue(num, kCFNumberSInt32Type, &val)) { *uid = (uid_t)val; } } }
if (gid) { CFNumberRef num; SInt32 val;
num = CFDictionaryGetValue(dict, kSCPropUsersConsoleUserGID); if (isA_CFNumber(num)) { if (CFNumberGetValue(num, kCFNumberSInt32Type, &val)) { *gid = (gid_t)val; } } }
done :
if (dict) CFRelease(dict); return consoleUser;}
CFArrayRefSCDynamicStoreCopyConsoleInformation(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;}
BooleanSCDynamicStoreSetConsoleInformation(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;}
BooleanSCDynamicStoreSetConsoleUser(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) { ok = SCDynamicStoreRemoveValue(store, key); goto done; }
dict = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
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);
ok = SCDynamicStoreSetValue(store, key, dict);
done :
if (dict) CFRelease(dict); if (key) CFRelease(key); return ok;}