searchengine/util/cpixtools/src/cpixfstools.cpp
changeset 8 6547bf8ca13a
parent 2 6c1a2771f4b7
child 23 d4d56f5e7c55
--- a/searchengine/util/cpixtools/src/cpixfstools.cpp	Fri Jun 11 14:43:47 2010 +0300
+++ b/searchengine/util/cpixtools/src/cpixfstools.cpp	Mon Jun 28 10:34:53 2010 +0530
@@ -52,7 +52,7 @@
 	size_t
             i = len-1;
 
-	while (1)/*(i >= 0)*/ {
+	while (i > 0) {
             char c = child[i];
             if (c == '\\' ||
                 c == '/') {
@@ -63,9 +63,8 @@
 	}
         
 	if (i+1 >= FILENAME_MAX 
-            || i+1 >= bufSize)
-            //|| i < 0) 
-	{
+            || i+1 >= bufSize
+            || i == 0) {
             return -1;
 	}
 	
@@ -87,7 +86,10 @@
         Cpt_EINTR_RETRY_PTR(d, opendir(path));
 
 	if (d) {
-            Cpt_EINTR_RETRY_SP( closedir(d) );
+            int
+                result;
+            Cpt_EINTR_RETRY(result, closedir(d));
+            
             rv = true;
 	} 
     
@@ -205,7 +207,7 @@
 
         if (getparent(parent, sizeof(parent), path) >= 0) {
             // make the parent
-            (void)mkdirs(parent, mod); 
+            mkdirs(parent, mod); 
         } 
         
         return mkdir(path, mod);
@@ -225,8 +227,10 @@
                              mod));
         if (fd != -1)
             {
-
-                Cpt_EINTR_RETRY_SP( close(fd) );
+                int
+                    result;
+                Cpt_EINTR_RETRY(result,
+                                close(fd));
             }
 
         return fd == -1 ? -1 : 0;
@@ -246,7 +250,10 @@
         
         if (rv)
             {
-            Cpt_EINTR_RETRY_SP( close(fd) );
+                int
+                    result;
+                Cpt_EINTR_RETRY(result,
+                                close(fd));
             }
 
         return rv;
@@ -318,8 +325,56 @@
         
         return rv;
     }
+    
+    namespace 
+	{
+		class DirectorySizeCalculator : public IFileVisitor 
+		{
+		public: 
+		
+			DirectorySizeCalculator()
+			:	totalSize_(0)
+			{}
+		
+			virtual bool visitFile(const char * path) 
+			{
+				totalSize_ += filesize(path); 
+				return true; 
+			}
+	
+			virtual DirVisitResult visitDirPre(const char * path)
+			{
+			    //To avoid compiler warning. 
+			    std::string ret = path;
+			    
+			    return IFV_CONTINUE;
+			}
+			
+	        virtual bool visitDirPost(const char * path) 
+	        {
+                std::string ret = path; 
+                ret.empty();    
+	        	return true; 
+	        }
+			
+			long totalSize() 
+			{
+				return totalSize_; 
+			}
+			
+		private: 
+			
+			long totalSize_; 
+	
+		};
+	}
 
-
+    off_t dirsize(const char* path) 
+    {
+    	DirectorySizeCalculator sizeCalculator; 
+    	traverse(path, &sizeCalculator);
+    	return sizeCalculator.totalSize(); 
+    }
 
     time_t filemodified(const char * path)
     {
@@ -341,6 +396,17 @@
         return rv;
     }
 
+    std::string appendpath(const char* path, const char* item)
+    {
+    	std::string ret; 
+    	ret += path; 
+    	if (ret[ret.length()-1] != '\\' && ret[ret.length()-1] != '/') {
+			ret += DIR_SEPARATOR;
+    	}
+    	ret += item;
+    	return ret;
+    }
+
     bool fgetline(FILE* file, std::string& line)
    	{
 		std::ostringstream buf; 
@@ -655,7 +721,10 @@
 
     DIRSentry::~DIRSentry()
     {
-        Cpt_EINTR_RETRY_SP( closedir(d_) );
+        int
+            result;
+
+        Cpt_EINTR_RETRY(result, closedir(d_));
     }
 
 
@@ -769,7 +838,11 @@
         if (fileDesc_ != NULL
             && *fileDesc_ != -1)
             {
-                Cpt_EINTR_RETRY_SP( close(*fileDesc_) );
+                int
+                    result;
+
+                Cpt_EINTR_RETRY(result,
+                                close(*fileDesc_));
             }
     }
     
@@ -790,7 +863,10 @@
 	{
 		if ( file_ != NULL )
 		{
-			Cpt_EINTR_RETRY_SP( fclose(file_) ); 
+			int result;
+			
+			Cpt_EINTR_RETRY(result, 
+							fclose(file_)); 
 		}
 	}