GDirEntry::GDirEntry(char *dirPath, char *nameA, GBool doStat) { #ifdef VMS char *p; #elif defined(WIN32) DWORD fa; #elif defined(ACORN) #else struct stat st; #endif name = new GooString(nameA); dir = gFalse; fullPath = new GooString(dirPath); appendToPath(fullPath, nameA); if (doStat) { #ifdef VMS if (!strcmp(nameA, "-") || ((p = strrchr(nameA, '.')) && !strncmp(p, ".DIR;", 5))) dir = gTrue; #elif defined(ACORN) #else #ifdef WIN32 fa = GetFileAttributes(fullPath->getCString()); dir = (fa != 0xFFFFFFFF && (fa & FILE_ATTRIBUTE_DIRECTORY)); #else if (stat(fullPath->getCString(), &st) == 0) dir = S_ISDIR(st.st_mode); #endif #endif } }
static void storeInfoAboutEntry(int fd, struct pcdir *dp, struct pcdir *ldp, int depth, int32_t longEntryStartCluster, char *fullPath, int *fullLen) { struct nameinfo *pathCopy; int32_t start; int haveBad; int hidden = (dp->pcd_attr & PCA_HIDDEN || dp->pcd_attr & PCA_SYSTEM); int dir = (dp->pcd_attr & PCA_DIR); int i; if (hidden) HiddenFileCount++; else if (dir) DirCount++; else FileCount++; appendToPath(dp, fullPath, fullLen); /* * Make a copy of the name at this point. We may want it to * note the original source of an orphaned cluster. */ if ((pathCopy = (struct nameinfo *)malloc(sizeof (struct nameinfo))) != NULL) { if ((pathCopy->fullName = (char *)malloc(*fullLen + 1)) != NULL) { pathCopy->references = 0; (void) strncpy(pathCopy->fullName, fullPath, *fullLen); pathCopy->fullName[*fullLen] = '\0'; } else { free(pathCopy); pathCopy = NULL; } } if (Verbose) { for (i = 0; i < depth; i++) (void) fprintf(stderr, " "); if (hidden) (void) fprintf(stderr, "["); else if (dir) (void) fprintf(stderr, "|_"); else (void) fprintf(stderr, gettext("(%06d) "), FileCount); printName(stderr, dp); if (hidden) (void) fprintf(stderr, "]"); (void) fprintf(stderr, gettext(", %u bytes, start cluster %d"), extractSize(dp), extractStartCluster(dp)); (void) fprintf(stderr, "\n"); } start = extractStartCluster(dp); haveBad = noteUsage(fd, start, dp, ldp, longEntryStartCluster, hidden, dir, pathCopy); if (haveBad > 0) { if (dir && pathCopy->fullName != NULL) { (void) fprintf(stderr, gettext("Adjusting for bad allocation units in " "the meta-data of:\n ")); (void) fprintf(stderr, pathCopy->fullName); (void) fprintf(stderr, "\n"); } truncChainWithBadCluster(fd, dp, start); } if ((pathCopy != NULL) && (pathCopy->references == 0)) { free(pathCopy->fullName); free(pathCopy); } }