|
|
/*** EXP.C - expunge deleted files deleted with the rm program ****************
* * Copyright (c) 1986-1990, Microsoft Corporation. All rights reserved. * * Purpose: * The three tools EXP, RM and UNDEL are used to delete files so * that they can be undeleted. This is done my renaming the file into * a hidden directory called DELETED. * * Notes: * Exp command line syntax: * * EXP [options] [path ...] * * where the [options] are :- * * /r Recursively expunge from path specified * /q Quiet mode; no extraneous messages * /help spawn Qh if possible, else issue a Usage message * * Revision History: * 08-Jan-1990 SB SLM version upgrading added; Add CopyRightYrs Macro * 03-Jan-1990 SB define QH_TOPIC_NOT_FOUND * 20-Dec-1989 SB Add check for return code of 3 for qh * 14-Dec-1989 LN Update Copyright to include 1990 * 23-Oct-1989 LN Version no bumped to 1.01 * 02-Oct-1989 LN Changed Version no to 1.00 * 08-Aug-1989 BW Add Version number. Fix usage syntax. Update copyright. * 15-May-1989 WB Add /help * 06-Apr-1987 BW Add copyright notice to Usage(). * 22-Jul-1986 DL Make test for flag case insensitive, add /q * ******************************************************************************/
/* I N C L U D E Files */
#include <stdio.h>
#include <process.h>
#include <ctype.h>
#include <windows.h>
#include <tools.h>
#include <string.h>
/* D E F I N E s */
#define CopyRightYrs "1987-90"
/* Need 2 steps, first to get correct values in and 2nd to paste them */ /* paste() is hacked to allow LEADING ZEROES */ #define paste(a, b, c) #a ".0" #b ".00" #c
#define VERSION(major, minor, buildno) paste(major, minor, buildno)
#define QH_TOPIC_NOT_FOUND 3
/* G L O B A L s */
flagType fRecurse = FALSE; FILE *pFile; char cd[MAX_PATH];
/*
* Forward Function Declarations... */ void DoExp( char *, struct findType *, void *); void Usage( void );
void DoExp(p, b, dummy) char *p; struct findType *b; void *dummy; { if (b == NULL || (_strcmpi(b->fbuf.cFileName, "deleted") && TESTFLAG(b->fbuf.dwFileAttributes,FILE_ATTRIBUTE_DIRECTORY) && strcmp(b->fbuf.cFileName, ".") && strcmp(b->fbuf.cFileName, ".."))) { fexpunge(p, pFile); if (fRecurse) { if (!fPathChr(*(strend(p)-1))) strcat(p, "\\"); strcat(p, "*.*"); forfile(p, FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM, DoExp, NULL); } } dummy; }
void Usage() { printf( "Microsoft File Expunge Utility. Version %s\n" "Copyright (C) Microsoft Corp %s. All rights reserved.\n\n" "Usage: EXP [/help] [/rq] [{dir}*]\n", VERSION(rmj, rmm, rup), CopyRightYrs);
exit( 1 ); }
__cdecl main(c, v) int c; char *v[]; { char *p; intptr_t iRetCode;
pFile = stdout; ConvertAppToOem( c, v ); SHIFT(c,v); while( c && fSwitChr( *( p = *v ) ) ) { while (*++p) { switch (tolower(*p)) { case 'r': fRecurse = TRUE; break; case 'q': pFile = NULL; break; case 'h': if (!_strcmpi(p, "help")) { iRetCode = _spawnlp(P_WAIT, "qh.exe", "qh", "/u", "exp.exe", NULL); /* qh returns QH_TOPIC_NOT_FOUND and
* -1 is returned when the spawn fails */ if (iRetCode != QH_TOPIC_NOT_FOUND && iRetCode != -1) exit(0); } /*
* else fall thru... */
default: Usage(); } } SHIFT(c,v); } if (!c) { rootpath(".", cd); DoExp(cd, NULL, NULL); } else while (c) { strcpy(cd, *v); DoExp(cd, NULL, NULL); SHIFT(c,v); } return( 0 ); }
|