From 3d050ee24fb718c755ba9a065683a1c86b97b9be Mon Sep 17 00:00:00 2001 From: nanotube Date: Mon, 3 Oct 2005 03:33:30 +0000 Subject: [PATCH] fix bug when filename plus path was longer than 255 chars. improve error handling associated with files and dirs. --- logwriter.py | 78 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 67 insertions(+), 11 deletions(-) diff --git a/logwriter.py b/logwriter.py index f90f0bb..e7b7333 100644 --- a/logwriter.py +++ b/logwriter.py @@ -19,13 +19,30 @@ class LogWriter: if(detail.errno==17): #if directory already exists, swallow the error pass else: - print "OSError:", detail + self.PrintDebug(sys.exc_info()[0] + ", " + sys.exc_info()[1] + "\n") + except: + self.PrintDebug("Unexpected error: " + sys.exc_info()[0] + ", " + sys.exc_info()[1] + "\n") self.filter = re.compile(r"[\\\/\:\*\?\"\<\>\|]+") #regexp filter for the non-allowed characters in windows filenames. self.writeTarget = "" if self.options.systemLog != None: - self.systemlog = open(os.path.join(os.path.normpath(self.options.dirName), self.options.systemLog), 'a') + try: + self.systemlog = open(os.path.join(self.options.dirName, self.options.systemLog), 'a') + except OSError, detail: + if(detail.errno==17): #if file already exists, swallow the error + pass + else: + self.PrintDebug(sys.exc_info()[0] + ", " + sys.exc_info()[1] + "\n") + except: + self.PrintDebug("Unexpected error: " + sys.exc_info()[0] + ", " + sys.exc_info()[1] + "\n") + + + #~ if not self.options.debug: #if we are not running debug and thus can see console, let's redirect stderr to errorlog. + #~ self.errorlog = open(os.path.join(self.options.dirName, "errorlog.txt"), 'a') + #~ self.savestderr = sys.stderr #save stderr just in case we want to restore it later + #~ sys.stderr = self.errorlog + def WriteToLogFile(self, event): loggable = self.TestForNoLog(event) @@ -36,7 +53,10 @@ class LogWriter: if self.options.debug: self.PrintDebug("loggable, lets log it\n") - self.OpenLogFile(event) + loggable = self.OpenLogFile(event) + if not loggable: + self.PrintDebug("some error occurred when opening the log file. we cannot log this event. check systemlog (if specified) for details.\n") + return asciiSubset = [8,9,10,13,27] #backspace, tab, line feed, carriage return, escape asciiSubset.extend(range(32,128)) #all normal printable chars @@ -84,7 +104,18 @@ class LogWriter: if self.options.oneFile != None: if self.writeTarget == "": self.writeTarget = os.path.join(os.path.normpath(self.options.dirName), os.path.normpath(self.options.oneFile)) - self.log = open(self.writeTarget, 'a') + try: + self.log = open(self.writeTarget, 'a') + except OSError, detail: + if(detail.errno==17): #if file already exists, swallow the error + pass + else: + self.PrintDebug(sys.exc_info()[0] + ", " + sys.exc_info()[1] + "\n") + return False + except: + self.PrintDebug("Unexpected error: " + sys.exc_info()[0] + ", " + sys.exc_info()[1] + "\n") + return False + self.PrintDebug("writing to: " + self.writeTarget + "\n") return @@ -94,14 +125,27 @@ class LogWriter: try: os.makedirs(os.path.join(self.options.dirName, subDirName), 0777) - except OSError, detail: - if(detail.errno==17): #if directory already exists, swallow the error - pass - else: - print "OSError:", detail + except OSError, detail: + if(detail.errno==17): #if directory already exists, swallow the error + pass + else: + self.PrintDebug(sys.exc_info()[0] + ", " + sys.exc_info()[1] + "\n") + return False + except: + self.PrintDebug("Unexpected error: " + sys.exc_info()[0] + ", " + sys.exc_info()[1] + "\n") + return False filename = time.strftime('%Y%m%d') + "_" + str(event.Window) + "_" + WindowName - filename = filename[0:200] + ".txt" #make sure our filename is not longer than 255 characters, as per filesystem limit. + + #make sure our filename plus path is not longer than 255 characters, as per filesystem limit. + #filename = filename[0:200] + ".txt" + if len(os.path.join(self.options.dirName, subDirName, filename)) > 255: + if len(os.path.join(self.options.dirName, subDirName)) > 250: + self.PrintDebug("root log dir + subdirname is longer than 250. cannot log.") + return False + else: + filename = filename[0:255-len(os.path.join(self.options.dirName, subDirName))-4] + ".txt" + #we do this writetarget thing to make sure we dont keep opening and closing the log file when all inputs are going #into the same log file. so, when our new writetarget is the same as the previous one, we just write to the same @@ -114,7 +158,19 @@ class LogWriter: self.writeTarget = os.path.join(self.options.dirName, subDirName, filename) self.PrintDebug("writeTarget:" + self.writeTarget + "\n") - self.log = open(self.writeTarget, 'a') + try: + self.log = open(self.writeTarget, 'a') + except OSError, detail: + if(detail.errno==17): #if file already exists, swallow the error + pass + else: + self.PrintDebug(sys.exc_info()[0] + ", " + sys.exc_info()[1] + "\n") + return False + except: + self.PrintDebug("Unexpected error: " + sys.exc_info()[0] + ", " + sys.exc_info()[1] + "\n") + return False + + return True def PrintStuff(self, stuff): if not self.options.debug: -- 2.45.1