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