+static char *sccsid = "@(#)cu.c 4.1 (Berkeley) 10/1/80";
#include <stdio.h>
#include <signal.h>
#include <sgtty.h>
char tkill, terase; /* current input kill & erase */
int efk; /* process of id of listener */
char c;
+char oc;
char *connmsg[] = {
"",
rdc(ds) {
ds=read(ds,&c,1);
- c&= 0177;
+ oc = c;
+ c &= 0177;
return (ds);
}
prf(connmsg[8]);
exit(8);
}
- telno = av[1];
- av += 2;
- ac -= 2;
- for (; ac > 0; av++) {
- if (equal(*av, "-t")) {
+ for (; ac > 1; av++,ac--) {
+ if (av[1][0] != '-')
+ telno = av[1];
+ else switch(av[1][1]) {
+ case 't':
dout = 1;
--ac;
continue;
- }
- if (equal(*av, "-d")) {
+ case 'd':
dbflag++;
continue;
- }
- if (ac < 2)
+ case 's':
+ lspeed = av[2]; ++av; --ac;
+ break;
+ case 'l':
+ devcul = av[2]; ++av; --ac;
break;
- if (equal(*av, "-s"))
- lspeed = *++av;
- else if (equal(*av, "-l"))
- devcul = *++av;
- else if (equal(*av, "-a"))
- devcua = *++av;
- else
+ case 'a':
+ devcua = av[2]; ++av; --ac;
+ break;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ devcua[strlen(devcua)-1] = av[1][1];
+ devcul[strlen(devcul)-1] = av[1][1];
+ break;
+ default:
+ prf("Bad flag %s", av[1]);
break;
- ac -= 2;
+ }
}
if (!exists(devcua) || !exists(devcul))
exit(9);
stbuf.sg_ispeed = speed;
stbuf.sg_ospeed = speed;
stbuf.sg_flags = EVENP|ODDP;
- if (!dout)
+ if (!dout) {
stbuf.sg_flags |= RAW;
- ioctl(TIOCSETP, ln, &stbuf);
- ioctl(TIOCEXCL, ln, (struct sgttyb *)NULL);
- ioctl(TIOCHPCL, ln, (struct sgttyb *)NULL);
+ stbuf.sg_flags &= ~ECHO;
+ }
+ ioctl(ln, TIOCSETP, &stbuf);
+ ioctl(ln, TIOCEXCL, (struct sgttyb *)NULL);
+ ioctl(ln, TIOCHPCL, (struct sgttyb *)NULL);
prf("Connected");
if (dout)
fk = -1;
wait((int *)NULL);
stbuf.sg_ispeed = 0;
stbuf.sg_ospeed = 0;
- ioctl(TIOCSETP, ln, &stbuf);
+ ioctl(ln, TIOCSETP, &stbuf);
prf("Disconnected");
exit(0);
}
;
p--;
if (*(p-1)!='<') {
- if (*(p-1)!='-') *p++='-';
+ /*if (*(p-1)!='-') *p++='-';*/
*p++='<';
}
t=p-b;
er=(errno == 4? 3:6);
goto X;
}
- ioctl(TIOCGETP, ln, &stbuf);
+ ioctl(ln, TIOCGETP, &stbuf);
stbuf.sg_flags &= ~ECHO;
xalarm(10);
- ioctl(TIOCSETP, dh, &stbuf);
- ioctl(TIOCHPCL, dh, (struct sgttyb *)NULL);
+ ioctl(dh, TIOCSETP, &stbuf);
+ ioctl(dh, TIOCHPCL, (struct sgttyb *)NULL);
xalarm(0);
X:
if (er) close(dn);
* ~!cmd execute cmd locally
* ~$proc execute proc locally, send output to line
* ~%cmd execute builtin cmd (put and take)
+ * ~# send 1-sec break
*/
wr()
while (rdc(0) == 1) {
if (p == b) lcl=(c == '~');
if (p == b+1 && b[0] == '~') lcl=(c!='~');
- if (c == 0) c=0177;
+ /* if (c == 0) oc=c=0177; fake break kludge */
if (!lcl) {
+ c = oc;
if (wrc(ln) == 0) {
prf("line gone"); return;
}
+ c &= 0177;
}
if (lcl) {
if (c == 0177) c=tkill;
p=p-2;
if (p<b) p=b;
}
- if (c == tkill || c == 0177 || c == '\r' || c == '\n') p=b;
+ if (c == tkill || c == 0177 || c == '\4' || c == '\r' || c == '\n') p=b;
}
return;
A:
case '.':
case '\004':
return;
+ case '#':
+ ioctl(ln, TIOCSBRK, 0);
+ sleep(1);
+ ioctl(ln, TIOCCBRK, 0);
+ continue;
case '!':
case '$':
fk = fork();
if (fk == 0) {
+ char *getenv();
char *shell = getenv("SHELL");
if (shell == 0) shell = "/bin/sh";
close(1);
close(ln);
mode(0);
if (!nhup) signal(SIGINT, SIG_DFL);
- if (b[2] == 0) execl(shell,"-",0);
+ if (b[2] == 0) execl(shell,shell,0);
+ /* if (b[2] == 0) execl(shell,"-",0); */
else execl(shell,"sh","-c",b+2,0);
prf("Can't execute shell");
exit(~0);
kill(efk,SIGEMT);
}
break;
+#ifdef SIGTSTP
+#define CTRLZ 26
+ case CTRLZ:
+ mode(0);
+ kill(getpid(), SIGTSTP);
+ mode(1);
+ break;
+#endif
case '%':
dopercen(&b[2]);
break;
{
struct sgttyb stbuf;
if (dout) return;
- ioctl(TIOCGETP, 0, &stbuf);
+ ioctl(0, TIOCGETP, &stbuf);
tkill = stbuf.sg_kill;
terase = stbuf.sg_erase;
if (f == 0) {
}
if (f == 1) {
stbuf.sg_flags |= RAW;
- stbuf.sg_flags &= ECHO|CRMOD;
+ stbuf.sg_flags &= ~(ECHO|CRMOD);
}
if (f == 2) {
stbuf.sg_flags &= ~RAW;
stbuf.sg_flags &= ~(ECHO|CRMOD);
}
- ioctl(TIOCSETP, 0, &stbuf);
+ ioctl(0, TIOCSETP, &stbuf);
}
echo(s)