summaryrefslogtreecommitdiff
path: root/client/wallet.c
diff options
context:
space:
mode:
Diffstat (limited to 'client/wallet.c')
-rw-r--r--client/wallet.c118
1 files changed, 118 insertions, 0 deletions
diff --git a/client/wallet.c b/client/wallet.c
new file mode 100644
index 0000000..6106651
--- /dev/null
+++ b/client/wallet.c
@@ -0,0 +1,118 @@
+/* $Id$
+**
+** The client program for the wallet system.
+**
+** Written by Russ Allbery <rra@stanford.edu>
+** Copyright 2006 Board of Trustees, Leland Stanford Jr. University
+**
+** See README for licensing terms.
+*/
+
+#include <config.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <remctl.h>
+
+/* Temporary until we have some real configuration. */
+#ifndef SERVER
+# define SERVER "wallet.stanford.edu"
+#endif
+#ifndef PORT
+# define PORT 4444
+#endif
+
+/* Usage message. */
+static const char usage_message[] = "\
+Usage: wallet (get|show) keytab <name>\n\
+\n\
+Options:\n\
+ -h Display this help\n\
+ -v Display the version of remctl\n";
+
+
+/*
+** Display the usage message for remctl.
+*/
+static void
+usage(int status)
+{
+ fprintf((status == 0) ? stdout : stderr, "%s", usage_message);
+ exit(status);
+}
+
+
+/*
+** Main routine. Parse the arguments and then perform the desired
+** operation.
+*/
+int
+main(int argc, char *argv[])
+{
+ int option, fd;
+ ssize_t status;
+ const char *command[3];
+ struct remctl_result *result;
+
+ while ((option = getopt(argc, argv, "hv")) != EOF) {
+ switch (option) {
+ case 'h':
+ usage(0);
+ break;
+ case 'v':
+ printf("%s\n", PACKAGE_STRING);
+ exit(0);
+ break;
+ default:
+ usage(1);
+ break;
+ }
+ }
+ argc -= optind;
+ argv += optind;
+ if (argc != 3)
+ usage(1);
+ if (strcmp(argv[1], "keytab") != 0)
+ usage(1);
+
+ /* Perform the desired operation based on the first argument. */
+ if (strcmp(argv[0], "get") == 0) {
+ command[0] = "get";
+ } else if (strcmp(argv[0], "show") == 0) {
+ command[0] = "show";
+ }
+ command[1] = "keytab";
+ command[2] = argv[2];
+ result = remctl(SERVER, PORT, NULL, command);
+
+ /* Display the results. */
+ if (result->error != NULL) {
+ fprintf(stderr, "%s\n", result->error);
+ } else if (result->stderr_len > 0) {
+ fwrite(result->stderr_buf, 1, result->stderr_len, stderr);
+ } else {
+ fd = open("keytab", O_WRONLY | O_CREAT | O_TRUNC, 0600);
+ if (fd < 0) {
+ fprintf(stderr, "open of keytab failed: %s", strerror(errno));
+ exit(1);
+ }
+ status = write(fd, result->stdout_buf, result->stdout_len);
+ if (status < 0) {
+ fprintf(stderr, "write to keytab failed: %s", strerror(errno));
+ exit(1);
+ } else if (status != result->stdout_len) {
+ fprintf(stderr, "write to keytab truncated");
+ exit(1);
+ }
+ if (close(fd) < 0) {
+ fprintf(stderr, "close of keytab failed: %s", strerror(errno));
+ exit(1);
+ }
+ }
+ exit(result->status);
+}