import logging
 import datetime
 import binascii
+import operator
 import os
+import copy
 import shutil
 import re
 import stat
             u'type': ptype,
             u'path': unicode(path),
             u'mode': mode,
-            u'mtime': stinfo.st_mtime,
-            u'ctime': stinfo.st_ctime,
+            u'mtime': int(stinfo.st_mtime),
+            u'ctime': int(stinfo.st_ctime),
             u'uid': stinfo.st_uid,
             u'gid': stinfo.st_gid,
             u'inode': stinfo.st_ino,
         '''
         Return if the dicts are equal in the stat keys
         '''
-        keys = [u'gid', u'type', u'mode',u'size', u'uid',
+        keys = [u'gid', u'type', u'mode',u'size', u'uid', u'mtime', u'ctime',
             # TODO: check how to restore this correctly if possible
-            #u'mtime', u'ctime', u'inode'
+            # u'inode'
         ]
 
         if (not d1 and d2 != None) or (d1 != None and not d2):
                 helper.delete(upath)
                 helper.restore(ipath, l_no)
 
+            helper.restore_directories_permissions()
             os.chdir(cwd)
             helper.cleanup()
 
 
     _cwd = None
 
+    # list of directories to be restored. This is done as a last step, see
+    # tarfile.extractall for details.
+    _directories = []
+
     def __init__(self, deltatar, cwd, index_list):
         '''
         Constructor opens the tars and init the data structures.
         Index list must be provided in reverse order (newer first)
         '''
         self._data = []
+        self._directories = []
         self._deltatar = deltatar
         self._cwd = cwd
 
         # we go from index to index, finding the path in the index, then finding
         # the index with the most recent snapshot of the file being restored
         cur_index = 1
-
         while cur_index < len(self._data):
             data = self._data[cur_index]
             it = data['iterator']
         self._deltatar.logger.warn(('Error restoring file %s from index, '
                                     'snapshot not found in any index') % path)
 
+    def restore_directories_permissions(self):
+        '''
+        Restore directory permissions when everything have been restored
+        '''
+        self._directories.sort(key=operator.attrgetter('name'))
+        self._directories.reverse()
+        tarobj = self._data[0]['tarobj']
+
+        # Set correct owner, mtime and filemode on directories.
+        for member in self._directories:
+            dirpath = member.name
+            try:
+                tarobj.chmod(member, dirpath)
+                tarobj.utime(member, dirpath)
+                tarobj.chown(member, dirpath)
+            except tarfile.ExtractError, e:
+                self._deltatar.logger.warn('tarfile: %s' % e)
+
     @classmethod
     def new_volume_handler(deltarobj, cwd, backup_path, tarobj, base_name, volume_number):
         '''
 
         member.path = unprefixed
         member.name = unprefixed
+
+        if op_type == 'directory':
+            self._directories.append(member)
+            member = copy.copy(member)
+            member.mode = 0700
+
         # finally, restore the file
-        index_data['tarobj'].extract(member)
\ No newline at end of file
+        index_data['tarobj'].extract(member)