|
|
1.1 ! root 1: /* usage: connect hostname (answer|send|notice) (in|out) program [ args ... ] */ ! 2: /* TODO: should librarify the bit for opening an rsh-authenticated connection. */ ! 3: ! 4: #include <sys/types.h> ! 5: #include <sys/socket.h> ! 6: #include <netinet/in.h> ! 7: #include <netdb.h> ! 8: #include <pwd.h> ! 9: #include <stdio.h> ! 10: #include <string.h> ! 11: #include "../paths.h" ! 12: ! 13: int ! 14: main(int argc, char *argv[]) ! 15: { ! 16: int fd; ! 17: struct hostent *host; ! 18: struct servent *serv; ! 19: struct passwd *pw; ! 20: int lport; ! 21: struct sockaddr_in sin; ! 22: char byte; ! 23: ! 24: if (argc < 5) ! 25: exit(1); ! 26: ! 27: host = gethostbyname(argv[1]); ! 28: if (!host) { ! 29: fprintf(stderr, "connect: can't get host '%s'\n", argv[1]); ! 30: exit(1); ! 31: } ! 32: ! 33: serv = getservbyname("dist", "tcp"); ! 34: if (!serv) { ! 35: fprintf(stderr, "connect: can't get 'dist' port number\n"); ! 36: exit(1); ! 37: } ! 38: ! 39: pw = getpwuid(getuid()); /* we assume unique uid/name map */ ! 40: if (!pw) { ! 41: fprintf(stderr, "connect: can't get user name\n"); ! 42: exit(1); ! 43: } ! 44: ! 45: chdir(SDIR); ! 46: ! 47: lport = 1023; ! 48: fd = rresvport(&lport); ! 49: if (fd < 0) { ! 50: perror("connect: getting socket"); ! 51: exit(1); ! 52: } ! 53: ! 54: sin.sin_family = host->h_addrtype; ! 55: memcpy(&sin.sin_addr, host->h_addr, host->h_length); ! 56: sin.sin_port = serv->s_port; ! 57: if (connect(fd, &sin, sizeof sin) < 0) { ! 58: perror("connect: opening connection"); ! 59: exit(1); ! 60: } ! 61: ! 62: write(fd, "", 1); /* a NUL byte */ ! 63: write(fd, pw->pw_name, strlen(pw->pw_name) + 1); ! 64: write(fd, pw->pw_name, strlen(pw->pw_name) + 1); ! 65: if (read(fd, &byte, 1) != 1 || byte != '\0') { ! 66: fprintf(stderr, "connect: rsh authentication failed\n"); ! 67: exit(1); ! 68: } ! 69: ! 70: write(fd, argv[2], strlen(argv[2]) + 1); ! 71: ! 72: if (strchr(argv[3], 'i')) ! 73: dup2(fd, 0); ! 74: if (strchr(argv[3], 'o')) ! 75: dup2(fd, 1); ! 76: close(fd); ! 77: execv(argv[4], &argv[4]); ! 78: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.