windows-nt/Source/XPSP1/NT/sdktools/munge/datefix.c
2020-09-26 16:20:57 +08:00

240 lines
6.2 KiB
C

/*
* Utility program to munge a set of files, translating names from
* one form to another. Usage:
*
* munge scriptFile files...
*
* where the first parameter is the name of a file that consists of
* one or more lines of the following format:
*
* oldName newName
*
* and the remaining parameters are the names of the files to munge.
* Each file is _read into memory, scanned once, where each occurence
* of an oldName string is replaced by its corresponding newName.
* If any changes are made to a file, the old version is RMed and
* the new version written out under the same name.
*
*/
#include "munge.h"
int fQuery = FALSE;
int fRecurse = FALSE;
int fVerbose = FALSE;
void
DoFiles(
char *p,
struct findType *b,
void *Args
);
void
DoFile( p )
char *p;
{
HANDLE FileHandle;
SYSTEMTIME SystemTime;
FILETIME CurrentTime;
FILETIME CreationTime;
FILETIME LastAccessTime;
FILETIME LastWriteTime;
BOOL DatesBogus = FALSE;
if (fVerbose)
fprintf( stderr, "Checking %s\n", p );
FileHandle = CreateFile( p,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL
);
if (FileHandle == NULL) {
fprintf( stderr, "%s - unable to open (%d)\n", p, GetLastError() );
return;
}
if (!GetFileTime( FileHandle,
&CreationTime,
&LastAccessTime,
&LastWriteTime
)
) {
fprintf( stderr, "%s - unable to read file dates (%d)\n", p, GetLastError() );
CloseHandle( FileHandle );
return;
}
CloseHandle( FileHandle );
GetSystemTime( &SystemTime );
SystemTimeToFileTime( &SystemTime, &CurrentTime );
if (CompareFileTime( &CreationTime, &CurrentTime ) > 0) {
CreationTime = CurrentTime;
DatesBogus = TRUE;
}
if (CompareFileTime( &LastAccessTime, &CurrentTime ) > 0) {
LastAccessTime = CurrentTime;
DatesBogus = TRUE;
}
if (CompareFileTime( &LastWriteTime, &CurrentTime ) > 0) {
LastWriteTime = CurrentTime;
DatesBogus = TRUE;
}
if (DatesBogus) {
printf( "%s dates invalid", p );
if (fQuery) {
printf( "\n" );
return;
}
FileHandle = CreateFile( p,
GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL
);
if (FileHandle == NULL) {
printf( " - unable to open for write (%d)\n", GetLastError() );
}
else {
if (!SetFileTime( FileHandle,
&CreationTime,
&LastAccessTime,
&LastWriteTime
)
) {
printf( " - unable to modify file dates (%d)\n", GetLastError() );
}
else {
printf( " - reset to current date/time\n" );
}
CloseHandle( FileHandle );
}
}
return;
}
void
DoFiles(
char *p,
struct findType *b,
void *Args
)
{
if (strcmp (b->fbuf.cFileName, ".") &&
strcmp (b->fbuf.cFileName, "..") &&
_stricmp (b->fbuf.cFileName, "slm.dif")
) {
if (HASATTR(b->fbuf.dwFileAttributes,FILE_ATTRIBUTE_DIRECTORY)) {
switch (p[strlen(p)-1]) {
case '/':
case '\\': strcat (p, "*.*"); break;
default: strcat (p, "\\*.*");
}
if (fRecurse) {
fprintf( stderr, "Scanning %s\n", p );
forfile( p,
FILE_ATTRIBUTE_DIRECTORY,
DoFiles,
NULL
);
}
}
else {
DoFile( p );
}
}
Args;
}
void
Usage( void )
{
fprintf( stderr, "usage: datefix [-q] [-r] [-v] [DirectorySpec(s)]\n" );
fprintf( stderr, "Where...\n");
fprintf( stderr, "\t-q\tQuery only - don't actually make changes.\n");
fprintf( stderr, "\t-r\tRecurse.\n");
fprintf( stderr, "\t-v\tVerbose - show files being checked.\n");
fprintf( stderr, "\tDirectorySpec - one or more directories to examime.\n" );
exit( 1 );
}
int
__cdecl main( argc, argv )
int argc;
char *argv[];
{
int i;
char *s, pathBuf[ 64 ];
int FileArgsSeen = 0;
if (argc < 2) {
Usage();
}
fQuery = FALSE;
fRecurse = FALSE;
fVerbose = FALSE;
for (i=1; i<argc; i++) {
s = argv[ i ];
if (*s == '-' || *s == '/') {
while (*++s) {
switch( tolower( *s ) ) {
case 'q': fQuery = TRUE; break;
case 'r': fRecurse = TRUE; break;
case 'v': fVerbose = TRUE; break;
default: Usage();
}
}
}
else {
FileArgsSeen++;
if (GetFileAttributes( s ) & FILE_ATTRIBUTE_DIRECTORY) {
s = strcpy( pathBuf, s );
switch (s[strlen(s)-1]) {
case '/':
case '\\': strcat (s, "*.*"); break;
default: strcat (s, "\\*.*");
}
fprintf( stderr, "Scanning %s\n", s );
forfile( s,
FILE_ATTRIBUTE_DIRECTORY,
DoFiles,
NULL
);
}
else {
DoFile( s );
}
}
}
if (FileArgsSeen == 0) {
s = "*.*";
fprintf( stderr, "Scanning .\\%s\n", s );
forfile( s,
FILE_ATTRIBUTE_DIRECTORY,
DoFiles,
NULL
);
}
return( 0 );
}