version 1.22.2.1, 2001/11/14 03:24:39 |
version 1.22.2.2, 2002/03/07 17:37:47 |
|
|
/* |
/* |
* Copyright (c) 1988, 1993 |
* Copyright (c) 2001 Markus Friedl. All rights reserved. |
* The Regents of the University of California. All rights reserved. |
|
* |
* |
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* modification, are permitted provided that the following conditions |
|
|
* 2. Redistributions in binary form must reproduce the above copyright |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
|
* must display the following acknowledgement: |
|
* This product includes software developed by the University of |
|
* California, Berkeley and its contributors. |
|
* 4. Neither the name of the University nor the names of its contributors |
|
* may be used to endorse or promote products derived from this software |
|
* without specific prior written permission. |
|
* |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
* SUCH DAMAGE. |
|
*/ |
*/ |
|
|
#include "includes.h" |
#include "includes.h" |
|
|
pid_t pid; |
pid_t pid; |
size_t len; |
size_t len; |
char *pass; |
char *pass; |
int p[2], status; |
int p[2], status, ret; |
char buf[1024]; |
char buf[1024]; |
|
|
if (fflush(stdout) != 0) |
if (fflush(stdout) != 0) |
|
|
fatal("ssh_askpass: exec(%s): %s", askpass, strerror(errno)); |
fatal("ssh_askpass: exec(%s): %s", askpass, strerror(errno)); |
} |
} |
close(p[1]); |
close(p[1]); |
len = read(p[0], buf, sizeof buf -1); |
|
|
len = ret = 0; |
|
do { |
|
ret = read(p[0], buf + len, sizeof(buf) - 1 - len); |
|
if (ret == -1 && errno == EINTR) |
|
continue; |
|
if (ret <= 0) |
|
break; |
|
len += ret; |
|
} while (sizeof(buf) - 1 - len > 0); |
|
buf[len] = '\0'; |
|
|
close(p[0]); |
close(p[0]); |
while (waitpid(pid, &status, 0) < 0) |
while (waitpid(pid, &status, 0) < 0) |
if (errno != EINTR) |
if (errno != EINTR) |
break; |
break; |
if (len <= 1) |
|
return xstrdup(""); |
|
buf[len] = '\0'; |
|
buf[strcspn(buf, "\r\n")] = '\0'; |
buf[strcspn(buf, "\r\n")] = '\0'; |
pass = xstrdup(buf); |
pass = xstrdup(buf); |
memset(buf, 0, sizeof(buf)); |
memset(buf, 0, sizeof(buf)); |
|
|
use_askpass = 1; |
use_askpass = 1; |
} else { |
} else { |
rppflags |= RPP_REQUIRE_TTY; |
rppflags |= RPP_REQUIRE_TTY; |
ttyfd = open("/dev/tty", O_RDWR); |
ttyfd = open(_PATH_TTY, O_RDWR); |
if (ttyfd >= 0) |
if (ttyfd >= 0) |
close(ttyfd); |
close(ttyfd); |
else |
else |