22 import errno, os, stat, tempfile
23 from gettext
import gettext
as _
40 orig_filename = filename
43 while link_count < MAXSYMLINKS:
45 linkname = os.readlink(filename)
47 if e.errno != errno.EINVAL
and e.errno != errno.ENOENT:
61 filename = os.path.join(os.path.dirname(filename), linkname)
71 raise OSError(errno.ELOOP, os.strerror(errno.ELOOP), orig_filename)
80 saved = os.umask(0777)
130 def write(filename, write_func, overwrite = False,
137 st = os.stat(filename)
139 if e.errno != errno.ENOENT:
144 if not overwrite
and not os.access(filename, os.W_OK):
145 raise IOError(errno.EACCES, os.strerror(errno.EACCES), filename)
147 if not stat.S_ISREG(st.st_mode):
149 'Refusing to overwrite non-regular file: ' + filename
152 dirname, basename = os.path.split(filename)
161 mode = 0666 & ~
umask()
164 dir_st = os.stat(dirname)
165 if dir_st.st_mode & stat.S_ISGID:
174 f = tempfile.NamedTemporaryFile(
175 dir = dirname, prefix = basename +
'.', delete =
False)
193 if backup
and st
is not None:
195 os.rename(filename, filename +
'~')
197 sys.stderr.write(_(
"Failed to back up '%s': %s\n")
198 % (filename, e.strerror))
200 os.rename(f.name, filename)
210 os.chmod(filename, mode)
212 sys.stderr.write(_(
"Failed to restore permissions on '%s': %s\n")
213 % (filename, e.strerror))
215 os.chown(filename, uid, gid)
217 sys.stderr.write(_(
"Failed to restore ownership on '%s': %s\n")
218 % (filename, e.strerror))
def write
Write some data to a file in a reasonably safe way.
def follow_symlinks
Follow a series of symbolic links and return the destination path.
def umask
Return the process's file mode creation mask.