OSX: определить флаг «ограниченной» файловой системы программно - PullRequest
0 голосов
/ 11 декабря 2018

Начиная с El Capitan, система получила защиту целостности системы, которая не позволяет выполнять определенные действия для некоторых папок и файлов.С помощью команды терминала "ls lO" вы можете увидеть флаги, которые имеет конкретный файл или папка.

drwxr-xr-x@   3 root  wheel  hidden                96 Aug 12  2014 opt
drwxr-xr-x    6 root  wheel  sunlnk,hidden        192 Nov 28 15:14 private
drwxr-xr-x@  64 root  wheel  restricted,hidden   2048 Nov 29 13:48 sbin
lrwxr-xr-x@   1 root  wheel  restricted,hidden     11 Nov 28 15:13 tmp -> private/tmp
drwxr-xr-x@  10 root  wheel  restricted,hidden    320 Nov 28 15:21 usr
lrwxr-xr-x@   1 root  wheel  restricted,hidden     11 Nov 28 15:13 var -> private/var

Меня интересует флаг "с ограничениями".Как его можно найти с помощью Swift без выполнения команд терминала?

Хочу подчеркнуть, что выполнение Process () в коде не является подходом, отвечающим потребностям.

Может быть установлен флаг «Hidden»обнаружен через свойство isHidden отсюда URLResourceKey .Однако в «ограниченном» ничего нет.

Может ли кто-нибудь указать мне правильное направление?

1 Ответ

0 голосов
/ 11 декабря 2018

Вещи, перечисленные параметром -O в инструменте ls, являются флагами файлов.Они могут быть прочитаны функцией stat() на уровне BSD и находятся в поле st_flags результирующей структуры.

«Ограниченный» флаг в выводе ls соответствует SF_RESTRICTED, поэтому вы можете прочитать его, выполнив что-то вроде этого:

func isRestricted(at url: URL) throws -> Bool {
    let flags: UInt32 = try url.withUnsafeFileSystemRepresentation { fsRep in
        var info = stat()

        if stat(fsRep, &info) != 0 {
            guard let code = POSIXError.Code(rawValue: errno) else {
                throw CocoaError(.fileReadUnknown)
            }

            throw POSIXError(code)
        }

        return info.st_flags
    }

    return flags & UInt32(bitPattern: SF_RESTRICTED) != 0
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...