Bool Idt_initialize() { idtp.limit = (sizeof(Idt_Entry) * 256) -1; idtp.base = (u32) &idt; String_set((u8*) &idt, 0, sizeof(Idt_Entry) * 256); Idt_load(); return true; }
String* String_create(const char* string) { assert(string); String* self = malloc(sizeof(String)); if(!self) error(ERROR_ALLOC); self->raw = NULL; String_set(self, string); return self; }
static int set_dbfile(Instance *pi, const char *value) { TunerControl_private *priv = (TunerControl_private *)pi; String_set(&priv->dbfile, value); if (priv->dbschema == String_value_none()) { fprintf(stderr, "schema is not set!\n"); return 1; } // priv->db = SQLite_open(priv->dbschema, priv->dbfile); return 0; }
int SeqerWindow_loadMidiFile(SeqerWindow_t window, char *filename) { MidiFile_t midi_file = MidiFile_load(filename); if (midi_file == NULL) return -1; if (PointerArray_getSize(window->document->windows) == 1) { MidiFile_free(window->document->midi_file); } else { int window_number; for (window_number = PointerArray_getSize(window->document->windows) - 1; window_number >= 0; window_number--) { if ((SeqerWindow_t)(PointerArray_get(window->document->windows, window_number)) == window) { PointerArray_remove(window->document->windows, window_number); break; } } window->document = (SeqerDocument_t)(malloc(sizeof (struct SeqerDocument))); window->document->windows = PointerArray_new(8); window->document->filename = String_new(32); PointerArray_add(window->document->windows, window); } window->document->midi_file = midi_file; String_set(window->document->filename, (unsigned char *)(filename)); window->document->modified = 0; window->horizontal_scroll_offset = 0; (*(window->application->redraw_callback))(window); { float last_beat = 0.0; MidiFileEvent_t last_event = MidiFile_getLastEvent(window->document->midi_file); if (last_event != NULL) last_beat = MidiFile_getBeatFromTick(window->document->midi_file, MidiFileEvent_getTick(last_event)); (*(window->application->configure_horizontal_scrollbar_callback))(window, (int)(last_beat * 20), 20, window->width, window->horizontal_scroll_offset); } (*(window->application->configure_vertical_scrollbar_callback))(window, 128 * 5, 5, window->height, window->vertical_scroll_offset); (*(window->application->filename_change_callback))(window); return 0; }
Errors File_getTmpFileNameCString(String fileName, char const *pattern, const String directory) { char *s; int handle; Errors error; assert(fileName != NULL); if (pattern == NULL) pattern = "tmp-XXXXXX"; if (directory != NULL) { String_set(fileName,directory); File_appendFileNameCString(fileName,pattern); } else { String_setCString(fileName,pattern); } s = String_toCString(fileName); if (s == NULL) { HALT_INSUFFICIENT_MEMORY(); } handle = mkstemp(s); if (handle == -1) { error = ERRORX(IO_ERROR,errno,s); free(s); return error; } close(handle); String_setBuffer(fileName,s,strlen(s)); free(s); return ERROR_NONE; }
/*---------------------------------------------------------------------*/ void StringList_init(StringList *stringList) { assert(stringList != NULL); List_init(stringList); } void StringList_done(StringList *stringList) { assert(stringList != NULL); List_done(stringList,(ListNodeFreeFunction)freeStringNode,NULL); } StringList *StringList_new(void) { return (StringList*)List_new(); } StringList *StringList_duplicate(const StringList *stringList) { StringList *newStringList; assert(stringList != NULL); newStringList = StringList_new(); if (newStringList == NULL) { return NULL; } StringList_copy(newStringList,stringList); return newStringList; } void StringList_copy(StringList *stringList, const StringList *fromStringList) { StringNode *stringNode; assert(stringList != NULL); assert(fromStringList != NULL); stringNode = fromStringList->head; while (stringNode != NULL) { StringList_append(stringList,stringNode->string); stringNode = stringNode->next; } } void StringList_delete(StringList *stringList) { assert(stringList != NULL); List_delete(stringList,(ListNodeFreeFunction)freeStringNode,NULL); } void StringList_clear(StringList *stringList) { assert(stringList != NULL); List_clear(stringList,(ListNodeFreeFunction)freeStringNode,NULL); } void StringList_move(StringList *fromStringList, StringList *toStringList) { assert(fromStringList != NULL); assert(toStringList != NULL); List_move(fromStringList,toStringList,NULL,NULL,NULL); } #ifdef NDEBUG void StringList_insert(StringList *stringList, const String string, StringNode *nextStringNode) #else /* not NDEBUG */ void __StringList_insert(const char *__fileName__, ulong __lineNb__, StringList *stringList, const String string, StringNode *nextStringNode) #endif /* NDEBUG */ { #ifdef NDEBUG insertString(stringList,String_duplicate(string),nextStringNode); #else /* not NDEBUG */ insertString(__fileName__,__lineNb__,stringList,__String_duplicate(__fileName__,__lineNb__,string),nextStringNode); #endif /* NDEBUG */ } #ifdef NDEBUG void StringList_insertCString(StringList *stringList, const char *s, StringNode *nextStringNode) #else /* not NDEBUG */ void __StringList_insertCString(const char *__fileName__, ulong __lineNb__, StringList *stringList, const char *s, StringNode *nextStringNode) #endif /* NDEBUG */ { #ifdef NDEBUG insertString(stringList,String_newCString(s),nextStringNode); #else /* not NDEBUG */ insertString(__fileName__,__lineNb__,stringList,__String_newCString(__fileName__,__lineNb__,s),nextStringNode); #endif /* NDEBUG */ } #ifdef NDEBUG void StringList_insertChar(StringList *stringList, char ch, StringNode *nextStringNode) #else /* not NDEBUG */ void __StringList_insertChar(const char *__fileName__, ulong __lineNb__, StringList *stringList, char ch, StringNode *nextStringNode) #endif /* NDEBUG */ { #ifdef NDEBUG insertString(stringList,String_newChar(ch),nextStringNode); #else /* not NDEBUG */ insertString(__fileName__,__lineNb__,stringList,__String_newChar(__fileName__,__lineNb__,ch),nextStringNode); #endif /* NDEBUG */ } #ifdef NDEBUG void StringList_insertBuffer(StringList *stringList, char *buffer, ulong bufferLength, StringNode *nextStringNode) #else /* not NDEBUG */ void __StringList_insertBuffer(const char *__fileName__, ulong __lineNb__, StringList *stringList, char *buffer, ulong bufferLength, StringNode *nextStringNode) #endif /* NDEBUG */ { #ifdef NDEBUG insertString(stringList,String_newBuffer(buffer,bufferLength),nextStringNode); #else /* not NDEBUG */ insertString(__fileName__,__lineNb__,stringList,__String_newBuffer(__fileName__,__lineNb__,buffer,bufferLength),nextStringNode); #endif /* NDEBUG */ } #ifdef NDEBUG void StringList_append(StringList *stringList, const String string) #else /* not NDEBUG */ void __StringList_append(const char *__fileName__, ulong __lineNb__, StringList *stringList, const String string) #endif /* NDEBUG */ { #ifdef NDEBUG insertString(stringList,String_duplicate(string),NULL); #else /* not NDEBUG */ insertString(__fileName__,__lineNb__,stringList,__String_duplicate(__fileName__,__lineNb__,string),NULL); #endif /* NDEBUG */ } #ifdef NDEBUG void StringList_appendCString(StringList *stringList, const char *s) #else /* not NDEBUG */ void __StringList_appendCString(const char *__fileName__, ulong __lineNb__, StringList *stringList, const char *s) #endif /* NDEBUG */ { #ifdef NDEBUG insertString(stringList,String_newCString(s),NULL); #else /* not NDEBUG */ insertString(__fileName__,__lineNb__,stringList,__String_newCString(__fileName__,__lineNb__,s),NULL); #endif /* NDEBUG */ } #ifdef NDEBUG void StringList_appendChar(StringList *stringList, char ch) #else /* not NDEBUG */ void __StringList_appendChar(const char *__fileName__, ulong __lineNb__, StringList *stringList, char ch) #endif /* NDEBUG */ { #ifdef NDEBUG insertString(stringList,String_newChar(ch),NULL); #else /* not NDEBUG */ insertString(__fileName__,__lineNb__,stringList,__String_newChar(__fileName__,__lineNb__,ch),NULL); #endif /* NDEBUG */ } #ifdef NDEBUG void StringList_appendBuffer(StringList *stringList, char *buffer, ulong bufferLength) #else /* not NDEBUG */ void __StringList_appendBuffer(const char *__fileName__, ulong __lineNb__, StringList *stringList, char *buffer, ulong bufferLength) #endif /* NDEBUG */ { #ifdef NDEBUG insertString(stringList,String_newBuffer(buffer,bufferLength),NULL); #else /* not NDEBUG */ insertString(__fileName__,__lineNb__,stringList,__String_newBuffer(__fileName__,__lineNb__,buffer,bufferLength),NULL); #endif /* NDEBUG */ } #ifdef NDEBUG StringNode *StringList_remove(StringList *stringList, StringNode *stringNode) #else /* not NDEBUG */ StringNode *__StringList_remove(const char *__fileName__, ulong __lineNb__, StringList *stringList, StringNode *stringNode) #endif /* NDEBUG */ { StringNode *nextStringNode; assert(stringList != NULL); assert(stringNode != NULL); nextStringNode = (StringNode*)List_remove(stringList,stringNode); String_delete(stringNode->string); #ifdef NDEBUG stringNode = (StringNode*)LIST_DELETE_NODE(stringNode); #else /* not NDEBUG */ stringNode = (StringNode*)__LIST_DELETE_NODE(__fileName__,__lineNb__,stringNode); #endif /* NDEBUG */ return nextStringNode; } #ifdef NDEBUG String StringList_getFirst(StringList *stringList, String string) #else /* not NDEBUG */ String __StringList_getFirst(const char *fileName, ulong lineNb, StringList *stringList, String string) #endif /* NDEBUG */ { StringNode *stringNode; assert(stringList != NULL); stringNode = (StringNode*)List_getFirst(stringList); if (stringNode != NULL) { if (string != NULL) { String_set(string,stringNode->string); String_delete(stringNode->string); } else { string = stringNode->string; } #ifdef NDEBUG LIST_DELETE_NODE(stringNode); #else /* not NDEBUG */ __LIST_DELETE_NODE(fileName,lineNb,stringNode); #endif /* NDEBUG */ return string; } else { if (string != NULL) { String_clear(string); } return NULL; } } #ifdef NDEBUG String StringList_getLast(StringList *stringList, String string) #else /* not NDEBUG */ String __StringList_getLast(const char *fileName, ulong lineNb, StringList *stringList, String string) #endif /* NDEBUG */ { StringNode *stringNode; assert(stringList != NULL); stringNode = (StringNode*)List_getLast(stringList); if (stringNode != NULL) { if (string != NULL) { String_set(string,stringNode->string); String_delete(stringNode->string); } else { string = stringNode->string; } #ifdef NDEBUG LIST_DELETE_NODE(stringNode); #else /* not NDEBUG */ __LIST_DELETE_NODE(fileName,lineNb,stringNode); #endif /* NDEBUG */ return string; } else { if (string != NULL) { String_clear(string); } return NULL; } }
Errors File_getTmpDirectoryNameCString(String directoryName, char const *pattern, const String directory) { char *s; Errors error; assert(directoryName != NULL); if (pattern == NULL) pattern = "tmp-XXXXXX"; if (directory != NULL) { String_set(directoryName,directory); File_appendFileNameCString(directoryName,pattern); } else { String_setCString(directoryName,pattern); } s = String_toCString(directoryName); if (s == NULL) { HALT_INSUFFICIENT_MEMORY(); } if (mkdtemp(s) == NULL) { error = ERRORX(IO_ERROR,errno,s); free(s); return error; } String_setBuffer(directoryName,s,strlen(s)); free(s); return ERROR_NONE; }
int SeqerWindow_saveMidiFile(SeqerWindow_t window, char *filename) { if ((filename == NULL) || (filename[0] == '\0')) { filename = (char *)(String_get(window->document->filename)); if (filename[0] == '\0') { return -1; } else { return MidiFile_save(window->document->midi_file, filename); } } else { if (MidiFile_save(window->document->midi_file, filename) < 0) { return -1; } else { int window_number; String_set(window->document->filename, (unsigned char *)(filename)); for (window_number = PointerArray_getSize(window->document->windows) - 1; window_number >= 0; window_number--) { (*(window->application->filename_change_callback))((SeqerWindow_t)(PointerArray_get(window->document->windows, window_number))); } return 0; } } }
Errors File_readDirectory(DirectoryHandle *directoryHandle, String fileName ) { assert(directoryHandle != NULL); assert(directoryHandle->name != NULL); assert(directoryHandle->dir != NULL); assert(fileName != NULL); /* read entry iff not read */ if (directoryHandle->entry == NULL) { directoryHandle->entry = readdir(directoryHandle->dir); } /* skip "." and ".." entries */ while ( (directoryHandle->entry != NULL) && ( (strcmp(directoryHandle->entry->d_name,"." ) == 0) || (strcmp(directoryHandle->entry->d_name,"..") == 0) ) ) { directoryHandle->entry = readdir(directoryHandle->dir); } if (directoryHandle->entry == NULL) { return ERRORX(IO_ERROR,errno,String_cString(directoryHandle->name)); } String_set(fileName,directoryHandle->name); File_appendFileNameCString(fileName,directoryHandle->entry->d_name); directoryHandle->entry = NULL; return ERROR_NONE; }
static int set_dbschema(Instance *pi, const char *value) { TunerControl_private *priv = (TunerControl_private *)pi; String_set(&priv->dbschema, value); return 0; }
static int set_command(Instance *pi, const char *value) { TunerControl_private *priv = (TunerControl_private *)pi; String_set(&priv->command, value); return 0; }
String File_setFileName(String fileName, const String name) { assert(fileName != NULL); return String_set(fileName,name); }
Errors File_delete(const String fileName, bool recursiveFlag) { struct stat64 fileStat; assert(fileName != NULL); if (lstat64(String_cString(fileName),&fileStat) != 0) { return ERRORX(IO_ERROR,errno,String_cString(fileName)); } if ( S_ISREG(fileStat.st_mode) || S_ISLNK(fileStat.st_mode) ) { if (unlink(String_cString(fileName)) != 0) { return ERRORX(IO_ERROR,errno,String_cString(fileName)); } } else if (S_ISDIR(fileStat.st_mode)) { Errors error; StringList directoryList; DIR *dir; struct dirent *entry; String directoryName; bool emptyFlag; String name; error = ERROR_NONE; if (recursiveFlag) { /* delete entries in directory */ StringList_init(&directoryList); StringList_append(&directoryList,fileName); directoryName = File_newFileName(); name = File_newFileName(); while (!StringList_empty(&directoryList) && (error == ERROR_NONE)) { StringList_getFirst(&directoryList,directoryName); dir = opendir(String_cString(directoryName)); if (dir != NULL) { emptyFlag = TRUE; while (((entry = readdir(dir)) != NULL) && (error == ERROR_NONE)) { if ( (strcmp(entry->d_name,"." ) != 0) && (strcmp(entry->d_name,"..") != 0) ) { String_set(name,directoryName); File_appendFileNameCString(name,entry->d_name); if (lstat64(String_cString(name),&fileStat) == 0) { if ( S_ISREG(fileStat.st_mode) || S_ISLNK(fileStat.st_mode) ) { if (unlink(String_cString(name)) != 0) { error = ERRORX(IO_ERROR,errno,String_cString(name)); } //HALT_INTERNAL_ERROR_STILL_NOT_IMPLEMENTED(); } else if (S_ISDIR(fileStat.st_mode)) { StringList_append(&directoryList,name); emptyFlag = FALSE; } } } } closedir(dir); if (emptyFlag) { if (rmdir(String_cString(directoryName)) != 0) { error = ERRORX(IO_ERROR,errno,String_cString(directoryName)); } //HALT_INTERNAL_ERROR_STILL_NOT_IMPLEMENTED(); } else { StringList_append(&directoryList,directoryName); } } } File_deleteFileName(name); File_deleteFileName(directoryName); StringList_done(&directoryList); } else { if (rmdir(String_cString(fileName)) != 0) { error = ERRORX(IO_ERROR,errno,String_cString(fileName)); } } return error; } return ERROR_NONE; }
Errors Command_restore(StringList *archiveFileNameList, PatternList *includePatternList, PatternList *excludePatternList, JobOptions *jobOptions, ArchiveGetCryptPasswordFunction archiveGetCryptPasswordFunction, void *archiveGetCryptPasswordUserData, RestoreStatusInfoFunction restoreStatusInfoFunction, void *restoreStatusInfoUserData, bool *pauseFlag, bool *requestedAbortFlag ) { RestoreInfo restoreInfo; byte *buffer; FileFragmentList fileFragmentList; String archiveFileName; Errors error; ArchiveInfo archiveInfo; ArchiveFileInfo archiveFileInfo; FileTypes fileType; FileFragmentNode *fileFragmentNode; assert(archiveFileNameList != NULL); assert(includePatternList != NULL); assert(excludePatternList != NULL); assert(jobOptions != NULL); /* initialize variables */ restoreInfo.includePatternList = includePatternList; restoreInfo.excludePatternList = excludePatternList; restoreInfo.jobOptions = jobOptions; restoreInfo.pauseFlag = pauseFlag; restoreInfo.requestedAbortFlag = requestedAbortFlag; restoreInfo.error = ERROR_NONE; restoreInfo.statusInfoFunction = restoreStatusInfoFunction; restoreInfo.statusInfoUserData = restoreStatusInfoUserData; restoreInfo.statusInfo.doneFiles = 0L; restoreInfo.statusInfo.doneBytes = 0LL; restoreInfo.statusInfo.skippedFiles = 0L; restoreInfo.statusInfo.skippedBytes = 0LL; restoreInfo.statusInfo.errorFiles = 0L; restoreInfo.statusInfo.errorBytes = 0LL; restoreInfo.statusInfo.fileName = String_new(); restoreInfo.statusInfo.fileDoneBytes = 0LL; restoreInfo.statusInfo.fileTotalBytes = 0LL; restoreInfo.statusInfo.storageName = String_new(); restoreInfo.statusInfo.storageDoneBytes = 0LL; restoreInfo.statusInfo.storageTotalBytes = 0LL; /* allocate resources */ buffer = malloc(BUFFER_SIZE); if (buffer == NULL) { HALT_INSUFFICIENT_MEMORY(); } FileFragmentList_init(&fileFragmentList); archiveFileName = String_new(); while ( ((restoreInfo.requestedAbortFlag == NULL) || !(*restoreInfo.requestedAbortFlag)) && !StringList_empty(archiveFileNameList) && (restoreInfo.error == ERROR_NONE) ) { /* pause */ while ((restoreInfo.pauseFlag != NULL) && (*restoreInfo.pauseFlag)) { Misc_udelay(500*1000); } StringList_getFirst(archiveFileNameList,archiveFileName); printInfo(0,"Restore archive '%s':\n",String_cString(archiveFileName)); /* open archive */ error = Archive_open(&archiveInfo, archiveFileName, jobOptions, archiveGetCryptPasswordFunction, archiveGetCryptPasswordUserData ); if (error != ERROR_NONE) { printError("Cannot open archive file '%s' (error: %s)!\n", String_cString(archiveFileName), Errors_getText(error) ); if (restoreInfo.error == ERROR_NONE) restoreInfo.error = error; continue; } String_set(restoreInfo.statusInfo.storageName,archiveFileName); updateStatusInfo(&restoreInfo); /* read files */ while ( ((restoreInfo.requestedAbortFlag == NULL) || !(*restoreInfo.requestedAbortFlag)) && !Archive_eof(&archiveInfo) && (restoreInfo.error == ERROR_NONE) ) { /* pause */ while ((restoreInfo.pauseFlag != NULL) && (*restoreInfo.pauseFlag)) { Misc_udelay(500*1000); } /* get next file type */ error = Archive_getNextFileType(&archiveInfo, &archiveFileInfo, &fileType ); if (error != ERROR_NONE) { printError("Cannot not read next entry in archive '%s' (error: %s)!\n", String_cString(archiveFileName), Errors_getText(error) ); if (restoreInfo.error == ERROR_NONE) restoreInfo.error = error; break; } switch (fileType) { case FILE_TYPE_FILE: { String fileName; FileInfo fileInfo; uint64 fragmentOffset,fragmentSize; FileFragmentNode *fileFragmentNode; String destinationFileName; String directoryName; // FileInfo localFileInfo; FileHandle fileHandle; uint64 length; ulong n; /* read file */ fileName = String_new(); error = Archive_readFileEntry(&archiveInfo, &archiveFileInfo, NULL, NULL, NULL, fileName, &fileInfo, &fragmentOffset, &fragmentSize ); if (error != ERROR_NONE) { printError("Cannot not read 'file' content of archive '%s' (error: %s)!\n", String_cString(archiveFileName), Errors_getText(error) ); String_delete(fileName); if (restoreInfo.error == ERROR_NONE) restoreInfo.error = error; continue; } if ( (List_empty(includePatternList) || PatternList_match(includePatternList,fileName,PATTERN_MATCH_MODE_EXACT)) && !PatternList_match(excludePatternList,fileName,PATTERN_MATCH_MODE_EXACT) ) { String_set(restoreInfo.statusInfo.fileName,fileName); restoreInfo.statusInfo.fileDoneBytes = 0LL; restoreInfo.statusInfo.fileTotalBytes = fragmentSize; updateStatusInfo(&restoreInfo); /* get destination filename */ destinationFileName = getDestinationFileName(String_new(), fileName, jobOptions->directory, jobOptions->directoryStripCount ); /* check if file fragment exists */ fileFragmentNode = FileFragmentList_findFile(&fileFragmentList,fileName); if (fileFragmentNode != NULL) { if (!jobOptions->overwriteFilesFlag && FileFragmentList_checkExists(fileFragmentNode,fragmentOffset,fragmentSize)) { printInfo(1," Restore file '%s'...skipped (file part %ll..%ll exists)\n", String_cString(destinationFileName), fragmentOffset, (fragmentSize > 0)?fragmentOffset+fragmentSize-1:fragmentOffset ); String_delete(destinationFileName); Archive_closeEntry(&archiveFileInfo); String_delete(fileName); continue; } } else { if (!jobOptions->overwriteFilesFlag && File_exists(destinationFileName)) { printInfo(1," Restore file '%s'...skipped (file exists)\n",String_cString(destinationFileName)); String_delete(destinationFileName); Archive_closeEntry(&archiveFileInfo); String_delete(fileName); continue; } fileFragmentNode = FileFragmentList_addFile(&fileFragmentList,fileName,fileInfo.size); } printInfo(2," Restore file '%s'...",String_cString(destinationFileName)); /* create directory if not existing */ directoryName = File_getFilePathName(String_new(),destinationFileName); if (!File_exists(directoryName)) { /* create directory */ error = File_makeDirectory(directoryName, FILE_DEFAULT_USER_ID, FILE_DEFAULT_GROUP_ID, fileInfo.permission ); if (error != ERROR_NONE) { printInfo(2,"FAIL!\n"); printError("Cannot create directory '%s' (error: %s)\n", String_cString(directoryName), Errors_getText(error) ); String_delete(directoryName); String_delete(destinationFileName); Archive_closeEntry(&archiveFileInfo); String_delete(fileName); if (restoreInfo.error == ERROR_NONE) restoreInfo.error = error; continue; } /* set owner ship */ error = File_setOwner(directoryName, (jobOptions->owner.userId != FILE_DEFAULT_USER_ID )?jobOptions->owner.userId:fileInfo.userId, (jobOptions->owner.groupId != FILE_DEFAULT_GROUP_ID)?jobOptions->owner.groupId:fileInfo.groupId ); if (error != ERROR_NONE) { if (jobOptions->stopOnErrorFlag) { printInfo(2,"FAIL!\n"); printError("Cannot set owner ship of directory '%s' (error: %s)\n", String_cString(directoryName), Errors_getText(error) ); String_delete(directoryName); String_delete(destinationFileName); Archive_closeEntry(&archiveFileInfo); String_delete(fileName); if (restoreInfo.error == ERROR_NONE) restoreInfo.error = error; continue; } else { printWarning("Cannot set owner ship of directory '%s' (error: %s)\n", String_cString(directoryName), Errors_getText(error) ); } } } String_delete(directoryName); /* write file data */ //if (fileFragmentNode == NULL) File_delete(destinationFileName,TRUE); error = File_open(&fileHandle,destinationFileName,FILE_OPENMODE_WRITE); if (error != ERROR_NONE) { printInfo(2,"FAIL!\n"); printError("Cannot create/write to file '%s' (error: %s)\n", String_cString(destinationFileName), Errors_getText(error) ); String_delete(destinationFileName); Archive_closeEntry(&archiveFileInfo); String_delete(fileName); if (jobOptions->stopOnErrorFlag) { restoreInfo.error = error; } continue; } error = File_seek(&fileHandle,fragmentOffset); if (error != ERROR_NONE) { printInfo(2,"FAIL!\n"); printError("Cannot write file '%s' (error: %s)\n", String_cString(destinationFileName), Errors_getText(error) ); File_close(&fileHandle); String_delete(destinationFileName); Archive_closeEntry(&archiveFileInfo); String_delete(fileName); if (jobOptions->stopOnErrorFlag) { restoreInfo.error = error; } continue; } length = 0; while ( ((restoreInfo.requestedAbortFlag == NULL) || !(*restoreInfo.requestedAbortFlag)) && (length < fragmentSize) ) { /* pause */ while ((restoreInfo.pauseFlag != NULL) && (*restoreInfo.pauseFlag)) { Misc_udelay(500*1000); } n = MIN(fragmentSize-length,BUFFER_SIZE); error = Archive_readFileData(&archiveFileInfo,buffer,n); if (error != ERROR_NONE) { printInfo(2,"FAIL!\n"); printError("Cannot not read content of archive '%s' (error: %s)!\n", String_cString(archiveFileName), Errors_getText(error) ); if (restoreInfo.error == ERROR_NONE) restoreInfo.error = error; break; } error = File_write(&fileHandle,buffer,n); if (error != ERROR_NONE) { printInfo(2,"FAIL!\n"); printError("Cannot write file '%s' (error: %s)\n", String_cString(destinationFileName), Errors_getText(error) ); if (jobOptions->stopOnErrorFlag) { restoreInfo.error = error; } break; } restoreInfo.statusInfo.fileDoneBytes += n; updateStatusInfo(&restoreInfo); length += n; } if (File_getSize(&fileHandle) > fileInfo.size) { File_truncate(&fileHandle,fileInfo.size); } File_close(&fileHandle); if ((restoreInfo.requestedAbortFlag != NULL) && (*restoreInfo.requestedAbortFlag)) { printInfo(2,"ABORTED\n"); String_delete(destinationFileName); Archive_closeEntry(&archiveFileInfo); String_delete(fileName); continue; } #if 0 if (restoreInfo.error != ERROR_NONE) { String_delete(destinationFileName); Archive_closeEntry(&archiveFileInfo); String_delete(fileName); continue; } #endif /* 0 */ /* set file time, file owner/group */ if (jobOptions->owner.userId != FILE_DEFAULT_USER_ID ) fileInfo.userId = jobOptions->owner.userId; if (jobOptions->owner.groupId != FILE_DEFAULT_GROUP_ID) fileInfo.groupId = jobOptions->owner.groupId; error = File_setFileInfo(destinationFileName,&fileInfo); if (error != ERROR_NONE) { if (jobOptions->stopOnErrorFlag) { printInfo(2,"FAIL!\n"); printError("Cannot set file info of '%s' (error: %s)\n", String_cString(destinationFileName), Errors_getText(error) ); String_delete(destinationFileName); Archive_closeEntry(&archiveFileInfo); String_delete(fileName); restoreInfo.error = error; continue; } else { printWarning("Cannot set file info of '%s' (error: %s)\n", String_cString(destinationFileName), Errors_getText(error) ); } } /* add fragment to file fragment list */ FileFragmentList_add(fileFragmentNode,fragmentOffset,fragmentSize); //FileFragmentList_print(fileFragmentNode,String_cString(fileName)); /* discard fragment list if file is complete */ if (FileFragmentList_checkComplete(fileFragmentNode)) { FileFragmentList_removeFile(&fileFragmentList,fileFragmentNode); } /* free resources */ String_delete(destinationFileName); printInfo(2,"ok\n"); } else { /* skip */ printInfo(3," Restore '%s'...skipped\n",String_cString(fileName)); } /* close archive file, free resources */ Archive_closeEntry(&archiveFileInfo); String_delete(fileName); } break; case FILE_TYPE_DIRECTORY: { String directoryName; FileInfo fileInfo; String destinationFileName; // FileInfo localFileInfo; /* read directory */ directoryName = String_new(); error = Archive_readDirectoryEntry(&archiveInfo, &archiveFileInfo, NULL, NULL, directoryName, &fileInfo ); if (error != ERROR_NONE) { printError("Cannot not read 'directory' content of archive '%s' (error: %s)!\n", String_cString(archiveFileName), Errors_getText(error) ); String_delete(directoryName); if (restoreInfo.error == ERROR_NONE) restoreInfo.error = error; break; } if ( (List_empty(includePatternList) || PatternList_match(includePatternList,directoryName,PATTERN_MATCH_MODE_EXACT)) && !PatternList_match(excludePatternList,directoryName,PATTERN_MATCH_MODE_EXACT) ) { String_set(restoreInfo.statusInfo.fileName,directoryName); restoreInfo.statusInfo.fileDoneBytes = 0LL; restoreInfo.statusInfo.fileTotalBytes = 00L; updateStatusInfo(&restoreInfo); /* get destination filename */ destinationFileName = getDestinationFileName(String_new(), directoryName, jobOptions->directory, jobOptions->directoryStripCount ); /* check if directory already exists */ if (!jobOptions->overwriteFilesFlag && File_exists(destinationFileName)) { printInfo(1, " Restore directory '%s'...skipped (file exists)\n", String_cString(destinationFileName) ); String_delete(destinationFileName); Archive_closeEntry(&archiveFileInfo); String_delete(directoryName); continue; } printInfo(2," Restore directory '%s'...",String_cString(destinationFileName)); /* create directory */ error = File_makeDirectory(destinationFileName, FILE_DEFAULT_USER_ID, FILE_DEFAULT_GROUP_ID, fileInfo.permission ); if (error != ERROR_NONE) { printInfo(2,"FAIL!\n"); printError("Cannot create directory '%s' (error: %s)\n", String_cString(destinationFileName), Errors_getText(error) ); String_delete(destinationFileName); Archive_closeEntry(&archiveFileInfo); String_delete(directoryName); if (jobOptions->stopOnErrorFlag) { restoreInfo.error = error; } continue; } /* set file time, file owner/group */ if (jobOptions->owner.userId != FILE_DEFAULT_USER_ID ) fileInfo.userId = jobOptions->owner.userId; if (jobOptions->owner.groupId != FILE_DEFAULT_GROUP_ID) fileInfo.groupId = jobOptions->owner.groupId; error = File_setFileInfo(destinationFileName,&fileInfo); if (error != ERROR_NONE) { if (jobOptions->stopOnErrorFlag) { printInfo(2,"FAIL!\n"); printError("Cannot set directory info of '%s' (error: %s)\n", String_cString(destinationFileName), Errors_getText(error) ); String_delete(destinationFileName); Archive_closeEntry(&archiveFileInfo); String_delete(directoryName); if (jobOptions->stopOnErrorFlag) { restoreInfo.error = error; } continue; } else { printWarning("Cannot set directory info of '%s' (error: %s)\n", String_cString(destinationFileName), Errors_getText(error) ); } } /* free resources */ String_delete(destinationFileName); printInfo(2,"ok\n"); } else { /* skip */ printInfo(3," Restore '%s'...skipped\n",String_cString(directoryName)); } /* close archive file */ Archive_closeEntry(&archiveFileInfo); String_delete(directoryName); } break; case FILE_TYPE_LINK: { String linkName; String fileName; FileInfo fileInfo; String destinationFileName; // FileInfo localFileInfo; /* read link */ linkName = String_new(); fileName = String_new(); error = Archive_readLinkEntry(&archiveInfo, &archiveFileInfo, NULL, NULL, linkName, fileName, &fileInfo ); if (error != ERROR_NONE) { printError("Cannot not read 'link' content of archive '%s' (error: %s)!\n", String_cString(archiveFileName), Errors_getText(error) ); String_delete(fileName); String_delete(linkName); if (restoreInfo.error == ERROR_NONE) restoreInfo.error = error; break; } if ( (List_empty(includePatternList) || PatternList_match(includePatternList,linkName,PATTERN_MATCH_MODE_EXACT)) && !PatternList_match(excludePatternList,linkName,PATTERN_MATCH_MODE_EXACT) ) { String_set(restoreInfo.statusInfo.fileName,linkName); restoreInfo.statusInfo.fileDoneBytes = 0LL; restoreInfo.statusInfo.fileTotalBytes = 00L; updateStatusInfo(&restoreInfo); /* get destination filename */ destinationFileName = getDestinationFileName(String_new(), linkName, jobOptions->directory, jobOptions->directoryStripCount ); /* create link */ if (!jobOptions->overwriteFilesFlag && File_exists(destinationFileName)) { printInfo(1, " Restore link '%s'...skipped (file exists)\n", String_cString(destinationFileName) ); String_delete(destinationFileName); Archive_closeEntry(&archiveFileInfo); String_delete(fileName); String_delete(linkName); if (jobOptions->stopOnErrorFlag) { restoreInfo.error = ERROR_FILE_EXITS; } continue; } printInfo(2," Restore link '%s'...",String_cString(destinationFileName)); error = File_makeLink(destinationFileName,fileName); if (error != ERROR_NONE) { printInfo(2,"FAIL!\n"); printError("Cannot create link '%s' -> '%s' (error: %s)\n", String_cString(destinationFileName), String_cString(fileName), Errors_getText(error) ); String_delete(destinationFileName); Archive_closeEntry(&archiveFileInfo); String_delete(fileName); String_delete(linkName); if (jobOptions->stopOnErrorFlag) { restoreInfo.error = error; } continue; } /* set file time, file owner/group */ if (jobOptions->owner.userId != FILE_DEFAULT_USER_ID ) fileInfo.userId = jobOptions->owner.userId; if (jobOptions->owner.groupId != FILE_DEFAULT_GROUP_ID) fileInfo.groupId = jobOptions->owner.groupId; error = File_setFileInfo(destinationFileName,&fileInfo); if (error != ERROR_NONE) { if (jobOptions->stopOnErrorFlag) { printInfo(2,"FAIL!\n"); printError("Cannot set file info of '%s' (error: %s)\n", String_cString(destinationFileName), Errors_getText(error) ); String_delete(destinationFileName); Archive_closeEntry(&archiveFileInfo); String_delete(fileName); String_delete(linkName); if (jobOptions->stopOnErrorFlag) { restoreInfo.error = error; } continue; } else { printWarning("Cannot set file info of '%s' (error: %s)\n", String_cString(destinationFileName), Errors_getText(error) ); } } /* free resources */ String_delete(destinationFileName); printInfo(2,"ok\n"); } else { /* skip */ printInfo(3," Restore '%s'...skipped\n",String_cString(linkName)); } /* close archive file */ Archive_closeEntry(&archiveFileInfo); String_delete(fileName); String_delete(linkName); } break; case FILE_TYPE_SPECIAL: { String fileName; FileInfo fileInfo; String destinationFileName; // FileInfo localFileInfo; /* read special device */ fileName = String_new(); error = Archive_readSpecialEntry(&archiveInfo, &archiveFileInfo, NULL, NULL, fileName, &fileInfo ); if (error != ERROR_NONE) { printError("Cannot not read 'special' content of archive '%s' (error: %s)!\n", String_cString(archiveFileName), Errors_getText(error) ); String_delete(fileName); if (restoreInfo.error == ERROR_NONE) restoreInfo.error = error; break; } if ( (List_empty(includePatternList) || PatternList_match(includePatternList,fileName,PATTERN_MATCH_MODE_EXACT)) && !PatternList_match(excludePatternList,fileName,PATTERN_MATCH_MODE_EXACT) ) { String_set(restoreInfo.statusInfo.fileName,fileName); restoreInfo.statusInfo.fileDoneBytes = 0LL; restoreInfo.statusInfo.fileTotalBytes = 00L; updateStatusInfo(&restoreInfo); /* get destination filename */ destinationFileName = getDestinationFileName(String_new(), fileName, jobOptions->directory, jobOptions->directoryStripCount ); /* create special device */ if (!jobOptions->overwriteFilesFlag && File_exists(destinationFileName)) { printInfo(1, " Restore special device '%s'...skipped (file exists)\n", String_cString(destinationFileName) ); String_delete(destinationFileName); Archive_closeEntry(&archiveFileInfo); String_delete(fileName); if (jobOptions->stopOnErrorFlag) { restoreInfo.error = ERROR_FILE_EXITS; } continue; } printInfo(2," Restore special device '%s'...",String_cString(destinationFileName)); error = File_makeSpecial(destinationFileName, fileInfo.specialType, fileInfo.major, fileInfo.minor ); if (error != ERROR_NONE) { printInfo(2,"FAIL!\n"); printError("Cannot create special device '%s' (error: %s)\n", String_cString(fileName), Errors_getText(error) ); String_delete(destinationFileName); Archive_closeEntry(&archiveFileInfo); String_delete(fileName); if (jobOptions->stopOnErrorFlag) { restoreInfo.error = error; } continue; } /* set file time, file owner/group */ if (jobOptions->owner.userId != FILE_DEFAULT_USER_ID ) fileInfo.userId = jobOptions->owner.userId; if (jobOptions->owner.groupId != FILE_DEFAULT_GROUP_ID) fileInfo.groupId = jobOptions->owner.groupId; error = File_setFileInfo(destinationFileName,&fileInfo); if (error != ERROR_NONE) { if (jobOptions->stopOnErrorFlag) { printInfo(2,"FAIL!\n"); printError("Cannot set file info of '%s' (error: %s)\n", String_cString(destinationFileName), Errors_getText(error) ); String_delete(destinationFileName); Archive_closeEntry(&archiveFileInfo); String_delete(fileName); if (jobOptions->stopOnErrorFlag) { restoreInfo.error = error; } continue; } else { printWarning("Cannot set file info of '%s' (error: %s)\n", String_cString(destinationFileName), Errors_getText(error) ); } } /* free resources */ String_delete(destinationFileName); printInfo(2,"ok\n"); } else { /* skip */ printInfo(3," Restore '%s'...skipped\n",String_cString(fileName)); } /* close archive file */ Archive_closeEntry(&archiveFileInfo); String_delete(fileName); } break; default: #ifndef NDEBUG HALT_INTERNAL_ERROR_UNHANDLED_SWITCH_CASE(); #endif /* NDEBUG */ break; /* not reached */ } } /* close archive */ Archive_close(&archiveInfo); } /* check fragment lists */ if ((restoreInfo.requestedAbortFlag == NULL) || !(*restoreInfo.requestedAbortFlag)) { for (fileFragmentNode = fileFragmentList.head; fileFragmentNode != NULL; fileFragmentNode = fileFragmentNode->next) { if (!FileFragmentList_checkComplete(fileFragmentNode)) { printInfo(0,"Warning: incomplete file '%s'\n",String_cString(fileFragmentNode->fileName)); if (restoreInfo.error == ERROR_NONE) restoreInfo.error = ERROR_FILE_INCOMPLETE; } } } /* free resources */ String_delete(archiveFileName); FileFragmentList_done(&fileFragmentList); free(buffer); String_delete(restoreInfo.statusInfo.fileName); String_delete(restoreInfo.statusInfo.storageName); if ((restoreInfo.requestedAbortFlag == NULL) || !(*restoreInfo.requestedAbortFlag)) { return restoreInfo.error; } else { return ERROR_ABORTED; } }