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: }

Defined functions

rexec defined in line 25; used 1 times

Defined variables

rexecoptions defined in line 22; never used
sccsid defined in line 8; never used
Last modified: 1986-03-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 906
Valid CSS Valid XHTML 1.0 Strict