V10/dk/cmd/rxtty.c

Compare this file to the similar file:
Show the results in this format:

#include <stdio.h>
#include <dk.h>

/*
 * program to run a command
 * on another cpu on Datakit
 */

int     rem;            /* remote file descriptor */
int     psize;          /* packet size */
int     t;

char    *std    = "-";

char buf[512];
FILE *CAT;

#define MAXCHARS 8192
char args[MAXCHARS];

char *bldargs(argv)
	register char *argv[];
{
	register char *s=args, *t;
	while(t= *argv++){	/* assignment = */
		while(*s = *t++)
			if(s++ >= &args[MAXCHARS-1]){
				fprintf(stderr, "rx: arg list too long\n");
				exit(1);
			}
		*s++=' ';
	}
	s[-1]='\0';
	return(args);
}

char *
basename(s)
	register char *s;
{
	register char *t;
	extern char *rindex();
	t=rindex(s, '/');
	return(t? t+1 : s);
}

main(argc, argv)
char **argv;
{
int filc;
int cat;
char **filv;
char *host;

        filv = &std;
        filc = 1;

        cat = 1;
        CAT = fdopen(cat, "w");
	host=basename(argv[0]);
	if(strcmp(host, "rxtty")==0 || strcmp(host, "rexec")==0){
		host=argv[1];
		argv++;
	}
	if(host==0){
		fprintf(stderr, "usage: rx host command\n");
		exit(1);
	}
	if(argv[1]==0){
		execl("/usr/bin/dcon", host, "-x", host, 0);
		execl("/bin/dcon", host, "-x", host, 0);
		fprintf(stderr, "rx: cannot exec dcon\n");
		exit(1);
	}
        rem = ttyexec(host, bldargs(&argv[1]));
        if (rem<0) {
		fprintf(stderr, "rx: call to %s failed\n", host);
                exit(1);
	}
        t = fork();
        if (t < 0) {
                fprintf(stderr, "rx: can't fork\n");
                exit(1);
        }

        if (t == 0) {
                to_proc(filc, filv);
        } else {
                argv[0][0] = 'F';
                from_proc();
        }
	exit(0) ;

}

to_proc(filc, filv)
char **filv;
{
register cc;

                while (1) {
                        cc = read(0, buf, sizeof buf);
                        if (cc <= 0)
                                break;
                        write(rem, buf, cc);
                }

        /*
         * flush buffer to proc,
         * then send logical EOF to
         * make it go away.
         */
done:
	write(rem, "", 0) ;
}

from_proc()
{
FILE *REM;
register cc;
static char buf[BUFSIZ];

        while ((cc = read(rem, buf, sizeof buf)) > 0) {
                write(1,  buf, cc);
        }
        kill(t, 2);
}

#include <sys/ioctl.h>

tdkexec(hname, cmd)
char *hname, *cmd;
{
	return(_tdkexec(hname, cmd, "exec"));
}

ttyexec(hname, cmd)
char *hname, *cmd ;
{
	return (_tdkexec(hname, cmd, "ttyexec")) ;
}

mesgexec(hname, cmd)
char *hname, *cmd;
{
	return(_tdkexec(hname, cmd, "mesgexec"));
}

_tdkexec(hname, cmd, service)
char *hname, *cmd;
char * service ;
{
int rem, v;
extern int pk_ld, dkp_ld, tty_ld, dt_ld ;
char dialstr[64] ;
char cmdname[32] ;
register char *cp1, *cp2 ;

	strcpy(dialstr, hname) ;
	strcat(dialstr, ".") ;
	strcat(dialstr, service) ;
	cp1 = cmdname ; cp2 = cmd ;
	while (*cp2 && (*cp2 != ' ')) {
		if (*cp2 == '/')
			cp1 = cmdname ;
		else
			*cp1++ = *cp2 ;
		cp2++ ;
	}
	*cp1 = '\0' ;
/****
	strcat(dialstr, ".") ;
	strcat(dialstr, cmdname) ;
 ****/
	rem = tdkdial(dialstr, 2) ;
	if (rem < 0) {
		fprintf(stderr, "can't rexec\n");
		return(-1);
	}
	v = dkproto(rem, dkp_ld);
	if (v < 0) {
		printf("can't start protocol\n");
		close(rem);
		return(-1);
	}
	if (tdklogin(rem) < 0)
		return -1 ;
	write(rem, cmd, strlen(cmd));
	write(rem, "\n", 1) ;
	return(rem);
}