diff options
| author | Russ Allbery <rra@stanford.edu> | 2007-10-05 02:15:27 +0000 | 
|---|---|---|
| committer | Russ Allbery <rra@stanford.edu> | 2007-10-05 02:15:27 +0000 | 
| commit | f21fba65f194ff26bf72e23f0db311314529720b (patch) | |
| tree | ce454a33292244ad130962ab9da7f667fe57d1ec | |
| parent | fe56c09a7feeb2d1c9cd699fda07e145c4c354a2 (diff) | |
Refactor the remctl calls in the wallet client to share a common routine.
| -rw-r--r-- | Makefile.am | 2 | ||||
| -rw-r--r-- | client/internal.h | 8 | ||||
| -rw-r--r-- | client/keytab.c | 36 | ||||
| -rw-r--r-- | client/remctl.c | 74 | ||||
| -rw-r--r-- | client/wallet.c | 29 | 
5 files changed, 89 insertions, 60 deletions
diff --git a/Makefile.am b/Makefile.am index 600ad83..a9695ef 100644 --- a/Makefile.am +++ b/Makefile.am @@ -28,7 +28,7 @@ bin_PROGRAMS = client/wallet  sbin_PROGRAMS = kasetkey/kasetkey  sbin_SCRIPTS = server/keytab-backend server/wallet-backend  client_wallet_SOURCES = client/file.c client/internal.h client/keytab.c \ -	client/srvtab.c client/wallet.c system.h +	client/remctl.c client/srvtab.c client/wallet.c system.h  client_wallet_CPPFLAGS = @REMCTL_CPPFLAGS@  client_wallet_LDFLAGS = @REMCTL_LDFLAGS@  client_wallet_LDADD = util/libutil.a portable/libportable.a -lremctl -lkrb5 diff --git a/client/internal.h b/client/internal.h index 092240e..960554e 100644 --- a/client/internal.h +++ b/client/internal.h @@ -27,6 +27,14 @@ struct remctl;  BEGIN_DECLS +/* Given a remctl object, run a remctl command.  If data is non-NULL, saves +   the standard output from the command into data with the length in length. +   Otherwise, prints it to standard output.  Either way, prints standard error +   output and errors to standard error and returns the exit status or 255 for +   a remctl internal error. */ +int run_command(struct remctl *, const char **command, char **data, +                size_t *length); +  /* Given a remctl object, the type for the wallet interface, 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. */ diff --git a/client/keytab.c b/client/keytab.c index 3450766..b815e4a 100644 --- a/client/keytab.c +++ b/client/keytab.c @@ -26,49 +26,19 @@ 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); +    status = run_command(r, command, &data, &length);      if (status != 0)          exit(status); - -    /* Okay, we now have the valid keytab data in data.  Write it out. */ +    if (data == NULL) +        die("no data returned by wallet server");      write_file(file, data, length);  } diff --git a/client/remctl.c b/client/remctl.c new file mode 100644 index 0000000..089d7f4 --- /dev/null +++ b/client/remctl.c @@ -0,0 +1,74 @@ +/*  $Id$ +** +**  remctl interface for the wallet client. +** +**  Written by Russ Allbery <rra@stanford.edu> +**  Copyright 2007 Board of Trustees, Leland Stanford Jr. University +** +**  See README for licensing terms. +*/ + +#include <config.h> +#include <system.h> + +#include <remctl.h> + +#include <client/internal.h> +#include <util/util.h> + + +/* +**  Given a remctl connection and a command, run the command. +** +**  If data is non-NULL, save the output in it and return the length in +**  length.  Otherwise, send any output to stdout.  Either way, send error +**  output to stderr, and return the exit status (or 255 if there is an +**  error). +*/ +int +run_command(struct remctl *r, const char **command, char **data, +            size_t *length) +{ +    struct remctl_output *output; +    int status = 255; + +    if (data != NULL) +        *data = NULL; +    if (length != NULL) +        *length = 0; +    if (!remctl_command(r, command)) { +        warn("%s", remctl_error(r)); +        return 255; +    } +    do { +        output = remctl_output(r); +        switch (output->type) { +        case REMCTL_OUT_OUTPUT: +            if (output->stream == 1) { +                if (data != NULL) { +                    *data = xrealloc(*data, *length + output->length); +                    memcpy(*data + *length, output->data, output->length); +                    *length += output->length; +                } else { +                    fwrite(output->data, 1, output->length, stdout); +                } +            } 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); +            status = 255; +            break; +        case REMCTL_OUT_DONE: +            break; +        } +    } while (output->type != REMCTL_OUT_DONE); +    return status; +} diff --git a/client/wallet.c b/client/wallet.c index f0a0e4f..5e23503 100644 --- a/client/wallet.c +++ b/client/wallet.c @@ -51,7 +51,7 @@ usage(int status)  int  main(int argc, char *argv[])  { -    int option, i; +    int option, i, status;      const char **command;      const char *type = "wallet";      const char *server = SERVER; @@ -60,7 +60,6 @@ main(int argc, char *argv[])      const char *file = NULL;      const char *srvtab = NULL;      struct remctl *r; -    struct remctl_output *output;      long tmp;      char *end; @@ -140,30 +139,8 @@ main(int argc, char *argv[])          for (i = 0; i < argc; i++)              command[i + 1] = argv[i];          command[argc + 1] = NULL; -        if (!remctl_command(r, command)) -            die("%s", remctl_error(r)); -        do { -            output = remctl_output(r); -            switch (output->type) { -            case REMCTL_OUT_OUTPUT: -                if (output->stream == 1) -                    fwrite(output->data, 1, output->length, stdout); -                else { -                    fprintf(stderr, "wallet: "); -                    fwrite(output->data, 1, output->length, stderr); -                } -                break; -            case REMCTL_OUT_STATUS: -                exit(output->status); -            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); +        status = run_command(r, command, NULL, NULL); +        exit(status);      }      /* This should never be reached. */  | 
