|
|
1.1 root 1: #include <stdio.h>
2: #include <sgtty.h>
3: #include <signal.h>
4:
5: main(argc, argv)
6: char *argv[];
7: {
8: char buf[512];
9: int n, pid, cpid, ld, ptfd, rem;
10: extern cdkp_ld;
11:
12: if(argc != 3){
13: fprintf(stderr, "Usage: %s dk-host pt\n", argv[0]);
14: exit(1);
15: }
16: if((ptfd = open(argv[2], 2)) < 0){
17: perror(argv[2]);
18: exit(1);
19: }
20: rem = tdkdial(argv[1], 0);
21: if(rem < 0){
22: perror("tdkdial");
23: exit(1);
24: }
25: if(dkproto(rem, cdkp_ld) < 0){
26: perror("dkproto cdkp");
27: exit(1);
28: }
29:
30: if(read(rem, buf, 1) != 1){
31: perror("init read");
32: exit(1);
33: }
34: write(rem, "slip\r", 5);
35:
36: sleep(3);
37: /*
38: read(rem, buf, sizeof(buf));
39: */
40: write(rem, "forbes sl0\r", 11);
41:
42: signal(SIGHUP, SIG_IGN);
43: pid = getpid();
44: cpid = fork();
45: if(cpid == 0){
46: rint(rem, ptfd);
47: kill(pid, 9);
48: exit(0);
49: }
50: out(ptfd, rem);
51: kill(cpid, 9);
52: }
53: #define END 0300
54: #define ESC 0333
55: #define TRANS_END 0334
56: #define TRANS_ESC 0335
57: rint(rfd, wfd)
58: {
59: static escaped = 0;
60: int count = 0, len;
61: unsigned int c;
62: unsigned char buf[4096];
63: unsigned char xbuf[512];
64: int i, n;
65:
66: len = 0;
67: while((n = read(rfd, xbuf, sizeof(xbuf))) > 0)
68: for(i = 0; i < n; i++){
69: c = xbuf[i];
70: if(escaped){
71: if(c == TRANS_ESC){
72: c = ESC;
73: } else {
74: c = END;
75: }
76: escaped = 0;
77: } else {
78: if(c == ESC){
79: escaped = 1;
80: continue;
81: } else if(c == END){
82: if(write(wfd, buf, len) != len){
83: perror("write");
84: return;
85: }
86: escaped = count = len = 0;
87: continue;
88: }
89: }
90: buf[len++] = c;
91: }
92: }
93:
94: out(rfd, wfd)
95: {
96: char buf[4096];
97: char xbuf[5000];
98: int xi;
99: int n;
100: unsigned char c;
101: int i;
102:
103: while((n = read(rfd, buf, sizeof(buf))) > 0){
104: xi = 0;
105: for(i = 0; i < n; i++){
106: c = buf[i];
107: if(c == ESC || c == END){
108: xbuf[xi++] = '\333';
109: c = (c == ESC ? TRANS_ESC : TRANS_END);
110: }
111: xbuf[xi++] = c;
112: }
113: xbuf[xi++] = '\300';
114: write(wfd, xbuf, xi);
115: }
116: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.