#include "keychain_lock.h"
#include "keychain_utilities.h"
#include "readline_cssm.h"
#include "security_tool.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <Security/SecKeychain.h>
static int
do_lock_all(void)
{
OSStatus result = SecKeychainLockAll();
if (result)
sec_perror("SecKeychainLockAll", result);
return result;
}
static int
do_lock(const char *keychainName)
{
SecKeychainRef keychain = NULL;
OSStatus result;
if (keychainName)
{
keychain = keychain_open(keychainName);
if (!keychain)
{
result = 1;
goto loser;
}
}
result = SecKeychainLock(keychain);
if (result)
{
sec_error("SecKeychainLock %s: %s", keychainName ? keychainName : "<NULL>", sec_errstr(result));
}
loser:
if (keychain)
CFRelease(keychain);
return result;
}
int
keychain_lock(int argc, char * const *argv)
{
char *keychainName = NULL;
int ch, result = 0;
Boolean lockAll = FALSE;
while ((ch = getopt(argc, argv, "ah")) != -1)
{
switch (ch)
{
case 'a':
lockAll = TRUE;
break;
case '?':
default:
return SHOW_USAGE_MESSAGE;
}
}
argc -= optind;
argv += optind;
if (argc == 1 && !lockAll)
{
keychainName = argv[0];
if (*keychainName == '\0')
{
result = 2;
goto loser;
}
}
else if (argc != 0)
return SHOW_USAGE_MESSAGE;
if (lockAll)
result = do_lock_all();
else
result = do_lock(keychainName);
loser:
return result;
}