def open(self, reopen_flag=False): """Open the given resource. @param reopen_flag when True, attempt to reopen the same resource and check if it differs from the previously opened one. @raise Exception if valid log_stream_fd was already provided, is still open and reopen_flag is False. @raise OSError when opening failed with unexpected error. @return True if the resource was really opened or False if opening was not yet possible but should be attempted again.""" if not reopen_flag and (self.log_file_fd != -1): raise Exception('Cannot reopen stream still open when not instructed to do so') log_file_fd = -1 stat_data = None try: log_file_fd = SecureOSFunctions.secure_open_file(self.log_resource_name[7:], os.O_RDONLY) stat_data = os.fstat(log_file_fd) except OSError as openOsError: if log_file_fd != -1: os.close(log_file_fd) if openOsError.errno == errno.ENOENT: return False raise if not stat.S_ISREG(stat_data.st_mode): os.close(log_file_fd) raise Exception('Attempting to open non-regular file %s as file' % encode_byte_string_as_string(self.log_resource_name)) if reopen_flag and (self.stat_data is not None) and (stat_data.st_ino == self.stat_data.st_ino) and ( stat_data.st_dev == self.stat_data.st_dev): # Reopening was requested, but we would reopen the file already opened, which is of no use. os.close(log_file_fd) return False # This is a new file or a successful reopen attempt. self.log_file_fd = log_file_fd self.stat_data = stat_data return True
def open_persistence_file(file_name, flags): """This function opens the given persistence file. When O_CREAT was specified, the function will attempt to create the directories too.""" if isinstance(file_name, str): file_name = file_name.encode() try: fd = SecureOSFunctions.secure_open_file(file_name, flags) return fd except OSError as openOsError: if ((flags & os.O_CREAT) == 0) or (openOsError.errno != errno.ENOENT): raise openOsError # Find out, which directory is missing by stating our way up. dir_name_length = file_name.rfind(b'/') if dir_name_length > 0: os.makedirs(file_name[:dir_name_length]) return SecureOSFunctions.secure_open_file(file_name, flags)
def open_persistence_file(file_name, flags): """ Open the given persistence file. When O_CREAT was specified, the function will attempt to create the directories too. """ if isinstance(file_name, str): file_name = file_name.encode() try: fd = SecureOSFunctions.secure_open_file(file_name, flags) return fd except OSError as openOsError: if ((flags & os.O_CREAT) == 0) or (openOsError.errno != errno.ENOENT): logging.getLogger(DEBUG_LOG_NAME).error(openOsError) raise openOsError create_missing_directories(file_name)