[comp.os.minix] Patches for cp

jrstu@cbnewsd.ATT.COM (james.stuhlmacher) (10/03/89)

Here are two patch files for cp(1) and touch(1).

When one or more of cp's source arguments are directories, cp(1) will
treat the directory as a file and copy it to a file.  I noticed this
when I wanted to save some files in the current directory to the
subdirectory "sav" with the command: 

	cp * sav

This resulted in a file with the name "sav" in the directory "sav". 
The patch causes cp(1) to check if the source is a directory before
copying it.  If it is a directory, then it will not copy the
directory, but instead print a message and continue on.  I also added
exit status when there are multiple sources. 

When touch(1) was given an argument of a file that did not exist, it
would call creat(2) with a mask of 0777.  This causes the file to be
executable if umask does not force it otherwise.  Since the file is
empty it should not be executable.  A mask of 0666 is be used instead. 

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  cp.cdif touch.cdif
# Wrapped by jims on Mon Oct  2 21:02:16 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'cp.cdif' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'cp.cdif'\"
else
echo shar: Extracting \"'cp.cdif'\" \(1991 characters\)
sed "s/^X//" >'cp.cdif' <<'END_OF_FILE'
X*** ocp.c	Sun Oct  1 18:27:57 1989
X--- cp.c	Mon Oct  2 20:58:10 1989
X***************
X*** 22,28 ****
X    m = sbuf.st_mode & S_IFMT;
X    if (s >= 0 && m == S_IFDIR) {
X  	/* Last argument is a directory. */
X! 	cp_to_dir(argc, argv);
X    } else if (argc > 3) {
X  	/* More than 2 arguments and last one is not a directory. */
X  	usage();
X--- 22,28 ----
X    m = sbuf.st_mode & S_IFMT;
X    if (s >= 0 && m == S_IFDIR) {
X  	/* Last argument is a directory. */
X! 	exit(cp_to_dir(argc, argv));
X    } else if (argc > 3) {
X  	/* More than 2 arguments and last one is not a directory. */
X  	usage();
X***************
X*** 37,42 ****
X--- 37,47 ----
X  	fd1 = open(argv[1], 0);
X  	if (fd1 < 0) {stderr3("cannot open ", argv[1], "\n"); exit(1);}
X  	fstat(fd1, &sbuf);
X+ 	m = sbuf.st_mode & S_IFMT;
X+ 	if (m == S_IFDIR) {
X+ 		stderr3("<", argv[1], "> directory\n");
X+ 		exit(1);
X+ 	}
X  	fd2 = creat(argv[2], sbuf.st_mode & 0777);
X  	if (fd2 < 0) {stderr3("cannot create ", argv[2], "\n"); exit(2);}
X  	fstat(fd2, &sbuf2);
X***************
X*** 57,63 ****
X  int argc;
X  char *argv[];
X  {
X!   int i, fd1, fd2;
X    char dirname[256], *ptr, *dp;
X    struct stat sbuf;
X  
X--- 62,68 ----
X  int argc;
X  char *argv[];
X  {
X!   int i, mode, fd1, fd2, exit_status = 0;
X    char dirname[256], *ptr, *dp;
X    struct stat sbuf;
X  
X***************
X*** 65,70 ****
X--- 70,76 ----
X  	fd1 = open(argv[i], 0);
X  	if (fd1 < 0) {
X  		stderr3("cannot open ", argv[i], "\n");
X+ 		exit_status = 1;
X  		continue;
X  	}
X  
X***************
X*** 82,94 ****
X--- 88,110 ----
X  	while (*ptr != 0) *dp++ = *ptr++;
X  	*dp++ = 0;
X  	fstat(fd1, &sbuf);
X+ 	mode = sbuf.st_mode & S_IFMT;
X+ 	if (mode == S_IFDIR) {
X+ 		stderr3("<", argv[i], "> directory\n");
X+ 		exit_status = 1;
X+ 		close(fd1);
X+ 		continue;
X+ 	}
X  	fd2 = creat(dirname, sbuf.st_mode & 0777);
X  	if (fd2 < 0) {
X  		stderr3("cannot create ", dirname, "\n");
X+ 		exit_status = 2;
X+ 		close(fd1);
X  		continue;
X  	}
X  	copyfile(fd1, fd2, dirname);
X    }
X+   return(exit_status);
X  }
X  
X  
END_OF_FILE
if test 1991 -ne `wc -c <'cp.cdif'`; then
    echo shar: \"'cp.cdif'\" unpacked with wrong size!
fi
# end of 'cp.cdif'
fi
if test -f 'touch.cdif' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'touch.cdif'\"
else
echo shar: Extracting \"'touch.cdif'\" \(449 characters\)
sed "s/^X//" >'touch.cdif' <<'END_OF_FILE'
X*** otouch.c	Sun Oct  1 18:09:37 1989
X--- touch.c	Sun Oct  1 18:12:07 1989
X***************
X*** 63,69 ****
X    	/* file does not exist */
X  	if (no_creat == 1) 
X  		return(0);
X! 	else if ( (fd = creat(name, 0777)) < 0) {
X  	        return(1);
X  	} else { 
X  		close(fd);
X--- 63,69 ----
X    	/* file does not exist */
X  	if (no_creat == 1) 
X  		return(0);
X! 	else if ( (fd = creat(name, 0666)) < 0) {
X  	        return(1);
X  	} else { 
X  		close(fd);
END_OF_FILE
if test 449 -ne `wc -c <'touch.cdif'`; then
    echo shar: \"'touch.cdif'\" unpacked with wrong size!
fi
# end of 'touch.cdif'
fi
echo shar: End of shell archive.
exit 0

James Stuhlmacher
j.stuhlmacher@ATT.com
..!att!ihlpb!jims