version 1.2.4.3, 2001/03/21 18:52:41 |
version 1.3, 2001/01/07 19:04:47 |
|
|
/* $OpenBSD$ */ |
|
|
|
/* |
|
* Copyright (c) 2000 Markus Friedl. All rights reserved. |
|
* |
|
* Redistribution and use in source and binary forms, with or without |
|
* modification, are permitted provided that the following conditions |
|
* are met: |
|
* 1. Redistributions of source code must retain the above copyright |
|
* notice, this list of conditions and the following disclaimer. |
|
* 2. Redistributions in binary form must reproduce the above copyright |
|
* notice, this list of conditions and the following disclaimer in the |
|
* documentation and/or other materials provided with the distribution. |
|
* |
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
*/ |
|
|
|
#include "includes.h" |
#include "includes.h" |
RCSID("$OpenBSD$"); |
RCSID("$OpenBSD$"); |
|
|
#include "xmalloc.h" |
#include "xmalloc.h" |
#include "log.h" |
#include "ssh.h" |
#include "cli.h" |
|
|
|
#include <vis.h> |
#include <vis.h> |
|
|
static int cli_input = -1; |
static int cli_input = -1; |
|
|
cli_input = STDIN_FILENO; |
cli_input = STDIN_FILENO; |
cli_output = STDERR_FILENO; |
cli_output = STDERR_FILENO; |
} else { |
} else { |
cli_input = cli_output = open(_PATH_TTY, O_RDWR); |
cli_input = cli_output = open("/dev/tty", O_RDWR); |
if (cli_input < 0) |
if (cli_input < 0) |
fatal("You have no controlling tty. Cannot read passphrase."); |
fatal("You have no controlling tty. Cannot read passphrase."); |
} |
} |
|
|
} |
} |
|
|
static void |
static void |
cli_close(void) |
cli_close() |
{ |
{ |
if (!cli_from_stdin && cli_input >= 0) |
if (!cli_from_stdin && cli_input >= 0) |
close(cli_input); |
close(cli_input); |
|
|
} |
} |
|
|
void |
void |
intrcatch(int sig) |
intrcatch() |
{ |
{ |
intr = 1; |
intr = 1; |
} |
} |
|
|
static void |
static void |
cli_echo_disable(void) |
cli_echo_disable() |
{ |
{ |
sigemptyset(&nset); |
sigemptyset(&nset); |
sigaddset(&nset, SIGTSTP); |
sigaddset(&nset, SIGTSTP); |
|
|
} |
} |
|
|
static void |
static void |
cli_echo_restore(void) |
cli_echo_restore() |
{ |
{ |
if (echo_modified != 0) { |
if (echo_modified != 0) { |
tcsetattr(cli_input, TCSANOW, &otio); |
tcsetattr(cli_input, TCSANOW, &otio); |
|
|
{ |
{ |
char ch = 0; |
char ch = 0; |
int i = 0; |
int i = 0; |
int n; |
|
|
|
if (!echo) |
if (!echo) |
cli_echo_disable(); |
cli_echo_disable(); |
|
|
while (ch != '\n') { |
while (ch != '\n') { |
n = read(cli_input, &ch, 1); |
if (read(cli_input, &ch, 1) != 1) |
if (n == -1 && (errno == EAGAIN || errno == EINTR)) |
|
continue; |
|
if (n != 1) |
|
break; |
break; |
if (ch == '\n' || intr != 0) |
if (ch == '\n' || intr != 0) |
break; |
break; |
|
|
|
|
output = xmalloc(4*size); |
output = xmalloc(4*size); |
for (p = output, i = 0; i < size; i++) { |
for (p = output, i = 0; i < size; i++) { |
if (buf[i] == '\n' || buf[i] == '\r') |
if (buf[i] == '\n') |
*p++ = buf[i]; |
*p++ = buf[i]; |
else |
else |
p = vis(p, buf[i], 0, 0); |
p = vis(p, buf[i], 0, 0); |
} |
} |
len = p - output; |
len = p - output; |
|
|
for (pos = 0; pos < len; pos += ret) { |
for (pos = 0; pos < len; pos += ret) { |
ret = write(cli_output, output + pos, len - pos); |
ret = write(cli_output, output + pos, len - pos); |
if (ret == -1) { |
if (ret == -1) { |
xfree(output); |
xfree(output) |
return -1; |
return -1; |
} |
} |
} |
} |
xfree(output); |
xfree(output) |
return 0; |
return 0; |
} |
} |
|
|