#include <CoreFoundation/CoreFoundation.h>
#include <Kerberos/Kerberos.h>
#include <unistd.h>
#include <pwd.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
const char *program = NULL;
static int usage (void);
static void printiferr (errcode_t err, const char *format, ...);
static void printerr (const char *format, ...);
static void vprinterr (const char *format, va_list args);
int main (int argc, char * const * argv)
{
int err = 0;
KLStatus klErr = klNoErr;
KLPrincipal principal = NULL;
program = strrchr (argv[0], '/') ? strrchr (argv[0], '/') + 1 : argv[0];
if (argc > 2) {
printerr ("Unknown option '%s'\n", argv[2]);
return usage ();
}
if (!err && (argc > 1)) {
err = KLCreatePrincipalFromString (argv[1], kerberosVersion_V5, &principal);
printiferr (err, "while creating principal '%s'", argv[1]);
}
if (!err && (principal == NULL)) {
KLBoolean found = false;
KLPrincipal foundPrincipal;
KLStatus terr = KLCacheHasValidTickets (NULL, kerberosVersion_Any, &found, &foundPrincipal, NULL);
if (!terr && found) { principal = foundPrincipal; }
}
if (!err && (principal == NULL)) {
struct passwd *pw;
if ((pw = getpwuid (getuid ())) != NULL) {
char *username = malloc (strlen (pw->pw_name) + 1);
if (username == NULL) { err = ENOMEM; }
if (!err) {
strcpy (username, pw->pw_name);
err = KLCreatePrincipalFromString (username, kerberosVersion_V5, &principal);
}
printiferr (err, "while creating principal for current user");
if (username != NULL) { free (username); }
}
}
if (!err) {
err = KLChangePassword (principal);
printiferr (err, "while changing password");
}
if (principal != NULL) { KLDisposePrincipal (principal); }
return err ? 1 : 0;
}
static int usage (void)
{
fprintf (stderr, "Usage: %s principal\n", program);
return 2;
}
static void printiferr (errcode_t err, const char *format, ...)
{
if (err && (err != ccIteratorEnd) && (err != KRB5_CC_END)) {
va_list pvar;
va_start (pvar, format);
com_err_va (program, err, format, pvar);
va_end (pvar);
}
}
static void printerr (const char *format, ...)
{
va_list pvar;
va_start (pvar, format);
vprinterr (format, pvar);
va_end (pvar);
}
static void vprinterr (const char *format, va_list args)
{
fprintf (stderr, "%s: ", program);
vfprintf (stderr, format, args);
}