4.4BSD/usr/src/old/berknet/netcp.c

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

static char sccsid[] = "@(#)netcp.c	4.1	(Berkeley)	9/12/82";

# include "defs.h"
/* sccs id variable */
static char *netcp_sid = "@(#)netcp.c	1.2";


/* global variables */
struct userinfo status;

/* netcp - copy with remote machines */
main(argc,argv)
  char **argv;
	{
	char rcmd[BUFSIZ], acmd[BUFSIZ], *sn;
	char mchto, mchfrom, sfnto[FNS], sfnfrom[FNS];

	argv[argc] = 0;
	debugflg = DBV;
	if(argc < 3)goto usage;
	argv++, argc--;
	while(argv[0][0] == '-'){
		switch(argv[0][1]){
		case 'b':	status.nonotify++; break;
		case 'f':	status.force++; break;
		case 'l':	harg(status.login); break;
		case 'n':	status.nowrite++; break;
		case 'p':	harg(status.mpasswd); break;
		case 'q':	status.quiet++; break;
		default:	fprintf(stderr,"Unknown option %s\n",argv[0]);
				break;
		}
		argc--;argv++;
		}
	if(argc > 2)goto usage;
	sprintf(rcmd,"netcp %s %s",argv[0],argv[1]);
	mchfrom = analfile(sfnfrom,argv[0]);
	mchto =   analfile(sfnto,argv[1]);
	if(mchfrom  == 0 || mchto  == 0){
		fprintf(stderr,"Unknown machine\n");
		exit(EX_NOHOST);
	}
	if(sfnfrom[0] == 0 || sfnto[0] == 0){
		fprintf(stderr,"Must specify both file names\n");
		exit(EX_USAGE);
	}
	if(mchfrom == local && mchto == local){
		fprintf(stderr,"Error: both files are on this machine\n");
		exit(EX_USAGE);
		}
	else if(mchfrom == local)
		kexecl(netcmd,"net","-m",longname(mchto), "-o",sfnto,"-s",sfnfrom,
			"-c",rcmd,"cat",0);
	else if(mchto == local){
		kexecl(netcmd,"net","-m",longname(mchfrom), "-r",sfnto,"-i",sfnfrom,
			"-c",rcmd,"cat",0);
		}
	/* remote for both */
	else if(mchto == mchfrom)
		kexecl(netcmd,"net","-m",longname(mchto),"-c",rcmd,"cp",sfnfrom,sfnto,0);
	else {
		/* experimental - still needs debugging */
		fprintf(stderr,
			"Experimental - Machines normally must be the same\n");

		/* collect info on the "To Machine" */
		remote = mchto;
		/* get status.login and passwd from .netrc if poss. */
		commandfile();
		if(status.login[0] == 0 || status.mpasswd[0] == 0){
			sn = SnFromUid(getuid());
			if(sn == NULL){
				fprintf(stderr,"Unknown user\n");
				exit(EX_OSFILE);
			}
			strcpy(status.localname,sn);
			/* check environ */
			envloginpasswd(remote,status.login,status.mpasswd);
			/* prompt on terminal */
			promptlogin(remote);
		}
		/* should use -q option */
		sprintf(acmd,"%s -l %s -p %s %s %s",
			NETCPCMD,status.login,status.mpasswd,argv[0],argv[1]);

		/* send the netcp command to the "From" machine */
		remote = mchfrom;
		status.login[0] = status.mpasswd[0] = 0;
		mexecl(netcmd,"net","-m",longname(mchfrom),"-c",rcmd,acmd,0);
		}
	perror(netcmd);
	fprintf(stderr,"Network is down\n");
	exit(EX_UNAVAILABLE);
usage:
	printf("Usage: netcp [-l ...] [-p ...] [-f] [-n] fromfile tofile\n");
	exit(EX_USAGE);
	}

analfile(sfn,addr)
char *sfn;
char *addr;
{
	register char *file;
	char work[FNS], *s, c0,c1,c2,c3,c,colon=0,mch;
	mch = local;
	strcpy(work,addr);
	s = work;
	file = s;
	while(*s){
		if(*s == '/')break;
		if(*s == ':'){
			colon = 1;
			*s++ = 0;
			break;
		}
		s++;
	}
	if(colon){ /* name specified */
		mch = lookup(file);
		if(mch == 0){
			return(mch);
			}
		file = s;
		}
	else {
		s  = file;
		c0 = *s++;
		c1 = *s++;
		c2 = *s++;
		c3 = *s++;
		if(c0 == '/' && c1 != '/' && islower(c1))
			if(c3 == '/')mch = c1;		/* CC name */
	}
	strcpy(sfn,file);
	s = sfn;
	/* check for bad chars in file name */
	while(c = *s++)
		if(c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\b')
			err("Invalid character '%c'\n",c);
	return(mch);
	}