|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)rexec.c 4.8 83/08/18";
3: #endif
4:
5: #include <sys/types.h>
6: #include <sys/socket.h>
7:
8: #include <netinet/in.h>
9:
10: #include <stdio.h>
11: #include <netdb.h>
12: #include <errno.h>
13:
14: extern errno;
15: char *index(), *sprintf();
16: int rexecoptions;
17: char *getpass(), *getlogin();
18:
19: rexec(ahost, rport, name, pass, cmd, fd2p)
20: char **ahost;
21: int rport;
22: char *name, *pass, *cmd;
23: int *fd2p;
24: {
25: int s, timo = 1, s3;
26: struct sockaddr_in sin, sin2, from;
27: char c;
28: short port;
29: struct hostent *hp;
30:
31: hp = gethostbyname(*ahost);
32: if (hp == 0) {
33: fprintf(stderr, "%s: unknown host\n", *ahost);
34: return (-1);
35: }
36: *ahost = hp->h_name;
37: ruserpass(hp->h_name, &name, &pass);
38: retry:
39: s = socket(AF_INET, SOCK_STREAM, 0);
40: if (s < 0) {
41: perror("rexec: socket");
42: return (-1);
43: }
44: sin.sin_family = hp->h_addrtype;
45: sin.sin_port = rport;
46: bcopy(hp->h_addr, (caddr_t)&sin.sin_addr, hp->h_length);
47: if (connect(s, &sin, sizeof(sin)) < 0) {
48: if (errno == ECONNREFUSED && timo <= 16) {
49: (void) close(s);
50: sleep(timo);
51: timo *= 2;
52: goto retry;
53: }
54: perror(hp->h_name);
55: return (-1);
56: }
57: if (fd2p == 0) {
58: (void) write(s, "", 1);
59: port = 0;
60: } else {
61: char num[8];
62: int s2, sin2len;
63:
64: s2 = socket(AF_INET, SOCK_STREAM, 0);
65: if (s2 < 0) {
66: (void) close(s);
67: return (-1);
68: }
69: listen(s2, 1);
70: sin2len = sizeof (sin2);
71: if (getsockname(s2, (char *)&sin2, &sin2len) < 0 ||
72: sin2len != sizeof (sin2)) {
73: perror("getsockname");
74: (void) close(s2);
75: goto bad;
76: }
77: port = ntohs((u_short)sin2.sin_port);
78: (void) sprintf(num, "%d", port);
79: (void) write(s, num, strlen(num)+1);
80: { int len = sizeof (from);
81: s3 = accept(s2, &from, &len, 0);
82: close(s2);
83: if (s3 < 0) {
84: perror("accept");
85: port = 0;
86: goto bad;
87: }
88: }
89: *fd2p = s3;
90: }
91: (void) write(s, name, strlen(name) + 1);
92: /* should public key encypt the password here */
93: (void) write(s, pass, strlen(pass) + 1);
94: (void) write(s, cmd, strlen(cmd) + 1);
95: if (read(s, &c, 1) != 1) {
96: perror(*ahost);
97: goto bad;
98: }
99: if (c != 0) {
100: while (read(s, &c, 1) == 1) {
101: (void) write(2, &c, 1);
102: if (c == '\n')
103: break;
104: }
105: goto bad;
106: }
107: return (s);
108: bad:
109: if (port)
110: (void) close(*fd2p);
111: (void) close(s);
112: return (-1);
113: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.