#include <CoreFoundation/CoreFoundation.h>
#include <Kerberos/Kerberos.h>
#include <Kerberos/kim.h>
#include <unistd.h>
#include <pwd.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
static int usage (void)
{
fprintf (stderr, "Usage: %s principal\n", getprogname ());
return 2;
}
static void vprinterr (const char *format, va_list args)
{
fprintf (stderr, "%s: ", getprogname ());
vfprintf (stderr, format, args);
}
static void printerr (const char *format, ...)
{
va_list pvar;
va_start (pvar, format);
vprinterr (format, pvar);
va_end (pvar);
}
static void printiferr (kim_error in_error, const char *in_format, ...)
{
if (in_error && in_error != KIM_USER_CANCELED_ERR) {
kim_string message = NULL;
kim_error err = KIM_NO_ERROR;
va_list pvar;
va_start (pvar, in_format);
vprinterr (in_format, pvar);
va_end (pvar);
err = kim_string_create_for_last_error (&message, in_error);
if (!err) {
fprintf (stderr, ": %s\n", message);
} else {
fprintf (stderr, ".\n");
}
kim_string_free (&message);
}
}
int main (int argc, char * const * argv)
{
kim_error err = KIM_NO_ERROR;
kim_identity identity = NULL;
setprogname (argv[0]);
if (argc > 2) {
printerr ("Unknown option '%s'\n", argv[2]);
return usage ();
}
if (!err && (argc > 1)) {
err = kim_identity_create_from_string (&identity, argv[1]);
printiferr (err, "Unable to create principal for '%s'", argv[1]);
}
if (!err && !identity) {
kim_ccache ccache = NULL;
err = kim_ccache_create_from_default (&ccache);
printiferr (err, "Unable to open the default ccache");
if (!err) {
err = kim_ccache_get_client_identity (ccache, &identity);
if (err) {
identity = NULL;
err = KIM_NO_ERROR;
}
}
}
if (!err && !identity) {
struct passwd *pw = getpwuid (getuid ());
if (!pw) {
err = ENOENT;
printiferr (err, "Unable to get current username in password database");
}
if (!err) {
err = kim_identity_create_from_string (&identity, pw->pw_name);
printiferr (err, "Unable to create principal for '%s'",
pw->pw_name);
}
}
if (!err) {
err = kim_identity_change_password (identity);
printiferr (err, "Unable to change password");
}
kim_identity_free (&identity);
return err ? 1 : 0;
}