From fe56c09a7feeb2d1c9cd699fda07e145c4c354a2 Mon Sep 17 00:00:00 2001 From: Russ Allbery Date: Fri, 5 Oct 2007 01:24:06 +0000 Subject: Pull keytab handling in the client into a separate file for later expansion. Use the fine-grained remctl API instead of the simple one since in some cases we'll be running multiple commands. --- client/keytab.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 client/keytab.c (limited to 'client/keytab.c') diff --git a/client/keytab.c b/client/keytab.c new file mode 100644 index 0000000..3450766 --- /dev/null +++ b/client/keytab.c @@ -0,0 +1,74 @@ +/* $Id$ +** +** Implementation of keytab handling for the wallet client. +** +** Written by Russ Allbery +** Copyright 2007 Board of Trustees, Leland Stanford Jr. University +** +** See README for licensing terms. +*/ + +#include +#include + +#include + +#include +#include + +/* +** Given a remctl object, the name of a keytab object, and a file name, call +** the correct wallet commands to download a keytab and write it to that +** file. +*/ +void +get_keytab(struct remctl *r, const char *type, const char *name, + const char *file) +{ + const char *command[5]; + struct remctl_output *output; + char *data = NULL; + size_t length = 0; + int status = 255; + + /* Run the command on the wallet server */ + command[0] = type; + command[1] = "get"; + command[2] = "keytab"; + command[3] = name; + command[4] = NULL; + if (!remctl_command(r, command)) + die("%s", remctl_error(r)); + + /* Retrieve the results. */ + do { + output = remctl_output(r); + switch (output->type) { + case REMCTL_OUT_OUTPUT: + if (output->stream == 1) { + data = xrealloc(data, length + output->length); + memcpy(data + length, output->data, output->length); + length += output->length; + } else { + fprintf(stderr, "wallet: "); + fwrite(output->data, 1, output->length, stderr); + } + break; + case REMCTL_OUT_STATUS: + status = output->status; + break; + case REMCTL_OUT_ERROR: + fprintf(stderr, "wallet: "); + fwrite(output->data, 1, output->length, stderr); + fputc('\n', stderr); + exit(255); + case REMCTL_OUT_DONE: + break; + } + } while (output->type != REMCTL_OUT_DONE); + if (status != 0) + exit(status); + + /* Okay, we now have the valid keytab data in data. Write it out. */ + write_file(file, data, length); +} -- cgit v1.2.3