[comp.os.minix] Rename

ncpascal@ndsuvax.UUCP (Freeman Pascal) (12/17/87)

Hello,

    While I was trying to port the BSD version of "arc" to MINIX I discovered
I needed rename(2), so I wrote it.  My version performs just as the BSD ver-
sion does (I only have BSD 4.3 Manuals as references).  Although there was
no mention of what happens if the "from" file exist but is on another device
I decided to make ever effort to maintain the orginal files and check if
all conditions are correct before I did the actual rename.  The "from" file
is not removed if it exists but is on another device.

    If you find any bugs and such with rename please pass them on.  I hope
this is of some use to you.  Just unshar it and follow the steps in the
"INSTALL" file.

				Freeman P Pascal IV
				ncpascal@ndsuvax


#! /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 archive 1 (of 1)."
# Contents:  INSTALL Makefile makelibc rename.c tst.c
# Wrapped by ncpascal@ndsuvax on Wed Dec 16 22:27:05 1987
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f INSTALL -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"INSTALL\"
else
echo shar: Extracting \"INSTALL\" \(619 characters\)
sed "s/^X//" >INSTALL <<'END_OF_INSTALL'
XManifest:
X--------
X	INSTALL		This file
X	Makefile	makefile for tst
X	makelibc	shell script to make C library
X	rename.c	library function (rename(3))
X	tst.c		test file for rename(3)
X
XInstallation instructions:
X-------------------------
X
X1.  Compile rename.c as a library routine and place in /usr/lib/libc.a.
X    If you are using the makelibc shell script that was posted quite 
X    awhile back just append "ar av libc.a rename.s" to the beginning 
X    and run.  I am including my version if you don't have it.
X
X2.  Run makefile to compile tst.c.  
X
X3.  Run tst to varify results:
X
X	Usage:	tst file-from file-to
X
X3.  Enjoy
END_OF_INSTALL
if test 619 -ne `wc -c <INSTALL`; then
    echo shar: \"INSTALL\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f Makefile -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"Makefile\"
else
echo shar: Extracting \"Makefile\" \(113 characters\)
sed "s/^X//" >Makefile <<'END_OF_Makefile'
X#
X#	Makefile for rename(3) test file
X#
XCFLAGS = -T. -i
X
Xtst:		tst.c 
X	cc $(CFLAGS) -o tst tst.c
X	@echo "	done."
X
END_OF_Makefile
if test 113 -ne `wc -c <Makefile`; then
    echo shar: \"Makefile\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f makelibc -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"makelibc\"
else
echo shar: Extracting \"makelibc\" \(2138 characters\)
sed "s/^X//" >makelibc <<'END_OF_makelibc'
X#
X#  makelibc - Make C library
X#
X#				- NOTE -
X#
X#  This shell script will -REMOVE- the old version of libc.a if it
X#  exists in the current directory.  It will also -REPLACE- the old
X#  /usr/lib/libc.a with version just packaged.
X#
Xif (test -f ./libc.a)		# remove old libc.a if it exists
X	then rm ./libc.a
Xfi
Xar av libc.a getwd.s rename.s			# getwd(3) rename(2)
Xar av libc.a dir.s scandir.s			# directory(3), scandir(3)
Xar av libc.a getgrp.s				# process groups
Xar av libc.a termcap.s gtty.s stty.s		# v1.2 update
Xar av libc.a popen.s ctime.s system.s qsort.s	# v1.2 upgrade
Xar av libc.a regexp.s regsub.s
Xar av libc.a getopt.s getgrent.s getpwent.s crypt.s
Xar av libc.a fdopen.s
Xar av libc.a fgets.s fprintf.s fputs.s fread.s freopen.s fclose.s
Xar av libc.a fopen.s fseek.s ftell.s fwrite.s gets.s scanf.s getc.s printdat.s
Xar av libc.a fflush.s setbuf.s sprintf.s doprintf.s putc.s ungetc.s strcmp.s
Xar av libc.a access.s chdir.s chmod.s chown.s chroot.s creat.s dup.s dup2.s
Xar av libc.a exec.s exit.s cleanup.s fork.s isatty.s fstat.s getegid.s getenv.s
Xar av libc.a geteuid.s getgid.s getpass.s close.s getuid.s ioctl.s kill.s
Xar av libc.a link.s lseek.s malloc.s brk.s brk2.s brksize.s mknod.s mktemp.s
Xar av libc.a getpid.s mount.s open.s perror.s pipe.s prints.s read.s setgid.s
Xar av libc.a setuid.s sleep.s alarm.s pause.s signal.s catchsig.s stat.s
Xar av libc.a stime.s strcat.s strcpy.s strlen.s strncat.s strncmp.s strncpy.s
Xar av libc.a ftime.s
Xar av libc.a sync.s time.s times.s umask.s umount.s unlink.s utime.s wait.s
Xar av libc.a stderr.s write.s syslib.s call.s atoi.s message.s sendrec.s
Xar av libc.a printk.s abort.s itoa.s stb.s abs.s atol.s ctype.s index.s bcopy.s
Xar av libc.a getutil.s rand.s rindex.s adi.s and.s cii.s cms.s cmu4.s com.s
Xar av libc.a csa2.s csb2.s cuu.s .dup.s dvi.s dvi4.s dvu.s dvu4.s exg.s fakfp.s
Xar av libc.a gto.s iaar.s ilar.s inn.s ior.s isar.s lar2.s loi.s mli.s mli4.s
Xar av libc.a ngi.s nop.s rck.s rmi.s rmi4.s rmu.s rmu4.s rol.s ror.s sar2.s
Xar av libc.a sbi.s set.s sli.s sri.s sti.s xor.s error.s unknown.s trp.s
Xar av libc.a setjmp.s
X
Xcp libc.a /usr/lib
Xecho
Xecho "Done."
Xecho
X
END_OF_makelibc
if test 2138 -ne `wc -c <makelibc`; then
    echo shar: \"makelibc\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f rename.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"rename.c\"
else
echo shar: Extracting \"rename.c\" \(1764 characters\)
sed "s/^X//" >rename.c <<'END_OF_rename.c'
X/*
X *	rename() - rename a file
X */
X#include <sys/types.h>
X#include <sys/stat.h>
X#include <signal.h>
X#include <errno.h>
X
X#define	PUBLIC
X
X#ifndef	NULL
X#define NULL	0
X#endif
X
Xextern int	errno;
X
X/*========================================================================*\
X**				rename()				  **
X\*========================================================================*/
XPUBLIC int
Xrename( from, to )
Xchar	*from, *to;
X{
X/*
X *	Attempts to link 'from' as 'to'.  If 'to' exists it is unlinked.
X *
X *	NOTE:  	'rename()' will not rename across file systems or 
X *		file types.  Also, if an attempt is made to copy across
X *		file systems both files will be left intact and an
X *		error will be returned.
X */
X  struct stat	s_to, s_from;
X  int		(*s_int)(), (*s_hup)(), (*s_quit)();
X  int		ret = 0;
X  
X  /*
X   *	get status if 'from' and 'to', if either attemp fails we know 
X   *	one of the files doesn't exist.  if 'from' doesn't exist then
X   *	return an error condition.  if both files exist then test if
X   *	their both on the same file system.  if 'to' doesn't exist then
X   *	don't worry about it, it soon will.
X   */
X  if (stat( from, &s_from ) == 0) {
X		if (stat( to, &s_to ) == 0) {
X			if ( s_to.st_dev  == s_from.st_dev ) {
X				errno = EXDEV;
X				return( -1 );
X			}
X		}
X		/*
X		 *	Ignore SIGINT, SIGHUP, and SIGQUIT until 
X		 *	we'er finished.
X		 */
X		s_int  = signal( SIGINT,  SIG_IGN );
X		s_hup  = signal( SIGHUP,  SIG_IGN );
X		s_quit = signal( SIGQUIT, SIG_IGN );  
X		/*	
X		 *	does 'to' exist? if so remove it
X		 */
X		ret = unlink( to );
X		if ((ret = link( from, to )) == 0) 
X			ret = unlink( from );
X		/*
X		 *	Restore signals
X		 */
X		signal( SIGINT,  s_int  );
X		signal( SIGHUP,  s_hup  );
X		signal( SIGQUIT, s_quit );
X		return( ret );
X  } else
X	return( -1 );
X}
END_OF_rename.c
if test 1764 -ne `wc -c <rename.c`; then
    echo shar: \"rename.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f tst.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"tst.c\"
else
echo shar: Extracting \"tst.c\" \(295 characters\)
sed "s/^X//" >tst.c <<'END_OF_tst.c'
Xmain( argc, argv )
Xchar	*argv[];
X{
X  int	ret = 0;
X
X  if (argc != 3) {
X	std_err( "\nUsage:  " );
X	std_err( argv[0] );
X	std_err( "   from_file to_file\n" );
X	exit( 1 );
X  }
X  if ((ret = rename( argv[1], argv[2] )) != 0) {
X	printf( "\nreturn = %d\n", ret );
X	perror( argv[0] );
X  } 
X  exit( 0 );
X}
END_OF_tst.c
if test 295 -ne `wc -c <tst.c`; then
    echo shar: \"tst.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 1 \(of 1\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 1 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0