diff options
Diffstat (limited to 'lib/bkisofs/bkGet.c')
-rw-r--r-- | lib/bkisofs/bkGet.c | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/lib/bkisofs/bkGet.c b/lib/bkisofs/bkGet.c new file mode 100644 index 0000000..8bf0d36 --- /dev/null +++ b/lib/bkisofs/bkGet.c @@ -0,0 +1,257 @@ +/******************************* LICENCE ************************************** +* Any code in this file may be redistributed or modified under the terms of +* the GNU General Public Licence as published by the Free Software +* Foundation; version 2 of the licence. +****************************** END LICENCE ***********************************/ + +/****************************************************************************** +* Author: +* Andrew Smith, http://littlesvr.ca/misc/contactandrew.php +* +* Contributors: +* +******************************************************************************/ + +#include <stdio.h> +#include <string.h> +#include <sys/types.h> + +#include "bk.h" +#include "bkInternal.h" +#include "bkError.h" +#include "bkGet.h" +#include "bkPath.h" + +/******************************************************************************* +* bk_estimate_iso_size() +* Public function +* Estimates the size of the directory trees + file contents on the iso +* */ +bk_off_t bk_estimate_iso_size(const VolInfo* volInfo, int filenameTypes) +{ + /* reset alreadyCounted flags */ + BkHardLink* currentLink; + currentLink = volInfo->fileLocations; + while(currentLink != NULL) + { + currentLink->alreadyCounted = false; + + currentLink = currentLink->next; + } + + return estimateIsoSize(&(volInfo->dirTree), filenameTypes); +} + +/******************************************************************************* +* bk_get_creation_time() +* Public function +* */ +time_t bk_get_creation_time(const VolInfo* volInfo) +{ + return volInfo->creationTime; +} + +/******************************************************************************* +* bk_get_dir_from_string() +* public function +* gets a pointer to a Dir in tree described by the string pathStr +* */ +int bk_get_dir_from_string(const VolInfo* volInfo, const char* pathStr, + BkDir** dirFoundPtr) +{ + return getDirFromString(&(volInfo->dirTree), pathStr, dirFoundPtr); +} + +/******************************************************************************* +* bk_get_permissions() +* public function +* gets the permissions (not all of the posix info) for an item (file, dir, etc.) +* */ +int bk_get_permissions(VolInfo* volInfo, const char* pathAndName, + mode_t* permissions) +{ + int rc; + NewPath srcPath; + BkFileBase* base; + bool itemFound; + + if(permissions == NULL) + return BKERROR_GET_PERM_BAD_PARAM; + + rc = makeNewPathFromString(pathAndName, &srcPath); + if(rc <= 0) + { + freePathContents(&srcPath); + return rc; + } + + itemFound = findBaseByNewPath(&srcPath, &(volInfo->dirTree), &base); + + freePathContents(&srcPath); + + if(!itemFound) + return BKERROR_ITEM_NOT_FOUND_ON_IMAGE; + + *permissions = base->posixFileMode & 0777; + + return 1; +} + +/******************************************************************************* +* bk_get_publisher() +* Public function +* Returns a pointer to the string in volInfo that holds the volume name. +* */ +const char* bk_get_publisher(const VolInfo* volInfo) +{ + return volInfo->publisher; +} + +/******************************************************************************* +* bk_get_volume_name() +* Public function +* Returns a pointer to the string in volInfo that holds the volume name. +* */ +const char* bk_get_volume_name(const VolInfo* volInfo) +{ + return volInfo->volId; +} + +/******************************************************************************* +* estimateIsoSize() +* Recursive +* Estimate the size of the directory trees + file contents on the iso +* */ +bk_off_t estimateIsoSize(const BkDir* tree, int filenameTypes) +{ + bk_off_t estimateDrSize; + bk_off_t thisDirSize; + int numItems; /* files and directories */ + BkFileBase* child; + + thisDirSize = 0; + numItems = 0; + + child = tree->children; + while(child != NULL) + { + if(IS_DIR(child->posixFileMode)) + { + thisDirSize += estimateIsoSize(BK_DIR_PTR(child), filenameTypes); + } + else if(IS_REG_FILE(child->posixFileMode)) + { + if(BK_FILE_PTR(child)->location == NULL || + !BK_FILE_PTR(child)->location->alreadyCounted) + { + thisDirSize += BK_FILE_PTR(child)->size; + thisDirSize += BK_FILE_PTR(child)->size % NBYTES_LOGICAL_BLOCK; + } + if(BK_FILE_PTR(child)->location != NULL) + BK_FILE_PTR(child)->location->alreadyCounted = true; + } + + numItems++; + + child = child->next; + } + + estimateDrSize = 70; + if(filenameTypes & FNTYPE_JOLIET) + estimateDrSize += 70; + if(filenameTypes & FNTYPE_ROCKRIDGE) + estimateDrSize += 70; + + thisDirSize += 68 + (estimateDrSize * numItems); + thisDirSize += NBYTES_LOGICAL_BLOCK - (68 + (estimateDrSize * numItems)) % NBYTES_LOGICAL_BLOCK; + + return thisDirSize; +} + +/******************************************************************************* +* getDirFromString() +* recursive +* gets a pointer to a Dir in tree described by the string pathStr +* */ +int getDirFromString(const BkDir* tree, const char* pathStr, BkDir** dirFoundPtr) +{ + size_t count; + size_t pathStrLen; + bool stopLooking; + /* name of the directory in the path this instance of the function works on */ + char* currentDirName; + BkFileBase* child; + int rc; + + pathStrLen = strlen(pathStr); + + if(pathStrLen == 1 && pathStr[0] == '/') + /* root, special case */ + { + /* cast to prevent compiler const warning */ + *dirFoundPtr = (BkDir*)tree; + return 1; + } + + if(pathStrLen < 3 || pathStr[0] != '/' || pathStr[1] == '/' || + pathStr[pathStrLen - 1] != '/') + return BKERROR_MISFORMED_PATH; + + stopLooking = false; + for(count = 2; count < pathStrLen && !stopLooking; count++) + /* find the first directory in the path */ + { + if(pathStr[count] == '/') + /* found it */ + { + /* make a copy of the string to use with strcmp */ + currentDirName = (char*)malloc(count); + if(currentDirName == NULL) + return BKERROR_OUT_OF_MEMORY; + + strncpy(currentDirName, &(pathStr[1]), count - 1); + currentDirName[count - 1] = '\0'; + + child = tree->children; + while(child != NULL && !stopLooking) + /* each child directory in tree */ + { + if( strcmp(child->name, currentDirName) == 0 && + IS_DIR(child->posixFileMode) ) + /* found the right child directory */ + { + if(pathStr[count + 1] == '\0') + /* this is the directory i'm looking for */ + { + *dirFoundPtr = BK_DIR_PTR(child); + stopLooking = true; + rc = 1; + } + else + /* intermediate directory, go further down the tree */ + { + rc = getDirFromString(BK_DIR_PTR(child), + &(pathStr[count]), dirFoundPtr); + if(rc <= 0) + { + free(currentDirName); + return rc; + } + stopLooking = true; + } + + } + + child = child->next; + } + + free(currentDirName); + + if(!stopLooking) + return BKERROR_DIR_NOT_FOUND_ON_IMAGE; + } /* if(found it) */ + } /* for(find the first directory in the path) */ + + /* can't see how i could get here but to keep the compiler happy */ + return 1; +} |