<*+M2EXTENSIONS *> <*-CHECKDIV *> <*-CHECKRANGE *> <*-COVERFLOW *> <*-IOVERFLOW*> <*+NOPTRALIAS*> <*CPU="PENTIUM"*> <*-CHECKNIL *> <*-CHECKINDEX*> <*-CHECKDINDEX *> <*-CHECKSET*> <* IF __GEN_C__ THEN *> <*+COMMENT*> <*-GENCTYPES*> <*-PROCINLINE*> <*-GENDEBUG*> <*-LINENO*> <*-GENHISTORY*> <*-GENDATE*> <*+NOHEADER*> <*+GENCDIV*> <*-GENKRC*> <*+NOOPTIMIZE*> <*-GENSIZE*> <*-ASSERT*> <* ELSE *> <*-PROCINLINE*> <*-GENDEBUG*> <*-LINENO*> <*-GENHISTORY*> <* END *> MODULE cmslogin; (* start tcp connection and make user/passwd dialog *) FROM SYSTEM IMPORT CAST; FROM aprsstr IMPORT Delstr, IPNUM, Assign, InStr, Length, StrCmp, Append; FROM osi IMPORT NextArg, SOCKET, InvalidFd, WrStr, WrStrLn, Close, RdBin, WrBin, File, connectto, socknonblock, readsock, sendsock, CloseSock, WrInt; FROM mlib IMPORT termios, tcgetattr, tcsetattr, TCSAFLUSH; FROM Select IMPORT fdclr, fdsetr, issetr, selectr; CONST CR=15C; LF=12C; VAR user, pw, h, b, ip, url, port:ARRAY[0..1024] OF CHAR; fd:File; l:INTEGER; saved0:termios; PROCEDURE Err(text:ARRAY OF CHAR); BEGIN WrStr("cmslogin: "); WrStr(text); WrStrLn(""); HALT END Err; PROCEDURE urlport(s:ARRAY OF CHAR; VAR url, port:ARRAY OF CHAR); (* url:port to url port *) VAR ii:INTEGER; i, j:CARDINAL; BEGIN url[0]:=0C; port[0]:=0C; i:=0; WHILE (i<=HIGH(s)) & (s[i]=" ") DO INC(i) END; (* remove leading blanks *) IF (i<=HIGH(s)) & (s[i]="[") THEN (* ipv6 url *) j:=0; INC(i); WHILE (i<=HIGH(s)) & (s[i]<>0C) & (s[i]<>"]") DO IF j<=HIGH(url) THEN url[j]:=s[i]; INC(j) END; INC(i); END; IF j<=HIGH(url) THEN url[j]:=0C END; IF (i<=HIGH(s)) & (s[i]="]") THEN INC(i); IF (i<=HIGH(s)) & (s[i]=":") THEN (* ipv6 port *) j:=0; INC(i); WHILE (i<=HIGH(s)) & (s[i]>" ") DO IF j<=HIGH(port) THEN port[j]:=s[i]; INC(j) END; INC(i); END; IF j<=HIGH(port) THEN port[j]:=0C END; END; END; ELSE (* ipv4 *) Assign(url, s); ii:=InStr(url, ":"); IF ii>0 THEN url[ii]:=0C; Delstr(s, 0, ii+1); Assign(port, s); END; END; END urlport; PROCEDURE SetComMode(fd:File; VAR save:termios); VAR term : termios; res : INTEGER; BEGIN res:=tcgetattr(fd, save); res:=tcgetattr(fd, term); WITH term DO c_lflag :=0; c_oflag :=0; c_iflag :=0; (* cfmakeraw(&termios);*) (* c_cflag :=CS8+CLOCAL+CREAD; *) END; res:=tcsetattr (fd, TCSAFLUSH, term); END SetComMode; PROCEDURE ReSetComMode(fd:File; VAR save:termios); VAR res : INTEGER; BEGIN res:=tcsetattr (fd, TCSAFLUSH, save); END ReSetComMode; PROCEDURE waitprompt(fd:File):INTEGER; VAR st:CARDINAL; ch:CHAR; BEGIN st:=0; LOOP fdclr; fdsetr(fd); IF (selectr(0, 0)>=0) & issetr(fd) THEN IF RdBin(fd, ch, 1)<>1 THEN RETURN -1 END; IF (st=0) & (ch=":") THEN st:=1 ELSIF (st=1) & ((ch=CR) OR (ch=LF)) THEN EXIT END; END; END; RETURN 0 END waitprompt; BEGIN NextArg(h); IF (h[0]="-") & (h[1]="h") THEN Err("usage: cmslogin "+LF +'example: ./l2cat -i OE0AAA-11 -U 127.0.0.1:2602:2603 -m 0 -c "./cmslogin cmslogin server.winlink.org:8772 %U CMSTelnet"'); END; urlport(h, ip, port); NextArg(user); IF (user[0]=0C) THEN Err("need a user call") END; NextArg(pw); IF (pw[0]=0C) THEN Err("need a password") END; fd:=connectto(ip, port); IF CAST(INTEGER,fd)<0 THEN Err("connection failed") END; -- l:=socknonblock(fd); IF waitprompt(fd)<0 THEN Err("connection lost") END; Append(user, CR); WrBin(fd, user, Length(user)); IF waitprompt(fd)<0 THEN Err("connection lost") END; Append(pw, CR); WrBin(fd, pw, Length(pw)); SetComMode(0, saved0); LOOP fdclr; fdsetr(fd); fdsetr(0); IF selectr(0, 0)>=0 THEN IF issetr(fd) THEN l:=RdBin(fd, b, SIZE(b)); IF l<=0 THEN EXIT END; WrBin(1, b, l); END; IF issetr(0) THEN l:=RdBin(0, b, SIZE(b)); IF l<=0 THEN EXIT END; WrBin(fd, b, l); END; END; END; ReSetComMode(0, saved0); END cmslogin. (* bake gehat an api.winlink.org port 80 oder server.winlink.org port 8085 *)