Files
zssh-mirror/main.c
Michael Tatton eac646d7d9 INIT
2019-11-28 19:14:20 +01:00

160 lines
3.2 KiB
C

/*
** main.c for zssh
**
** Made by Matthieu Lucotte
** Login <gounter@users.sourceforge.net>
**
** Started on Thu Jun 29 19:10:13 2000 Matthieu Lucotte
** Last update Mon Sep 1 23:18:58 2003
*/
#include "zssh.h"
int main(argc, argv)
int argc;
char **argv;
{
init(&argc,&argv);
printf("Press ^%c (%s) to enter file transfer mode, then ? for help\n",
gl_escape, escape_help());
fflush(stdout);
if (!sfork(&gl_child_output))
dooutput();
if (!sfork(&gl_child_shell))
doshell(argc, argv, gl_shav);
doinput();
return (0);
}
/* old stuff: test Alt-1 as escape sequence
* scary stuff. fortunately it's dummied out
*/
#if 0
int escape_input(cc,ibuf)
int *cc;
unsigned char *ibuf;
{
if (*cc == 1 && ibuf[0] == 0xb1) /* Alt-1 X11 key code */
return (1);
#ifndef DUMB_KEYBOARD
if (*cc >= 2 && ibuf[0] == 27 && ibuf[1] == '1') /* Alt-1 text key code */
return (1);
#else
if (*cc == 1 && ibuf[0] == 27)
{
int i;
char c;
usleep(40000);
i = fcntl(0,F_GETFL,0);
i |= O_NONBLOCK;
fcntl(0,F_SETFL,i);
read_input(cc,ibuf);
i = fcntl(0,F_GETFL,0);
i &= ~O_NONBLOCK;
fcntl(0,F_SETFL,i);
if (*cc >= 1 && ibuf[0] == '1') /* Alt-1 text key code, dumb keyboard */
return (1);
else
{
c = 27;
write(gl_master,&c,1);
}
}
#endif
return (0);
}
#endif /* 0 */
/* new one: test escape sequence
* NB: customizing Ctrl-Something escape sequences is easy ...
* Alt-Something is not.
*/
int escape_input(cc,ibuf)
int *cc;
unsigned char *ibuf;
{
if (*cc == 1 && ibuf[0] == gl_escape - '@') /* escape key code */
return (1);
return (0);
}
void read_input(cc,ibuf)
int *cc;
unsigned char *ibuf;
{
*cc = read(0,ibuf,BUFSIZ);
#ifdef DEBUG_CRAZY
{
int i;
for (i = 0;i < *cc;i++)
printf("%02i ", ibuf[i]);
printf("\n");
}
#endif
}
/* switch to local shell mode
*/
void rz_mode()
{
char **av;
int ac;
int i,k;
char *line;
gl_local_shell_mode = 1;
kill(gl_child_output,SIGSTOP); /* suspend output */
printf("\n");
printf("\r");
/* tcgetattr(0, &gl_rtt); */
tcgetattr(gl_slave, &gl_tt2); /* save slave tty state */
/* TCSAFLUSH causes problems on some systems */
tcsetattr(0, TCSANOW, &gl_tt); /* was in raw mode */
for (i = 0; i < 100; ) /* action codes >= 100 exit */
{
line = zprompt();
if (zparse(&line, &av, &ac) < 0)
continue;
i = zrun(av);
free(line);
for (k = 0; k < ac; k++)
if (av[k])
free(av[k]);
}
tcsetattr(0, TCSANOW, &gl_rtt); /* restore raw term */
kill(gl_child_output, SIGCONT); /* resume output */
gl_local_shell_mode = 0;
}
void fail()
{
done(1);
}
/* should be called only by main process */
void done(ret)
int ret;
{
if (getpid() != gl_main_pid)
error("done() should only be called by main process","");
if (gl_child_rz)
kill(gl_child_rz, SIGTERM);
if (gl_child_shell)
kill(gl_child_shell, SIGTERM);
if (gl_child_output)
{
usleep(500);
kill(gl_child_output, SIGTERM);
tcsetattr(0, TCSAFLUSH, &gl_tt);
}
exit (ret);
}