fexpunge.c
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:4k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. /* fexpunge.c - remove all deleted objects from the index
  2.  *
  3.  *  HISTORY:
  4.  *
  5.  * ??-???-???? ??  Original Version
  6.  * 06-Sep-1988 bw  Issue error is directory removal fails
  7.  * 20-Dec-1989 SB  Change for new Index file format, added NOTES
  8.  *
  9.  * NOTES:
  10.  *  The old-format index file was composed of elements of size RM_RECLEN having
  11.  *  the following syntax :-
  12.  *
  13.  *     <element> := <valid-element> | <deleted-element>
  14.  *     <valid-element> := <8.3filename> <padding>
  15.  *     <deleted-element> := <padding>
  16.  *    where,
  17.  *        <padding> is series of (RM_RECLEN - sizeof(8.3filename) 0x00's
  18.  *
  19.  *  If the first RM_RECLEN bytes of the index file match the new index file
  20.  *  header then the index file has new-format.
  21.  *
  22.  *  The new-format index file is composed of elements of size (n * RM_RECLEN)
  23.  *  having the following syntax :-
  24.  *
  25.  * <header>   := <0x00> <magic> <version> <0x00> <first-padding>
  26.  * <valid-element>   := <longfilename> <padding>
  27.  * <deleted-element> := <padding>
  28.  *     where,
  29.  * <padding> is a series is 0x00 to round off to RM_RECLEN length
  30.  * <magic> is RM_MAGIC (currently IX)
  31.  * <version> is RM_VERSION (currently 1.01)
  32.  *  When <longfilename> is a multiple of RM_RECLEN then an extra padding record
  33.  *  is added to make it a NULL terminated string.
  34.  *
  35.  */
  36. #if defined (OS2)
  37. #include <os2.h>
  38. #endif
  39. #include <fcntl.h>
  40. #include <systypes.h>
  41. #include <sysstat.h>
  42. #include <io.h>
  43. #include "..htools.h"
  44. #include "..hrm.h"
  45. #include <string.h>
  46. #include <time.h>
  47. #include <direct.h>
  48. #include <malloc.h>
  49. /* we open the index corresponding to the named directory and release all
  50.  * the deleted files present.  At the end, we remove the index and the deleted
  51.  * directory */
  52. long fexpunge (pDir, list)
  53. char *pDir;
  54. FILE *list;
  55. {
  56.     int fhidx;
  57.     char *dir; /* deleted dir */
  58.     char *szRec; /* name of file deleted */
  59.     char *idx; /* name of index */
  60.     char *file;
  61.     long totbytes;
  62.     struct stat statbuf;
  63.     totbytes = 0L;
  64.     dir = idx = file = NULL;
  65.     if ((dir = (*tools_alloc) (MAXPATHLEN)) == NULL ||
  66.     (idx = (*tools_alloc) (MAXPATHLEN)) == NULL ||
  67.     (file = (*tools_alloc) (MAXPATHLEN)) == NULL ||
  68.     (szRec = (*tools_alloc) (MAXPATHLEN)) == NULL) {
  69. if (list)
  70.     fprintf (list, "Unable to allocate internal storagen");
  71. goto done;
  72.     }
  73.     /* generate deleted directory name from dir */
  74.     strcpy (dir, pDir);
  75.     pathcat (dir, RM_DIR);
  76.     /* generate index name from deleted directory */
  77.     strcpy (idx, dir);
  78.     pathcat (idx, RM_IDX);
  79.     /* try to open index.  If it fails, no problem */
  80.     if ((fhidx = open (idx, O_RDWR | O_BINARY)) != -1) {
  81. if (list)
  82.     fprintf (list, "Expunging files in %sn", pDir);
  83. readIdxRec (fhidx, szRec);
  84. if (fIdxHdr (szRec))
  85.     if (!readNewIdxRec (fhidx, szRec, MAXPATHLEN))
  86. goto done;
  87. do {
  88.     /* For each file that was RMed and not UNDELed */
  89.     if (szRec[0] != '') {
  90. /* The name starts earlier than current position in the index
  91.  * file. The deleted file index is derived from the current
  92.  * offset and the length of the string.
  93.  */
  94. sprintf (file, "%s\deleted.%03x", dir, (lseek (fhidx, 0L, SEEK_CUR)
  95.  - strlen (szRec)) / RM_RECLEN);
  96. if (stat (file, &statbuf) == -1) {
  97.     if (list)
  98. fprintf (list, " (%s - %s)n", file, error ());
  99. }
  100. else {
  101.     unlink (file);
  102.     totbytes += statbuf.st_size;
  103.     if (list) {
  104. char *pTime = ctime (&statbuf.st_mtime);
  105. /* ctime() returns a string which has a n at
  106.  * fixed offset of 24. [ANSI draft]. We don't need
  107.  * it because we put the File Name before n
  108.  */
  109. *(pTime + 24) = '';
  110. upd (dir, szRec, file);
  111. fprintf (list, "%8ld %s  %sn", statbuf.st_size, pTime,
  112.  file);
  113. fflush (list);
  114.     }
  115. }
  116.     }
  117. } while (readNewIdxRec (fhidx, szRec, MAXPATHLEN));
  118. close (fhidx);
  119. unlink (idx);
  120. if (rmdir (dir))
  121.     fprintf (list, "ERROR: Unable to remove directory %s - %sn", dir, error ());
  122. if (list)
  123.     fprintf (list, "%ld bytes freedn", totbytes);
  124.     }
  125.     else
  126. if (!stat (dir, &statbuf))
  127.     fprintf (list, "Warning: Cannot open %s - %sn", idx, error ());
  128. done:
  129.     if (dir)
  130. free (dir);
  131.     if (idx)
  132. free (idx);
  133.     if (file)
  134. free (file);
  135.     if (szRec)
  136. free (szRec);
  137.     return totbytes;
  138. }