我们从Python开源项目中,提取了以下25个代码示例,用于说明如何使用stat.S_ISGID。
def _apply_operation_to_mode(user, operator, mode_to_apply, current_mode): if operator == '=': if user == 'u': mask = stat.S_IRWXU | stat.S_ISUID elif user == 'g': mask = stat.S_IRWXG | stat.S_ISGID elif user == 'o': mask = stat.S_IRWXO | stat.S_ISVTX # mask out u, g, or o permissions from current_mode and apply new permissions inverse_mask = mask ^ PERM_BITS new_mode = (current_mode & inverse_mask) | mode_to_apply elif operator == '+': new_mode = current_mode | mode_to_apply elif operator == '-': new_mode = current_mode - (current_mode & mode_to_apply) return new_mode
def statinfo(st): return { 'mode' : "%04o" % stat.S_IMODE(st.st_mode), 'isdir' : stat.S_ISDIR(st.st_mode), 'ischr' : stat.S_ISCHR(st.st_mode), 'isblk' : stat.S_ISBLK(st.st_mode), 'isreg' : stat.S_ISREG(st.st_mode), 'isfifo' : stat.S_ISFIFO(st.st_mode), 'islnk' : stat.S_ISLNK(st.st_mode), 'issock' : stat.S_ISSOCK(st.st_mode), 'uid' : st.st_uid, 'gid' : st.st_gid, 'size' : st.st_size, 'inode' : st.st_ino, 'dev' : st.st_dev, 'nlink' : st.st_nlink, 'atime' : st.st_atime, 'mtime' : st.st_mtime, 'ctime' : st.st_ctime, 'wusr' : bool(st.st_mode & stat.S_IWUSR), 'rusr' : bool(st.st_mode & stat.S_IRUSR), 'xusr' : bool(st.st_mode & stat.S_IXUSR), 'wgrp' : bool(st.st_mode & stat.S_IWGRP), 'rgrp' : bool(st.st_mode & stat.S_IRGRP), 'xgrp' : bool(st.st_mode & stat.S_IXGRP), 'woth' : bool(st.st_mode & stat.S_IWOTH), 'roth' : bool(st.st_mode & stat.S_IROTH), 'xoth' : bool(st.st_mode & stat.S_IXOTH), 'isuid' : bool(st.st_mode & stat.S_ISUID), 'isgid' : bool(st.st_mode & stat.S_ISGID), }
def _apply_operation_to_mode(self, user, operator, mode_to_apply, current_mode): if operator == '=': if user == 'u': mask = stat.S_IRWXU | stat.S_ISUID elif user == 'g': mask = stat.S_IRWXG | stat.S_ISGID elif user == 'o': mask = stat.S_IRWXO | stat.S_ISVTX # mask out u, g, or o permissions from current_mode and apply new permissions inverse_mask = mask ^ PERM_BITS new_mode = (current_mode & inverse_mask) | mode_to_apply elif operator == '+': new_mode = current_mode | mode_to_apply elif operator == '-': new_mode = current_mode - (current_mode & mode_to_apply) return new_mode
def test_exist_ok_s_isgid_directory(self): path = os.path.join(support.TESTFN, 'dir1') S_ISGID = stat.S_ISGID mode = 0o777 old_mask = os.umask(0o022) try: existing_testfn_mode = stat.S_IMODE( os.lstat(support.TESTFN).st_mode) try: os.chmod(support.TESTFN, existing_testfn_mode | S_ISGID) except PermissionError: raise unittest.SkipTest('Cannot set S_ISGID for dir.') if (os.lstat(support.TESTFN).st_mode & S_ISGID != S_ISGID): raise unittest.SkipTest('No support for S_ISGID dir mode.') # The os should apply S_ISGID from the parent dir for us, but # this test need not depend on that behavior. Be explicit. os.makedirs(path, mode | S_ISGID) # http://bugs.python.org/issue14992 # Should not fail when the bit is already set. os.makedirs(path, mode, exist_ok=True) # remove the bit. os.chmod(path, stat.S_IMODE(os.lstat(path).st_mode) & ~S_ISGID) with self.assertRaises(OSError): # Should fail when the bit is not already set when demanded. os.makedirs(path, mode | S_ISGID, exist_ok=True) finally: os.umask(old_mask)
def test_exist_ok_s_isgid_directory(self): path = os.path.join(support.TESTFN, 'dir1') S_ISGID = stat.S_ISGID mode = 0o777 old_mask = os.umask(0o022) try: existing_testfn_mode = stat.S_IMODE( os.lstat(support.TESTFN).st_mode) try: os.chmod(support.TESTFN, existing_testfn_mode | S_ISGID) except PermissionError: raise unittest.SkipTest('Cannot set S_ISGID for dir.') if (os.lstat(support.TESTFN).st_mode & S_ISGID != S_ISGID): raise unittest.SkipTest('No support for S_ISGID dir mode.') # The os should apply S_ISGID from the parent dir for us, but # this test need not depend on that behavior. Be explicit. os.makedirs(path, mode | S_ISGID) # http://bugs.python.org/issue14992 # Should not fail when the bit is already set. os.makedirs(path, mode, exist_ok=True) # remove the bit. os.chmod(path, stat.S_IMODE(os.lstat(path).st_mode) & ~S_ISGID) # May work even when the bit is not already set when demanded. os.makedirs(path, mode | S_ISGID, exist_ok=True) finally: os.umask(old_mask)
def humanUnixAttributes(mode): """ Convert a Unix file attributes (or "file mode") to an unicode string. Original source code: http://cvs.savannah.gnu.org/viewcvs/coreutils/lib/filemode.c?root=coreutils >>> humanUnixAttributes(0o644) '-rw-r--r-- (644)' >>> humanUnixAttributes(0o2755) '-rwxr-sr-x (2755)' """ chars = [_ftypelet(mode), 'r', 'w', 'x', 'r', 'w', 'x', 'r', 'w', 'x'] for i in range(1, 10): if not mode & 1 << 9 - i: chars[i] = '-' if mode & stat.S_ISUID: if chars[3] != 'x': chars[3] = 'S' else: chars[3] = 's' if mode & stat.S_ISGID: if chars[6] != 'x': chars[6] = 'S' else: chars[6] = 's' if mode & stat.S_ISVTX: if chars[9] != 'x': chars[9] = 'T' else: chars[9] = 't' return "%s (%o)" % (''.join(chars), mode)
def test_sets_setuid_and_setgid_when_told_to(self): self.metadata.st_mode = 0777 | stat.S_ISUID | stat.S_ISGID obnamlib.set_metadata(self.fs, self.filename, self.metadata, always_set_id_bits=True) st = os.stat(self.filename) self.assertEqual(st.st_mode & stat.S_ISUID, stat.S_ISUID) self.assertEqual(st.st_mode & stat.S_ISGID, stat.S_ISGID)
def lsLine(name, s): mode = s.st_mode perms = array.array('c', '-'*10) ft = stat.S_IFMT(mode) if stat.S_ISDIR(ft): perms[0] = 'd' elif stat.S_ISCHR(ft): perms[0] = 'c' elif stat.S_ISBLK(ft): perms[0] = 'b' elif stat.S_ISREG(ft): perms[0] = '-' elif stat.S_ISFIFO(ft): perms[0] = 'f' elif stat.S_ISLNK(ft): perms[0] = 'l' elif stat.S_ISSOCK(ft): perms[0] = 's' else: perms[0] = '!' # user if mode&stat.S_IRUSR:perms[1] = 'r' if mode&stat.S_IWUSR:perms[2] = 'w' if mode&stat.S_IXUSR:perms[3] = 'x' # group if mode&stat.S_IRGRP:perms[4] = 'r' if mode&stat.S_IWGRP:perms[5] = 'w' if mode&stat.S_IXGRP:perms[6] = 'x' # other if mode&stat.S_IROTH:perms[7] = 'r' if mode&stat.S_IWOTH:perms[8] = 'w' if mode&stat.S_IXOTH:perms[9] = 'x' # suid/sgid if mode&stat.S_ISUID: if perms[3] == 'x': perms[3] = 's' else: perms[3] = 'S' if mode&stat.S_ISGID: if perms[6] == 'x': perms[6] = 's' else: perms[6] = 'S' l = perms.tostring() l += str(s.st_nlink).rjust(5) + ' ' un = str(s.st_uid) l += un.ljust(9) gr = str(s.st_gid) l += gr.ljust(9) sz = str(s.st_size) l += sz.rjust(8) l += ' ' sixmo = 60 * 60 * 24 * 7 * 26 if s.st_mtime + sixmo < time.time(): # last edited more than 6mo ago l += time.strftime("%b %2d %Y ", time.localtime(s.st_mtime)) else: l += time.strftime("%b %2d %H:%S ", time.localtime(s.st_mtime)) l += name return l
def __str__(self): "create a unix-style long description of the file (like ls -l)" if self.st_mode is not None: kind = stat.S_IFMT(self.st_mode) if kind == stat.S_IFIFO: ks = 'p' elif kind == stat.S_IFCHR: ks = 'c' elif kind == stat.S_IFDIR: ks = 'd' elif kind == stat.S_IFBLK: ks = 'b' elif kind == stat.S_IFREG: ks = '-' elif kind == stat.S_IFLNK: ks = 'l' elif kind == stat.S_IFSOCK: ks = 's' else: ks = '?' ks += self._rwx((self.st_mode & 0700) >> 6, self.st_mode & stat.S_ISUID) ks += self._rwx((self.st_mode & 070) >> 3, self.st_mode & stat.S_ISGID) ks += self._rwx(self.st_mode & 7, self.st_mode & stat.S_ISVTX, True) else: ks = '?---------' # compute display date if (self.st_mtime is None) or (self.st_mtime == 0xffffffffL): # shouldn't really happen datestr = '(unknown date)' else: if abs(time.time() - self.st_mtime) > 15552000: # (15552000 = 6 months) datestr = time.strftime('%d %b %Y', time.localtime(self.st_mtime)) else: datestr = time.strftime('%d %b %H:%M', time.localtime(self.st_mtime)) filename = getattr(self, 'filename', '?') # not all servers support uid/gid uid = self.st_uid gid = self.st_gid if uid is None: uid = 0 if gid is None: gid = 0 return '%s 1 %-8d %-8d %8d %-12s %s' % (ks, uid, gid, self.st_size, datestr, filename)
def _get_octal_mode_from_symbolic_perms(self, path_stat, user, perms): prev_mode = stat.S_IMODE(path_stat.st_mode) is_directory = stat.S_ISDIR(path_stat.st_mode) has_x_permissions = (prev_mode & EXEC_PERM_BITS) > 0 apply_X_permission = is_directory or has_x_permissions # Permission bits constants documented at: # http://docs.python.org/2/library/stat.html#stat.S_ISUID if apply_X_permission: X_perms = { 'u': {'X': stat.S_IXUSR}, 'g': {'X': stat.S_IXGRP}, 'o': {'X': stat.S_IXOTH} } else: X_perms = { 'u': {'X': 0}, 'g': {'X': 0}, 'o': {'X': 0} } user_perms_to_modes = { 'u': { 'r': stat.S_IRUSR, 'w': stat.S_IWUSR, 'x': stat.S_IXUSR, 's': stat.S_ISUID, 't': 0, 'u': prev_mode & stat.S_IRWXU, 'g': (prev_mode & stat.S_IRWXG) << 3, 'o': (prev_mode & stat.S_IRWXO) << 6 }, 'g': { 'r': stat.S_IRGRP, 'w': stat.S_IWGRP, 'x': stat.S_IXGRP, 's': stat.S_ISGID, 't': 0, 'u': (prev_mode & stat.S_IRWXU) >> 3, 'g': prev_mode & stat.S_IRWXG, 'o': (prev_mode & stat.S_IRWXO) << 3 }, 'o': { 'r': stat.S_IROTH, 'w': stat.S_IWOTH, 'x': stat.S_IXOTH, 's': 0, 't': stat.S_ISVTX, 'u': (prev_mode & stat.S_IRWXU) >> 6, 'g': (prev_mode & stat.S_IRWXG) >> 3, 'o': prev_mode & stat.S_IRWXO } } # Insert X_perms into user_perms_to_modes for key, value in X_perms.items(): user_perms_to_modes[key].update(value) or_reduce = lambda mode, perm: mode | user_perms_to_modes[user][perm] return reduce(or_reduce, perms, 0)
def __str__(self): """create a unix-style long description of the file (like ls -l)""" if self.st_mode is not None: kind = stat.S_IFMT(self.st_mode) if kind == stat.S_IFIFO: ks = 'p' elif kind == stat.S_IFCHR: ks = 'c' elif kind == stat.S_IFDIR: ks = 'd' elif kind == stat.S_IFBLK: ks = 'b' elif kind == stat.S_IFREG: ks = '-' elif kind == stat.S_IFLNK: ks = 'l' elif kind == stat.S_IFSOCK: ks = 's' else: ks = '?' ks += self._rwx((self.st_mode & o700) >> 6, self.st_mode & stat.S_ISUID) ks += self._rwx((self.st_mode & o70) >> 3, self.st_mode & stat.S_ISGID) ks += self._rwx(self.st_mode & 7, self.st_mode & stat.S_ISVTX, True) else: ks = '?---------' # compute display date if (self.st_mtime is None) or (self.st_mtime == xffffffff): # shouldn't really happen datestr = '(unknown date)' else: if abs(time.time() - self.st_mtime) > 15552000: # (15552000 = 6 months) datestr = time.strftime('%d %b %Y', time.localtime(self.st_mtime)) else: datestr = time.strftime('%d %b %H:%M', time.localtime(self.st_mtime)) filename = getattr(self, 'filename', '?') # not all servers support uid/gid uid = self.st_uid gid = self.st_gid if uid is None: uid = 0 if gid is None: gid = 0 return '%s 1 %-8d %-8d %8d %-12s %s' % (ks, uid, gid, self.st_size, datestr, filename)
def makedirs(name, mode=0o777, exist_ok=False): """makedirs(path [, mode=0o777][, exist_ok=False]) Super-mkdir; create a leaf directory and all intermediate ones. Works like mkdir, except that any intermediate path segment (not just the rightmost) will be created if it does not exist. If the target directory with the same mode as we specified already exists, raises an OSError if exist_ok is False, otherwise no exception is raised. This is recursive. """ head, tail = path.split(name) if not tail: head, tail = path.split(head) if head and tail and not path.exists(head): try: makedirs(head, mode, exist_ok) except OSError as e: # be happy if someone already created the path if e.errno != errno.EEXIST: raise cdir = curdir if isinstance(tail, bytes): cdir = bytes(curdir, 'ASCII') if tail == cdir: # xxx/newdir/. exists if xxx/newdir exists return try: mkdir(name, mode) except OSError as e: dir_exists = path.isdir(name) expected_mode = _get_masked_mode(mode) if dir_exists: # S_ISGID is automatically copied by the OS from parent to child # directories on mkdir. Don't consider it being set to be a mode # mismatch as mkdir does not unset it when not specified in mode. actual_mode = st.S_IMODE(lstat(name).st_mode) & ~st.S_ISGID else: actual_mode = -1 if not (e.errno == errno.EEXIST and exist_ok and dir_exists and actual_mode == expected_mode): if dir_exists and actual_mode != expected_mode: e.strerror += ' (mode %o != expected mode %o)' % ( actual_mode, expected_mode) raise
def ensure_dirs_gw(path, _parent_mode=False): """Ensure that path is a directory by creating it and parents if necessary. Also ensure that it is group-writeable and -executable, and setgid. All created parent directories get their mode bits set comparably. This is a fairly specialized function used in support of the NRAO Lustre staging feature. Implementation copied from os.makedirs() with some tweaks. """ import os.path import stat head, tail = os.path.split(path) # /a/b/c => /a/b, c if not len(tail): # if we got something like "a/b/" => ("a/b", "") head, tail = os.path.split(head) if len(head) and head != '/': ensure_dirs_gw(head, _parent_mode=True) try_chmod = not _parent_mode # deepest directory must be g+wxs try: # Note: the `mode` passed to mkdir is altered by the umask, which may # remove the group-write bit we want, so we can't rely on it to set # permissions correctly. os.mkdir(path) try_chmod = True # we created it, so definitely chmod except OSError as e: if e.errno == 17: pass # already exists; no problem, and maybe no chmod elif e.errno == 13: # EACCES raise Exception('unable to create directory \"%s\"; you probably ' 'need to make its parent group-writeable with:\n\n' 'chmod g+wx \'%s\'' % (path, os.path.dirname(path))) else: raise if try_chmod: st = os.stat(path) mode = stat.S_IMODE(st.st_mode) new_mode = mode | (stat.S_IWUSR | stat.S_IWGRP | stat.S_IXUSR | stat.S_IXGRP | stat.S_ISGID) if new_mode != mode: # avoid failure if perms are OK but we don't own the dir try: os.chmod(path, new_mode) except OSError as e: if e.errno == 1: # EPERM raise Exception('unable to make \"%s\" group-writeable; ' 'please do so yourself with:\n\nchmod g+wx \'%s\'' % (path, path)) raise
def copyfiletree(src, dst): """Something like shutil.copytree that just copies data, not mode bits, and that will accept either a file or a directory as input. *dst* may not be the name of containing directory. It must be the name where the data in *src* are intended to land. As a special hack, we make the new files and directories group-writeable, since this function is used at NRAO when staging data to Lustre and otherwise users can't actually modify the files/dirs created for them, which is super annoying. """ import os.path from shutil import copyfile import stat try: items = os.listdir(src) except OSError as e: if e.errno == 20: # not a directory? copyfile(src, dst) st = os.stat(dst) # NOTE! not src; we explicitly do not preserve perms mode = stat.S_IMODE(st.st_mode) mode |= (stat.S_IWUSR | stat.S_IWGRP) os.chmod(dst, mode) return raise os.mkdir(dst) st = os.stat(dst) # NOTE! not src; we explicitly do not preserve perms mode = stat.S_IMODE(st.st_mode) mode |= (stat.S_IWUSR | stat.S_IWGRP | stat.S_IXUSR | stat.S_IXGRP | stat.S_ISGID) os.chmod(dst, mode) for item in items: copyfiletree( os.path.join(src, item), os.path.join(dst, item) ) # Misc ...
def __str__(self): """create a unix-style long description of the file (like ls -l)""" if self.st_mode is not None: kind = stat.S_IFMT(self.st_mode) if kind == stat.S_IFIFO: ks = 'p' elif kind == stat.S_IFCHR: ks = 'c' elif kind == stat.S_IFDIR: ks = 'd' elif kind == stat.S_IFBLK: ks = 'b' elif kind == stat.S_IFREG: ks = '-' elif kind == stat.S_IFLNK: ks = 'l' elif kind == stat.S_IFSOCK: ks = 's' else: ks = '?' ks += self._rwx((self.st_mode & o700) >> 6, self.st_mode & stat.S_ISUID) ks += self._rwx((self.st_mode & o70) >> 3, self.st_mode & stat.S_ISGID) ks += self._rwx(self.st_mode & 7, self.st_mode & stat.S_ISVTX, True) else: ks = '?---------' # compute display date if (self.st_mtime is None) or (self.st_mtime == xffffffff): # shouldn't really happen datestr = '(unknown date)' else: if abs(time.time() - self.st_mtime) > 15552000: # (15552000 = 6 months) datestr = time.strftime('%d %b %Y', time.localtime(self.st_mtime)) else: datestr = time.strftime('%d %b %H:%M', time.localtime(self.st_mtime)) filename = getattr(self, 'filename', '?') # not all servers support uid/gid uid = self.st_uid gid = self.st_gid size = self.st_size if uid is None: uid = 0 if gid is None: gid = 0 if size is None: size = 0 return '%s 1 %-8d %-8d %8d %-12s %s' % (ks, uid, gid, size, datestr, filename)
def setattr(self, inode, attr, fields, fh, ctx): assert self._initialized inode = self.forest.inodes.get_by_value(inode) de = inode.direntry pending_changes = {} mode_filter = 0 if fields.update_uid: now_st_uid = de.data['st_uid'] if attr.st_uid >= 0 and attr.st_uid != now_st_uid: assert_or_errno(not ctx.uid, EPERM, 'nonroot setting uid') # Non-root can only do nop uid change pending_changes['st_uid'] = attr.st_uid if fields.update_gid: # Non-root can change gid to one he has, if he owns the file now_st_uid = de.data['st_uid'] now_st_gid = de.data['st_gid'] if attr.st_gid >= 0 and attr.st_gid != now_st_gid: assert_or_errno(not ctx.uid or (ctx.uid == now_st_uid and self._ctx_has_gid(ctx, attr.st_gid)), EPERM, 'nonroot setting gid') pending_changes['st_gid'] = attr.st_gid if ctx.uid: mode_filter = stat.S_ISUID | stat.S_ISGID # Non-root setuid/gid should reset setuid/gid if fields.update_mode: # TBD: use S_IFMT + S_IMODE to filter this or not? pending_changes['st_mode'] = attr.st_mode & ~mode_filter elif mode_filter: pending_changes['st_mode'] = de.data['st_mode'] & ~mode_filter if fields.update_mtime: _debug('%s mtime set to %s', inode, attr.st_mtime_ns) pending_changes['st_mtime_ns'] = attr.st_mtime_ns if fields.update_size: pending_changes['st_size'] = attr.st_size pending_changes = {k: v for k, v in pending_changes.items() if k not in de.data or de.data[k] != v} if pending_changes: for k, v in pending_changes.items(): assert_or_errno(self.access(inode.value, os.W_OK, ctx, or_own=True), EPERM, 'setattr-file write') if k == 'st_size': inode.set_size(v) else: de.set_data(k, v) inode.change_ctime() return self._inode_attributes(inode)
def __str__(self): """create a unix-style long description of the file (like ls -l)""" if self.st_mode is not None: kind = stat.S_IFMT(self.st_mode) if kind == stat.S_IFIFO: ks = 'p' elif kind == stat.S_IFCHR: ks = 'c' elif kind == stat.S_IFDIR: ks = 'd' elif kind == stat.S_IFBLK: ks = 'b' elif kind == stat.S_IFREG: ks = '-' elif kind == stat.S_IFLNK: ks = 'l' elif kind == stat.S_IFSOCK: ks = 's' else: ks = '?' ks += self._rwx( (self.st_mode & o700) >> 6, self.st_mode & stat.S_ISUID) ks += self._rwx( (self.st_mode & o70) >> 3, self.st_mode & stat.S_ISGID) ks += self._rwx( self.st_mode & 7, self.st_mode & stat.S_ISVTX, True) else: ks = '?---------' # compute display date if (self.st_mtime is None) or (self.st_mtime == xffffffff): # shouldn't really happen datestr = '(unknown date)' else: if abs(time.time() - self.st_mtime) > 15552000: # (15552000 = 6 months) datestr = time.strftime( '%d %b %Y', time.localtime(self.st_mtime)) else: datestr = time.strftime( '%d %b %H:%M', time.localtime(self.st_mtime)) filename = getattr(self, 'filename', '?') # not all servers support uid/gid uid = self.st_uid gid = self.st_gid size = self.st_size if uid is None: uid = 0 if gid is None: gid = 0 if size is None: size = 0 return '%s 1 %-8d %-8d %8d %-12s %s' % ( ks, uid, gid, size, datestr, filename)
def humanUnixAttributes(mode): """ Convert a Unix file attributes (or "file mode") to an unicode string. Original source code: http://cvs.savannah.gnu.org/viewcvs/coreutils/lib/filemode.c?root=coreutils >>> humanUnixAttributes(0644) u'-rw-r--r-- (644)' >>> humanUnixAttributes(02755) u'-rwxr-sr-x (2755)' """ def ftypelet(mode): if stat.S_ISREG (mode) or not stat.S_IFMT(mode): return '-' if stat.S_ISBLK (mode): return 'b' if stat.S_ISCHR (mode): return 'c' if stat.S_ISDIR (mode): return 'd' if stat.S_ISFIFO(mode): return 'p' if stat.S_ISLNK (mode): return 'l' if stat.S_ISSOCK(mode): return 's' return '?' chars = [ ftypelet(mode), 'r', 'w', 'x', 'r', 'w', 'x', 'r', 'w', 'x' ] for i in xrange(1, 10): if not mode & 1 << 9 - i: chars[i] = '-' if mode & stat.S_ISUID: if chars[3] != 'x': chars[3] = 'S' else: chars[3] = 's' if mode & stat.S_ISGID: if chars[6] != 'x': chars[6] = 'S' else: chars[6] = 's' if mode & stat.S_ISVTX: if chars[9] != 'x': chars[9] = 'T' else: chars[9] = 't' return u"%s (%o)" % (''.join(chars), mode)
def __init__(self, dirname, factory=None, create=True, access=0o700, uid=None, gid=None): """Like the parent but allows specification of permission, uid, and gid if creating.""" # pylint: disable=W0233, W0231 mailbox.Mailbox.__init__(self, dirname, factory, create) self._paths = { 'tmp': os.path.join(self._path, 'tmp'), 'new': os.path.join(self._path, 'new'), 'cur': os.path.join(self._path, 'cur'), } exists = os.path.exists(self._path) is_mailbox = (os.path.exists(self._paths["tmp"]) and os.path.exists(self._paths["new"]) and os.path.exists(self._paths["cur"])) if not is_mailbox: if create: mask = os.umask(0o000) if not exists: try: os.mkdir(self._path, access) except OSError as e: # If another process has simultaneously created # this mailbox, that's fine. if e.errno != 17: raise os.chmod(self._path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXG | stat.S_ISGID) if uid and gid: os.chown(self._path, uid, gid) elif uid: os.chown(self._path, uid, -1) elif gid: os.chown(self._path, -1, gid) for path in self._paths.values(): if not os.path.exists(path): try: os.mkdir(path, access) except OSError as e: # If another process has simultaneously created # this mailbox, that's fine. if e.errno != 17: raise os.chmod(path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXG | stat.S_ISGID) if uid and gid: os.chown(path, uid, gid) elif uid: os.chown(path, uid, -1) elif gid: os.chown(path, -1, gid) os.umask(mask) else: raise mailbox.NoSuchMailboxError(self._path) self._toc = {} self._toc_mtimes = {'cur': 0, 'new': 0} self._last_read = 0 # Records last time we read cur/new self._skewfactor = 0.1 # Adjust if os/fs clocks are skewing