|
|
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.