2.11BSD/src/local/mtools/mcopy.c

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

/*
 * A front-end to the mread/mwrite commands.
 *
 * Emmet P. Gray			US Army, HQ III Corps & Fort Hood
 * ...!uunet!uiucuxc!fthood!egray	Attn: AFZF-DE-ENV
 * fthood!egray@uxc.cso.uiuc.edu	Directorate of Engineering & Housing
 * 					Environmental Management Office
 * 					Fort Hood, TX 76544-5057
 */

#include <stdio.h>
#include <ctype.h>
#include "patchlevel.h"

#define NONE	0
#define MREAD	1
#define MWRITE	2
#define MKDIR

main(argc, argv)
int argc;
char *argv[];
{
	extern int optind;
	extern char *optarg;
	int i, oops, msdos_args, unix_args, destination;
	char **nargv, **malloc();
	void exit();
					/* get command line options */
	msdos_args = 0;
	unix_args = 0;
	oops = 0;
	while ((i = getopt(argc, argv, "tnvm")) != EOF) {
		switch (i) {
			case 't':
			case 'n':
			case 'v':
			case 'm':
				break;
			default:
				oops = 1;
				break;
		}
	}

	if (oops || (argc - optind) < 2) {
		fprintf(stderr, "Mtools version %s, dated %s\n", VERSION, DATE);
		fprintf(stderr, "Usage: %s [-tnvm] sourcefile targetfile\n", argv[0]);
		fprintf(stderr, "       %s [-tnvm] sourcefile [sourcefiles...] targetdirectory\n", argv[0]);
		exit(1);
	}
					/* last file determines the direction */
	if (argv[argc - 1][1] == ':')
		destination = MWRITE;
	else
		destination = MREAD;

					/* count the arguments */
	for (i = optind; i < argc; i++) {
		if (argv[i][1] == ':')
			msdos_args++;
		else
			unix_args++;
	}

	if (destination == MREAD && unix_args > 1) {
		fprintf(stderr, "%s: Duplicate destination files\n", argv[0]); 
		exit(1);
	}
					/* chaining of mread and mwrite */
	if (destination == MWRITE && msdos_args > 1)
		chain(argc, argv);

	/*
	 * Copy the *argv[] array in case your Unix doesn't end the array
	 * with a null when it passes it to main()
	 */
	nargv = (char **) malloc((unsigned int) (argc + 1) * sizeof(*argv));
	nargv[0] = "mcopy";
	for (i = 1; i < argc; i++)
		nargv[i] = argv[i];
	nargv[argc] = NULL;

	if (destination == MWRITE)
		execvp("mwrite", nargv);
	else
		execvp("mread", nargv);
}

chain(argc, argv)
int argc;
char *argv[];
{
	extern int optind;
	int i, j, pid, status;
	char *tmpdir, *mktemp(), **nargv, **malloc(), buf[256], *strcpy();
	char *unixname(), *realloc();
	void exit();

	nargv = (char **) malloc((unsigned int) (argc + 4) * sizeof(*argv));
	nargv[0] = "mread";
	nargv[1] = "-n";
					/* copy only the msdos arguments */
	j = 2;
	for (i = optind; i < argc -1; i++) {
		if (argv[i][1] == ':')
			nargv[j++] = argv[i];
	}
					/* create a temp directory */
	tmpdir = mktemp("/tmp/mtoolsXXXXXX");
	if (mkdir(tmpdir, 0777) < 0)
		perror("mkdir");

	nargv[j++] = tmpdir;
	nargv[j] = NULL;

	printf("reading...\n");
	if (!(pid = fork()))
		execvp("mread", nargv);

	while (wait(&status) != pid)
		;
					/* reconstruct the argv[] */
	nargv[0] = "sh";
	nargv[1] = "-c";
	nargv[2] = (char *) malloc(7);
	strcpy(nargv[2], "mwrite");

	j = 3;
	for (i = 1; i < argc -1; i++) {
		/*
		 * Substitute the msdos arguments for their unix
		 * counterparts that have already been copied to tmpdir.
		 */
		if (argv[i][1] == ':')
			sprintf(buf, "%s/%s", tmpdir, unixname(argv[i]));
		else
			strcpy(buf, argv[i]);

		nargv[2] = (char *) realloc(nargv[2], sizeof(nargv[2]) + sizeof(buf));
		strcat(nargv[2], " ");
		strcat(nargv[2], buf);
	}
					/* protect last arg from expansion */
	sprintf(buf, "'%s'", argv[i]);
	nargv[2] = (char *) realloc(nargv[2], sizeof(nargv[2]) + sizeof(buf));
	strcat(nargv[2], " ");
	strcat(nargv[2], buf);

	nargv[3] = NULL;

	printf("writing...\n");
	if (!(pid = fork()))
		execvp("sh", nargv);

	while (wait(&status) != pid)
		;
					/* clobber the directory */
	sprintf(buf, "rm -fr %s", tmpdir);
	system(buf);
	exit(0);
}

char *
unixname(filename)
char *filename;
{
	char *s, *temp, *strcpy(), *strrchr(), buf[256];
	static char ans[13];

	strcpy(buf, filename);
	temp = buf;
					/* skip drive letter */
	if (buf[0] && buf[1] == ':')
		temp = &buf[2];
					/* find the last separator */
	if (s = strrchr(temp, '/'))
		temp = s + 1;
	if (s = strrchr(temp, '\\'))
		temp = s + 1;
					/* xlate to lower case */
	for (s = temp; *s; ++s) {
		if (isupper(*s))
			*s = tolower(*s);
	}

	strcpy(ans, temp);
	return(ans);
}

#ifdef MKDIR
mkdir(path, mode)
char *path;
int mode;
{
	char buf[256];
	sprintf(buf, "mkdir %s", path);
	return(system(buf));
}
#endif /* MKDIR */