Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why doesn't os.chflags() work under Linux?

I'm using Python 2.7.9 under Debian GNU/Linux 8 (jessie) 64-bit. I just tried to change file attributes by calling os.chflags(path, mode). In the Python docs there is an article about the os interface which says that this method is available in Unix, but it doesn't work for Linux. Python always throws:

Traceback (most recent call last):
File "/home/lexer/py/epam/tests/main.py", line 43, in <module>
os.chflags(path_to_file(file_name), stat.SF_NOUNLINK)
AttributeError: 'module' object has no attribute 'chflags'

There is an issue which was already raised for that a long time ago, but I still can't understand why os.chflags() doesn't do the chattr command's job. Could anybody elaborate it?

like image 517
Alex-Bogdanov Avatar asked Dec 09 '15 10:12

Alex-Bogdanov


1 Answers

Linux does not provide the chflags syscall, so Python does not provide the wrapper os.chflags().

The chattr command uses the code (e2fsprogs-1.42.13's lib/e2p/fsetflags.c):

        fd = open (name, OPEN_FLAGS);
        if (fd == -1)
                return -1;
        f = (int) flags;
        r = ioctl (fd, EXT2_IOC_SETFLAGS, &f);
        if (r == -1)
                save_errno = errno;
        close (fd);

to set the extended attributes for a file, so if you port that to Python (and use some C to extract the value for EXT2_IOC_SETFLAGS from ext2fs/ext2_fs.h), you can do something like:

#!/usr/bin/python2

import fcntl
import os
import struct

# Taken from ext2fs/ext2_fs.h.
EXT2_IMMUTABLE_FL = 0x00000010
EXT2_IOC_SETFLAGS = 0x40086602

fd = os.open('/var/tmp/testfile', os.O_RDWR)
f = struct.pack('i', EXT2_IMMUTABLE_FL)
fcntl.ioctl(fd, EXT2_IOC_SETFLAGS, f);
os.close(fd)

Et voilà:

[tim@passepartout ~]$ lsattr /var/tmp/testfile
----i----------- /var/tmp/testfile
[tim@passepartout ~]$

But for all practical purposes it is probably much more prudent to execute chattr(1) as a child process than to turn the proof-of-concept above into something that runs reliably without maintenance.

like image 75
Tim Landscheidt Avatar answered Sep 30 '22 19:09

Tim Landscheidt