On Fri, Jan 6, 2012 at 12:14 PM, Jeff Layton <jlayton@xxxxxxxxx> wrote: > ...and use getopt_long to get it. If someone doesn't specify the username, > use getusername() to get it. > > Signed-off-by: Jeff Layton <jlayton@xxxxxxxxx> > --- > cifscreds.c | 39 ++++++++++++++++++++++++++++----------- > 1 files changed, 28 insertions(+), 11 deletions(-) > > diff --git a/cifscreds.c b/cifscreds.c > index 79ab426..f45497a 100644 > --- a/cifscreds.c > +++ b/cifscreds.c > @@ -27,8 +27,10 @@ > #include <string.h> > #include <ctype.h> > #include <keyutils.h> > +#include <getopt.h> > #include "mount.h" > #include "resolve_host.h" > +#include "util.h" > > #define THIS_PROGRAM_NAME "cifscreds" > > @@ -49,8 +51,8 @@ > #define DEST_KEYRING KEY_SPEC_USER_KEYRING > > struct cmdarg { > - char *host; > - char *user; > + char *host; > + char *user; > }; > > struct command { > @@ -67,13 +69,18 @@ static int cifscreds_update(struct cmdarg *arg); > const char *thisprogram; > > struct command commands[] = { > - { cifscreds_add, "add", "<host> <user>" }, > - { cifscreds_clear, "clear", "<host> <user>" }, > + { cifscreds_add, "add", "[-u username] <host>" }, > + { cifscreds_clear, "clear", "[-u username] <host>" }, > { cifscreds_clearall, "clearall", "" }, > - { cifscreds_update, "update", "<host> <user>" }, > + { cifscreds_update, "update", "[-u username] <host>" }, > { NULL, "", NULL } > }; > > +struct option longopts[] = { > + {"username", 1, NULL, 'u'}, > + {NULL, 0, NULL, 0} > +}; > + > /* display usage information */ > static int > usage(void) > @@ -499,12 +506,22 @@ int main(int argc, char **argv) > if (argc == 1) > return usage(); > > + while((n = getopt_long(argc, argv, "u:", longopts, NULL)) != -1) { > + switch (n) { > + case 'u': > + arg.user = optarg; > + break; > + default: > + return usage(); > + } > + } > + > /* find the best fit command */ > best = NULL; > - n = strnlen(argv[1], MAX_COMMAND_SIZE); > + n = strnlen(argv[optind], MAX_COMMAND_SIZE); > > for (cmd = commands; cmd->action; cmd++) { > - if (memcmp(cmd->name, argv[1], n) != 0) > + if (memcmp(cmd->name, argv[optind], n) != 0) > continue; > > if (cmd->name[n] == 0) { > @@ -527,12 +544,12 @@ int main(int argc, char **argv) > return EXIT_FAILURE; > } > > - /* first argument should be host */ > + /* second argument should be host */ > if (argc >= 3) > - arg.host = argv[2]; > + arg.host = argv[optind + 1]; > > - if (argc >= 4) > - arg.user = argv[3]; > + if (arg.user == NULL) > + arg.user = getusername(getuid()); > > return best->action(&arg); > } > -- > 1.7.7.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-cifs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html Just a thought, can user specify only one hostname and would hostname be always the last argument for cifscreds_* commands? I was thinking whtether an user might want to manipulate keys for multiple servers in one command! -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html