]> andersk Git - openssh.git/blobdiff - ssh-add.c
Lots of changes:
[openssh.git] / ssh-add.c
index 0cb0bdf1633a8d0ff2ac6bdf02a70eb6142fbcf0..0c95ca6d51b83d27c038ef38875054d95a10a5f8 100644 (file)
--- a/ssh-add.c
+++ b/ssh-add.c
@@ -52,6 +52,7 @@ delete_all(AuthenticationConnection *ac)
     fprintf(stderr, "Failed to remove all identitities.\n");
 }
 
+#define BUFSIZE 1024
 void
 add_file(AuthenticationConnection *ac, const char *filename)
 {
@@ -59,6 +60,11 @@ add_file(AuthenticationConnection *ac, const char *filename)
   RSA *public_key;
   char *saved_comment, *comment, *pass;
   int first;
+  int pipes[2];
+  char buf[BUFSIZE];
+  int tmp;
+  pid_t child;
+  FILE *pipef;
   
   key = RSA_new();
   public_key = RSA_new();
@@ -80,8 +86,72 @@ add_file(AuthenticationConnection *ac, const char *filename)
       /* Ask for a passphrase. */
       if (getenv("DISPLAY") && !isatty(fileno(stdin)))
        {
-             xfree(saved_comment);
-             return;
+          if (pipe(pipes) ==-1)
+            {
+              fprintf(stderr, "Creating pipes failed: %s\n", strerror(errno));
+              exit(1);
+            }
+          if (fflush(NULL)==EOF)
+            {
+              fprintf(stderr, "Cannot flush buffers: %s\n", strerror(errno));
+              exit(1);
+            }
+          switch (child=fork())
+            {
+            case -1:
+              fprintf(stderr, "Cannot fork: %s\n", strerror(errno));
+              exit(1);
+            case 0:
+              close(pipes[0]);
+              if (dup2(pipes[1], 1) ==-1)
+                {
+                  fprintf(stderr, "dup2 failed: %s\n", strerror(errno));
+                  exit(1);
+                }
+              tmp=snprintf(buf, BUFSIZE, "Need passphrase for %s (%s)",
+                           filename, saved_comment);
+              /* skip the prompt if it won't fit */
+              if (tmp < 0 || tmp >= BUFSIZE)
+                tmp=execlp("/usr/lib/ssh/ssh-askpass", "ssh-askpass", 0);
+              else
+                tmp=execlp("/usr/lib/ssh/ssh-askpass", "ssh-askpass", buf, 0);
+              if (tmp==-1)
+                {
+                  fprintf(stderr, "Executing ssh-askpass failed: %s\n",
+                          strerror(errno));
+                  exit(1);
+                }
+              break;
+            default:
+              close(pipes[1]);
+              if ( (pipef=fdopen(pipes[0], "r")) ==NULL)
+                {
+                  fprintf(stderr, "fdopen failed: %s\n", strerror(errno));
+                  exit(1);
+                }
+              if(fgets(buf, sizeof(buf), pipef)==NULL)
+                {
+                  xfree(saved_comment);
+                  return;
+                }
+              fclose(pipef);
+              if (strchr(buf, '\n'))
+                *strchr(buf, '\n') = 0;
+              pass = xstrdup(buf);
+              memset(buf, 0, sizeof(buf));
+              if (waitpid(child, NULL, 0) ==-1)
+                {
+                  fprintf(stderr, "Waiting for child failed: %s\n",
+                          strerror(errno));
+                  exit(1);
+                }
+              if (strcmp(pass, "") == 0)
+                {
+                  xfree(saved_comment);
+                  xfree(pass);
+                  return;
+                }
+            }
        }
       else
        {
This page took 0.063383 seconds and 4 git commands to generate.