Windows-Server-2003/sdktools/cp/cp.c

175 lines
4.4 KiB
C

/* cp - move from one file to another
*
* HISTORY:
*
* 3-Dec-90 w-barry ported to Win32.
* 07-Sep-90 w-wilson ported to cruiser
* 19-Mar-87 danl exit with 1 on any errors
*
*/
#include <ctype.h>
#include <fcntl.h>
#include <io.h>
#include <sys\types.h>
#include <sys\stat.h>
#include <malloc.h>
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include <process.h>
#include <windows.h>
#include <tools.h>
#include <string.h>
char src[MAX_PATH], dst[MAX_PATH], name[MAX_PATH];
__cdecl main (c, v)
int c;
char *v[];
{
struct findType fbuf, dbuf;
int i, t;
HANDLE fh;
char *s;
flagType fAsk = FALSE;
flagType fAppend = FALSE;
int iRtn = 0;
char *y;
ConvertAppToOem( c, v );
while (c > 1 && fSwitChr(*v[1])) {
lower( v[1] );
if (!strcmp( v[1]+1, "p" ))
fAsk = TRUE;
else
if (!strcmp( v[1]+1, "a" ))
fAppend = TRUE;
else
printf( "cp: invalid switch %s\n", v[1] );
c--;
v++;
}
if (c < 3) {
printf ("Usage: cp [/p] [/a] file1 [ file2 ...] target\n");
exit (1);
}
for (i=1; i<c; i++) {
findpath (v[i], src, FALSE);
pname (src);
v[i] = _strdup (src);
}
if (rootpath (v[c-1], dst) == -1) {
printf ("Cannot move to %s - %s\n", v[c-1], error ());
exit (1);
} else {
if ( dst[0] == '\\' && dst[1] == '\\' ) {
y = strbscan (&dst[3], "/\\");
if ( *y != '\0' ) {
y = strbscan( y+1, "/\\");
if ( *y == '\0' ) {
strcat(dst, "\\" );
}
}
}
}
if (fPathChr (dst[strlen(dst)-1])) {
SETFLAG (fbuf.fbuf.dwFileAttributes, FILE_ATTRIBUTE_DIRECTORY);
}
else if( ffirst( dst, FILE_ATTRIBUTE_DIRECTORY, &fbuf ) ) {
findclose( &fbuf ); /* Let next ffirst work */
RSETFLAG (fbuf.fbuf.dwFileAttributes, FILE_ATTRIBUTE_DIRECTORY);
}
else if (TESTFLAG(fbuf.fbuf.dwFileAttributes, FILE_ATTRIBUTE_DIRECTORY)) {
strcat (dst, "\\");
}
if (c != 3 && !TESTFLAG(fbuf.fbuf.dwFileAttributes, FILE_ATTRIBUTE_DIRECTORY)) {
if (!fAppend) {
printf ("Use /A switch to append more than 1 file to another file\n");
exit (1);
}
if( ( fh = CreateFile( dst, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 ) ) == (HANDLE)-1 ) {
printf ("Cannot create %s - %s\n", dst, error ());
exit (1);
}
for (i=1; i < c-1; i++) {
if (rootpath (v[i], src) == -1) {
printf ("Cannot move %s - %s\n", v[i], error ());
iRtn = 1;
continue;
}
printf( "%s", src );
fflush( stdout );
if (_access( src, 0 ) == -1) {
printf( " - file not found\n" );
iRtn = 1;
continue;
}
if (s = fappend(src, fh)) {
iRtn = 1;
printf (" %s\n", s);
}
else
printf (" [ok]\n");
}
CloseHandle( fh );
}
else
for (i=1; i < c-1; i++) {
if (rootpath (v[i], src) == -1) {
printf ("Cannot move %s - %s\n", v[i], error ());
iRtn = 1;
continue;
}
if (_access( src, 0 ) == -1) {
printf( "%s - file not found\n", src );
iRtn = 1;
continue;
}
strcpy (name, dst);
if (TESTFLAG(fbuf.fbuf.dwFileAttributes, FILE_ATTRIBUTE_DIRECTORY)) {
if (!fPathChr (name[strlen(name)-1]))
strcat (name, "\\");
upd (src, name, name);
}
if (!ffirst (name, -1, &dbuf) && fAsk) {
printf( "%s (delete?)", name );
fflush( stdout );
t = _getch();
t = tolower(t);
if (t != 'y')
if (t == 'p')
fAsk = FALSE;
else {
printf( " - skipped\n" );
continue;
}
printf( "\n" );
}
printf ("%s => %s", src, name);
fflush (stdout);
if (s = fcopy (src, name)) {
iRtn = 1;
printf (" %s\n", s);
}
else
printf (" [ok]\n");
}
return( iRtn );
}