Я пишу скрипт на python для удаления файлов на MacOS и сталкиваюсь с файлами, защищенными SIP. Я знаю, что наличие st_flags более чем вероятно означает, что я не могу удалить файл. Как здесь:
>>> os.stat(f).st_flags
524288
Но мне любопытно узнать, что это на самом деле означает. Я посмотрел в stat.h и вижу:
/*
* Definitions of flags stored in file flags word.
*
* Super-user and owner changeable flags.
*/
#define UF_SETTABLE 0x0000ffff /* mask of owner changeable flags */
#define UF_NODUMP 0x00000001 /* do not dump file */
#define UF_IMMUTABLE 0x00000002 /* file may not be changed */
#define UF_APPEND 0x00000004 /* writes to file may only append */
#define UF_OPAQUE 0x00000008 /* directory is opaque wrt. union */
/*
* The following bit is reserved for FreeBSD. It is not implemented
* in Mac OS X.
*/
/* #define UF_NOUNLINK 0x00000010 */ /* file may not be removed or renamed */
#define UF_COMPRESSED 0x00000020 /* file is compressed (some file-systems) */
/* UF_TRACKED is used for dealing with document IDs. We no longer issue
* notifications for deletes or renames for files which have UF_TRACKED set. */
#define UF_TRACKED 0x00000040
#define UF_DATAVAULT 0x00000080 /* entitlement required for reading */
/* and writing */
/* Bits 0x0100 through 0x4000 are currently undefined. */
#define UF_HIDDEN 0x00008000 /* hint that this item should not be */
/* displayed in a GUI */
/*
* Super-user changeable flags.
*/
#define SF_SUPPORTED 0x001f0000 /* mask of superuser supported flags */
#define SF_SETTABLE 0xffff0000 /* mask of superuser changeable flags */
#define SF_ARCHIVED 0x00010000 /* file is archived */
#define SF_IMMUTABLE 0x00020000 /* file may not be changed */
#define SF_APPEND 0x00040000 /* writes to file may only append */
#define SF_RESTRICTED 0x00080000 /* entitlement required for writing */
#define SF_NOUNLINK 0x00100000 /* Item may not be removed, renamed or mounted on */
Я просто не совсем понимаю, как он складывается до 524288. Я имею в виду, я вроде получаю его, как биты разрешения, 1 или более в 6-й позиции отправо должно означать, что SF_NOUNLINK установлен, но откуда 5? 2 в 5-й позиции справа означает, что SF_IMMUTABLE установлен, а 2-я позиция - 8, что является UF_DATAVAULT, что имеет смысл. Другие значения в позициях 3-4 и значение 5 (справа) я не понимаю. Любые указатели, как это читать?