|
|
1.1 root 1: #include "sys/inet/tcp_user.h"
2: /*
3: * special debugging added to tcp_accept for tcpgate
4: */
5: #include <ctype.h>
6: #include <stdio.h>
7: #include <errno.h>
8: #include "config.h"
9:
10: extern errno;
11: extern char *errstr;
12:
13: tcp_sock()
14: {
15: int fd, n;
16: char name[32];
17:
18: for(n = 01; n < 100; n += 2){
19: sprintf(name, "/dev/tcp%02d", n);
20: fd = open(name, 2);
21: if(fd >= 0){
22: flabclr(fd); /* for security unix */
23: return(fd);
24: }
25: if(errno != ENXIO)
26: break;
27: }
28: perror(name);
29: return(-1);
30: }
31:
32: static
33: tcp_rv(fd, tp)
34: int fd;
35: struct tcpuser *tp;
36: {
37: int n;
38:
39: n = read(fd, (char *)tp, sizeof(struct tcpuser));
40: if (n != sizeof(struct tcpuser)){
41: if(errno==EINTR){
42: errstr = "timeout";
43: } else {
44: errstr = "connection rejected";
45: errno = EACCES;
46: }
47: return -1;
48: }
49:
50: switch(tp->code){
51: case TCPC_OK:
52: return 0;
53: case TCPC_BADDEV:
54: errstr = "tcp dev broken";
55: errno = EIO;
56: break;
57: case TCPC_NOROUTE:
58: errstr = "no route";
59: errno = ENOENT;
60: break;
61: case TCPC_BADLOCAL:
62: errstr = "invalid local address";
63: errno = EINVAL;
64: break;
65: case TCPC_BOUND:
66: errstr = "address(es) already in use";
67: errno = ENOENT;
68: break;
69: default:
70: errstr = "unknown error";
71: errno = EIO;
72: break;
73: }
74: return -1;
75: }
76:
77: tcp_connect(fd, tp)
78: int fd;
79: struct tcpuser *tp;
80: {
81: tp->code = TCPC_CONNECT;
82: if (write(fd, (char *)tp, sizeof(struct tcpuser))!=sizeof(struct tcpuser)){
83: errstr = "can't write tcp dev";
84: return -1;
85: }
86: return tcp_rv(fd, tp);
87: }
88:
89: tcp_listen(fd, tp)
90: int fd;
91: struct tcpuser *tp;
92: {
93: tp->code = TCPC_LISTEN;
94: if (write(fd, (char *)tp, sizeof(struct tcpuser))!=sizeof(struct tcpuser)){
95: errstr = "can't write tcp dev";
96: return -1;
97: }
98: return tcp_rv(fd, tp);
99: }
100:
101: tcp_accept(fd, tp)
102: int fd;
103: struct tcpuser *tp;
104: {
105: char name[128];
106: int nfd;
107: int n;
108:
109: if ((n=read(fd, (char *)tp, sizeof(struct tcpuser)))!=sizeof(struct tcpuser)) {
110: log("accept: read %d, errno %d\n", n, errno);
111: return -1;
112: }
113: if (tp->code != TCPC_OK) {
114: log("accept: bad code %d\n", tp->code);
115: return -1;
116: }
117: sprintf(name, "/dev/tcp%02d", tp->param);
118: nfd = open(name, 2);
119: if (nfd < 0)
120: log("accept: can't open %s, errno %d\n", name, errno);
121: if(nfd>=0)
122: flabclr(nfd); /* for security unix */
123: return nfd;
124: }
125:
126: tcp_rcmd(host, port, locuser, remuser, cmd, fd2p)
127: char *host, *port, *locuser, *remuser, *cmd;
128: int *fd2p;
129: {
130: char buf[1];
131: int fd;
132: struct in_service *sp;
133: struct tcpuser tu;
134: in_addr in_address();
135:
136: tu.faddr = in_address(host);
137: if(tu.faddr == 0){
138: fprintf(stderr, "%s: unknown host\n", host);
139: return(-1);
140: }
141: sp = in_service(port, "tcp", 0L);
142: if(sp == 0){
143: fprintf(stderr, "%s: unknown service\n", port);
144: return(-1);
145: }
146: tu.fport = sp->port;
147: fd = tcp_sock();
148: if(fd < 0){
149: perror(host);
150: return(-1);
151: }
152: tu.laddr = INADDR_ANY;
153: tu.lport = 0;
154: tu.param = 0;
155: if(tcp_connect(fd, &tu) < 0){
156: fprintf(stderr, "%s: connection failed\n", host);
157: goto bad;
158: }
159:
160: if(fd2p == 0)
161: write(fd, "", 1);
162: else
163: goto bad; /* later */
164:
165: write(fd, locuser, strlen(locuser)+1);
166: write(fd, remuser, strlen(remuser)+1);
167: write(fd, cmd, strlen(cmd)+1);
168:
169: if(read(fd, buf, 1) != 1){
170: perror(host);
171: goto bad;
172: }
173: if(buf[0] != 0){
174: while(read(fd, buf, 1) == 1){
175: write(2, buf, 1);
176: if(buf[0] == '\n')
177: break;
178: }
179: goto bad;
180: }
181: return(fd);
182: bad:
183: close(fd);
184: return(-1);
185: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.