#include <SystemConfiguration/SystemConfiguration.h>
#include <SystemConfiguration/SCPrivate.h>
#include <SystemConfiguration/SCValidation.h>
CFStringRef
SCDynamicStoreKeyCreateConsoleUser(CFAllocatorRef allocator)
{
return SCDynamicStoreKeyCreate(allocator,
CFSTR("%@/%@/%@"),
kSCDynamicStoreDomainState,
kSCCompUsers,
kSCEntUsersConsoleUser);
}
CFStringRef
SCDynamicStoreCopyConsoleUser(SCDynamicStoreRef store,
uid_t *uid,
gid_t *gid)
{
CFStringRef consoleUser = NULL;
CFDictionaryRef dict = NULL;
CFStringRef key;
SCDynamicStoreRef mySession = store;
if (!store) {
mySession = SCDynamicStoreCreate(NULL,
CFSTR("SCDynamicStoreCopyConsoleUser"),
NULL,
NULL);
if (!mySession) {
SCLog(_sc_verbose, LOG_INFO, CFSTR("SCDynamicStoreCreate() failed"));
return NULL;
}
}
key = SCDynamicStoreKeyCreateConsoleUser(NULL);
dict = SCDynamicStoreCopyValue(mySession, 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 (!store && mySession) CFRelease(mySession);
if (dict) CFRelease(dict);
return consoleUser;
}
Boolean
SCDynamicStoreSetConsoleUser(SCDynamicStoreRef store,
const char *user,
uid_t uid,
gid_t gid)
{
CFStringRef consoleUser;
CFMutableDictionaryRef dict = NULL;
CFStringRef key = SCDynamicStoreKeyCreateConsoleUser(NULL);
SCDynamicStoreRef mySession = store;
CFNumberRef num;
Boolean ok = TRUE;
if (!store) {
mySession = SCDynamicStoreCreate(NULL,
CFSTR("SCDynamicStoreSetConsoleUser"),
NULL,
NULL);
if (!mySession) {
SCLog(_sc_verbose, LOG_INFO, CFSTR("SCDynamicStoreCreate() failed"));
return FALSE;
}
}
if (user == NULL) {
ok = SCDynamicStoreRemoveValue(mySession, 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(mySession, key, dict);
done :
if (dict) CFRelease(dict);
if (key) CFRelease(key);
if (!store && mySession) CFRelease(mySession);
return ok;
}