Объяснение битов st_flags - PullRequest
       104

Объяснение битов st_flags

1 голос
/ 09 ноября 2019

Я пишу скрипт на 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 (справа) я не понимаю. Любые указатели, как это читать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...