File:  [Research Unix] / researchv10no / ipc / bin / OLDdkcc / dkcc.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:21:34 2018 UTC (8 years, 1 month ago) by root
Branches: belllabs, MAIN
CVS tags: researchv10, HEAD
researchv10 Norman

/*
 *	dkcc -- Remote Execute or Login over DATAKIT VCS to UNIX-V
 */
	static char	SCCSID[] = "@(#)dkrx.c	2.1 DKHOST 84/07/03";

#include <stdio.h>
#include <ipc.h>
#include "sysexits.h"
#include "string.h"
/* extern int	dkp_ld ; */
/* extern char *	dkerror ; */

	char		system[64];
	char		*ttyname();

main(argc, argv)
	char		**argv;
{
	register int	f, exitcode;
	register char	*p, *ttyn;
	int		force, env;
	extern char *miscfield() ;
	char *		cmdname ;

	cmdname = argv[0] ;
	if(p = strrchr(argv[0], '/'))
		strcpy(system, p+1);
	else
		strcpy(system, argv[0]);

	argc--; argv++;

	if(strcmp(argv[0], "-f") == 0){
		force = 1;
		argc--; argv++;
	}else
		force = 0;

	env = 1;

	if(strcmp(system, "dkcc") == 0) {
		if(argc == 0){
			fprintf(stderr, "Usage:  dkcc system [ command [ args ] ]\n");
			exit(EX_USAGE);
		}


		strcpy(system, argv[0]);

		argc--; argv++;
	}


	if(argc > 0)
		strcpy(system, maphost(system, 'x', "rx", "aevx", ""));
	else
		strcpy(system, maphost(system, 'l', "rl", "vx", ""));

	if(p = miscfield((argc > 0) ? 'x' : 'l', 'c'))
		execalt(p, system, argv);

	if(p = miscfield((argc > 0) ? 'x' : 'l', 'v'))
		env = (*p == 'y');

	f = ipcopen (ipcpath (system, "dk", ""), "heavy");
	if (f < 0) {
		fprintf(stderr,
			"%s: call to %s failed, %s\n", cmdname, system, errstr);
		exit (-f);
	}

	exitcode = 0;

	if(env)
		exitcode = dkxenviron(f);

	if(exitcode >= 0 && argc > 0)
		exitcode = sendargs(f, argv, !!miscfield('x', 's'));

	if(exitcode >= 0)
		exitcode = dkxstdio(f);

	if(exitcode == -EX_IOERR && argc == 0)
		exit(0);		/* no exitcode specified */
	else if(exitcode < 0)
		exit(-exitcode);	/* if error processing the call */
	else if(exitcode & 0xFF)
		exit(exitcode | 0x80);	/* remote terminated on signal */
	else
		exit(exitcode>>8);	/* else it finished with this code */
}

execalt(string, system, argv)
	char		*string, *system;
	char		*argv[];
{
	char		**ap, *args[32];

	ap = args;

	do{
		*ap++ = string;

		if(string = strchr(string, ':'))
			*string++ = '\0';
	}while(string);

	*ap++ = system;
	while(*ap++ = *argv++);

	execvp(args[0], args);

	fprintf(stderr, "dk: Can't exec %s\n", args[0]);
	exit(EX_UNAVAILABLE);
}

sendargs(fd, argarray, minusc)
	char		*argarray[];
{
	register int	aoffset;
	char		argstring[2048];

	if(minusc){
		aoffset = 3;
		strcpy(argstring, "-c");
	}else
		aoffset = 0;

	return(dkxlwrite(fd, argstring, bldargs(&argstring[aoffset], argarray) + aoffset));
}

bldargs(args, argv)
	char		*args;
	register char	*argv[];
{
	register char	*s, *t;

	s = args;

	if (t = *argv++) {
		while (*s++ = *t++);

		s[-1] = ' ';
	}
	while(t = *argv++){
		*s++ = '"';

		while(*s++ = *t++);

		s[-1] = '"';
		*s++ = ' ';
	}
	*s++ = '\0';
	return(s - args);
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.