10 /* socket extensions */
11 #include <sys/socket.h>
12 #include <netinet/in.h>
18 static char pbotch[] = "rcmd: protocol botch\n";
19 static char lbotch[] = "rcmd: botch starting error stream\n";
27 rcmd(char **dst, int port, char *luser, char *ruser, char *cmd, int *fd2p)
30 int i, fd, lfd, fd2, port2;
33 struct sockaddr_in in;
37 h = gethostbyname(*dst);
42 /* connect using a reserved tcp port */
43 fd = socket(PF_INET, SOCK_STREAM, 0);
46 r = _sock_findrock(fd, 0);
52 in.sin_family = AF_INET;
53 in.sin_port = htons(port);
54 memmove(&in.sin_addr, h->h_addr_list[0], sizeof(in.sin_addr));
55 if(connect(fd, &in, sizeof(in)) < 0){
62 /* create an error stream and wait for a call in */
63 for(i = 0; i < 10; i++){
64 lfd = rresvport(&port2);
67 if(listen(lfd, 1) == 0)
72 fprintf(stderr, pbotch);
76 snprintf(buf, sizeof buf, "%d", port2);
77 if(write(fd, buf, strlen(buf)+1) < 0){
80 fprintf(stderr, lbotch);
84 if(write(fd, "", 1) < 0){
85 fprintf(stderr, pbotch);
90 /* pass id's and command */
91 if(write(fd, luser, strlen(luser)+1) < 0
92 || write(fd, ruser, strlen(ruser)+1) < 0
93 || write(fd, cmd, strlen(cmd)+1) < 0){
96 fprintf(stderr, pbotch);
101 x = signal(SIGALRM, ding);
103 fd2 = accept(lfd, &in, &i);
111 fprintf(stderr, lbotch);
118 if(read(fd, &c, 1) != 1){
121 fprintf(stderr, pbotch);
129 if(read(fd, &c, 1) != 1)
131 if(i >= sizeof(buf)-1)
135 fprintf(stderr, "rcmd: %s\n", buf);