У меня есть строка символов "rwxrwxrwx".Преобразование строки в mode_t
Как его преобразовать в тип mode_t для использования в системном вызове chmod? Разрешения должны быть -rwxrwxrwx.
У меня есть строка символов "rwxrwxrwx".Преобразование строки в mode_t
Как его преобразовать в тип mode_t для использования в системном вызове chmod? Разрешения должны быть -rwxrwxrwx.
Вы можете использовать этот код. Однако его можно сократить с помощью цикла for и некоторых модулей.
const char *perm = "rwxrwxrwx";
mode_t mode = 0;
if (perm[0] == 'r')
mode |= 0400;
if (perm[1] == 'w')
mode |= 0200;
if (perm[2] == 'x')
mode |= 0100;
if (perm[3] == 'r')
mode |= 0040;
if (perm[4] == 'w')
mode |= 0020;
if (perm[5] == 'x')
mode |= 0010;
if (perm[6] == 'r')
mode |= 0004;
if (perm[7] == 'w')
mode |= 0002;
if (perm[8] == 'x')
mode |= 0001;
Спасибо! Наконец, это работает! :) – Kingusss12
Я бы хотел, чтобы этот ответ был еще лучше, если он проверил длину, используя, например, 'strspn (perm," -rwxST ")', пропустил начальный '-' или' d' (для флага каталога), если десять символов, и использовал символические константы 'S_IRUSR',' S_IWUSR', 'S_IXUSR' и и так далее, как описано в man-странице [man 2 open'] (http://man7.org/linux/man-pages/man2/open.2.html). Также могут быть установлены три других бита: 'S_ISUID' для' ?? S ?????? '(set-user-id),' S_ISGID' для '????? S ???' (set-group-id) и 'S_ISVTX' для' ???????? T' (липкий). –
Вот решение с одним выражением:
const char *perm = "rwxrwxrwx";
mode_t mode = (((perm[0] == 'r') * 4 | (perm[1] == 'w') * 2 | (perm[2] == 'x')) << 6) |
(((perm[3] == 'r') * 4 | (perm[4] == 'w') * 2 | (perm[5] == 'x')) << 3) |
(((perm[6] == 'r') * 4 | (perm[7] == 'w') * 2 | (perm[8] == 'x')));
Благодарим за помощь! :) – Kingusss12
Если строка разрешения является постоянной '«rwxrwxrwx»', вы могли бы просто написать '0777' или обширную и громоздкую комбинацию бит из константы, определенные в ''. –
chqrlie