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