Random Unix puttygen improvements highlighted by a post to comp.security.ssh:
[u/mdw/putty] / cmdgen.c
index 36da55e..763d05e 100644 (file)
--- a/cmdgen.c
+++ b/cmdgen.c
@@ -124,13 +124,16 @@ void showversion(void)
     sfree(verstr);
 }
 
-void usage(void)
+void usage(int standalone)
 {
     fprintf(stderr,
            "Usage: puttygen ( keyfile | -t type [ -b bits ] )\n"
-           "                [ -C comment ] [ -P ]\n"
+           "                [ -C comment ] [ -P ] [ -q ]\n"
            "                [ -o output-keyfile ] [ -O type | -l | -L"
            " | -p ]\n");
+    if (standalone)
+       fprintf(stderr,
+               "Use \"puttygen --help\" for more detail.\n");
 }
 
 void help(void)
@@ -140,12 +143,13 @@ void help(void)
      * start with that, plus a version heading.
      */
     showversion();
-    usage();
+    usage(FALSE);
     fprintf(stderr,
            "  -t    specify key type when generating (rsa, dsa, rsa1)\n"
            "  -b    specify number of bits when generating key\n"
            "  -C    change or specify key comment\n"
            "  -P    change key passphrase\n"
+           "  -q    quiet: do not display progress bar\n"
            "  -O    specify output type:\n"
            "           private             output PuTTY private key format\n"
            "           private-openssh     export OpenSSH private key\n"
@@ -282,7 +286,7 @@ int main(int argc, char **argv)
      * return success.
      */
     if (argc <= 1) {
-       usage();
+       usage(TRUE);
        return 0;
     }
 
@@ -336,7 +340,7 @@ int main(int argc, char **argv)
                        else {
                            errs = TRUE;
                            fprintf(stderr,
-                                   "puttygen: no such option `--%s'\n", opt);
+                                   "puttygen: no such option `-%s'\n", opt);
                        }
                    }
                    p = NULL;
@@ -475,7 +479,7 @@ int main(int argc, char **argv)
      * ones, print the usage message and return failure.
      */
     if (!infile && keytype == NOKEYGEN) {
-       usage();
+       usage(TRUE);
        return 1;
     }
 
@@ -487,11 +491,21 @@ int main(int argc, char **argv)
      * Bomb out if we've been asked to both load and generate a
      * key.
      */
-    if (keytype != NOKEYGEN && intype) {
+    if (keytype != NOKEYGEN && infile) {
        fprintf(stderr, "puttygen: cannot both load and generate a key\n");
        return 1;
     }
 
+    /* 
+     * We must save the private part when generating a new key.
+     */
+    if (keytype != NOKEYGEN &&
+       (outtype != PRIVATE && outtype != OPENSSH && outtype != SSHCOM)) {
+       fprintf(stderr, "puttygen: this would generate a new key but "
+               "discard the private part\n");
+       return 1;
+    }
+
     /*
      * Analyse the type of the input file, in case this affects our
      * course of action.