static char sccsid
[] = "@(#)rlogin.c 4.2 82/04/06";
* rlogin - remote login; this is a hacked version of cu
char *index(), *rindex(), *malloc(), *getenv();
struct passwd
*getpwuid();
{ "0", "50", "75", "110", "134", "150", "200", "300",
"600", "1200", "1800", "2400", "4800", "9600", "19200", "38400" };
char *host
, *cp
, **ap
, buf
[BUFSIZ
];
host
= rindex(argv
[0], '/');
if (!strcmp(host
, "rlogin"))
if (!strcmp(*argv
, "-d")) {
if (!strcmp(*argv
, "-l")) {
if (!strncmp(*argv
, "-e", 2)) {
if (!strcmp(*argv
, "-8")) {
pwd
= getpwuid(getuid());
fprintf(stderr
, "Who are you?\n");
strcpy(term
, getenv("TERM"));
strcat(term
, speeds
[ttyb
.sg_ospeed
]);
rem
= rcmd(&host
, IPPORT_LOGINSERVER
, pwd
->pw_name
,
name
? name
: pwd
->pw_name
, term
, 0);
"usage: rlogin host [ -ex ] [ -l username ]\n");
#define wrc(ds) write(ds,&c,1)
char tkill
, terase
; /* current input kill & erase */
int efk
; /* process of id of listener */
struct tchars notchars
= { 0377, 0377, 'q'&037, 's'&037, 0377, 0377 };
struct ltchars defltchars
;
struct ltchars noltchars
= { 0377, 0377, 0377, 0377, 0377, 0377 };
char defkill
, deferase
, defflags
;
deferase
= stbuf
.sg_erase
;
defflags
= stbuf
.sg_flags
& (ECHO
| CRMOD
);
ioctl(0, TIOCGETC
, &deftchars
);
ioctl(0, TIOCGLTC
, &defltchars
);
nhup
= (int)signal(SIGINT
, SIG_IGN
);
prf("\007Lost connection.");
if (fk
!= -1) kill(fk
, SIGKILL
);
* wr: write to remote: 0 -> line.
* ~! local login-style shell
* ~!cmd execute cmd locally
* ~$proc execute proc locally, send output to line
* ~%cmd execute builtin cmd (put and take)
* ~^Z suspend cu process.
if (p
== b
) lcl
=(c
== cmdchar
);
if (p
== b
+1 && b
[0] == cmdchar
) lcl
=(c
!=cmdchar
);
prf("line gone"); return;
if (c
== '\r' || c
== '\n') goto A
;
if (c
== tkill
|| c
== 0177 || c
== '\4' || c
== '\r' || c
== '\n') p
=b
;
signal(SIGCHLD
, SIG_DFL
);
char *shell
= getenv("SHELL");
if (shell
== 0) shell
= "/bin/sh";
if (!nhup
) signal(SIGINT
, SIG_DFL
);
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");
if (b
[1] == '!') echo("!");
if ((ds
=open(b
+2,0))<0) {
prf("Can't divert %s",b
+1);
if (!nhup
) signal(SIGINT
, sig2
);
while (!intr
&& rdc(ds
) == 1) {
write(pipes
[1],q
,strlen(q
)+1);
if (efk
!= -1) kill(efk
,SIGEMT
);
signal(SIGCHLD
, SIG_IGN
);
prf("Use `%c%c' to start line with `%c'", cmdchar
, cmdchar
, cmdchar
);
for (narg
= 0; narg
< 10;) {
while(*line
== ' ' || *line
== '\t')
while(*line
!= '\0' && *line
!= ' ' && *line
!= '\t')
if (equal(args
[0], "take")) {
prf("usage: %c%%take from [to]", cmdchar
);
write(pipes
[1], ">/dev/null",sizeof(">/dev/null"));
if (efk
!= -1) kill(efk
,SIGEMT
);
wrln("echo '%c>:", cmdchar
);
wrln("'; tee /dev/null <");
wrln(";echo '%c>'\n", cmdchar
);
} else if (equal(args
[0], "put")) {
prf("%c%%put doesn't work yet (use rsh)", cmdchar
);
prf("usage: %c%%put from [to]", cmdchar);
if ((f = open(args[1], 0)) < 0) {
prf("cannot open: %s", args[1]);
wrln("stty -echo;cat >");
while(!intr && rdc(f) == 1) {
if (c == tkill || c == terase)
prf("stopped after %d bytes", rcount);
prf("%c%%%s unknown\n", cmdchar
, args
[0]);
sprintf(wbuf
, s
, p1
, p2
, p3
);
* rd: read from remote: line -> 1
static char dobuff
[128], morejunk
[256];
n
= read(pipes
[0],morejunk
,256);
if (*msg
!='>' || (ds
=open(cp
,1))<0) ds
=creat(cp
,0644);
if(ds
< 0) prf("Creat failed:"), prf(cp
);
if (ds
<0) prf("Can't divert %s",cp
+1);
* rd: read from remote: line -> 1
* catch: diversion caught by interrupt routine
ioctl(1, TIOCFLUSH
, &out
);
if (ioctl(rem
, SIOCATMARK
, &mark
) < 0) {
cc
= read(rem
, waste
, 512);
ioctl(rem
, SIOCRCVOOB
, &mark
);
if (mark
& TIOCPKT_NOSTOP
) {
notchars
.t_startc
= 0377;
ioctl(0, TIOCSETC
, ¬chars
);
if (mark
& TIOCPKT_DOSTOP
) {
notchars
.t_stopc
= 's'&037;
notchars
.t_startc
= 'q'&037;
ioctl(0, TIOCSETC
, ¬chars
);
char rb
[600], lb
[600], *rlim
, *llim
, c
;
int cnt
, state
= 0, mustecho
, oldslnt
, readmsg();
signal(SIGEMT
,readmsg
); /* set up child for catching diversion msgs
ioctl(rem
, SIOCSPGRP
, &pid
); }
if(!slnt
) write(1,rb
,cnt
);
for( q
=rb
, rlim
= rb
+ cnt
- 1; q
<= rlim
; ) {
if(c
=='\r') state
= SAWCR
;
state
= (c
==cmdchar
? SAWTL
:
(c
=='\r' ? SAWCR
: ORDIN
));
state
= (c
=='>' ? DIVER
:
(c
=='\r' ? SAWCR
: ORDIN
));
write(rem
,CRLF
,sizeof(CRLF
));
c
= '\n'; /*force flush to file*/
struct {char lobyte
; char hibyte
;};
ioctl(0, TIOCGETP
, &stbuf
);
stbuf
.sg_flags
&= ~CBREAK
;
stbuf
.sg_flags
|= defflags
;
ioctl(0, TIOCSETC
, &deftchars
);
ioctl(0, TIOCSLTC
, &defltchars
);
stbuf
.sg_erase
= deferase
;
stbuf
.sg_flags
|= CBREAK
;
stbuf
.sg_flags
&= ~(ECHO
|CRMOD
);
ioctl(0, TIOCSETC
, ¬chars
);
ioctl(0, TIOCSLTC
, &noltchars
);
stbuf
.sg_flags
&= ~CBREAK
;
stbuf
.sg_flags
&= ~(ECHO
|CRMOD
);
ioctl(0, TIOCSETC
, &deftchars
);
ioctl(0, TIOCSLTC
, &defltchars
);
ioctl(0, TIOCSETN
, &stbuf
);
write(0,CRLF
, sizeof(CRLF
));
fprintf(stderr
, f
, a1
, a2
, a3
);
if (access(devname
, 0)==0)
prf("%s does not exist", devname
);