175 lines
4.4 KiB
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 );
|
|
}
|