2016-10-29 2 views
0

У меня есть строка символов "rwxrwxrwx".Преобразование строки в mode_t

Как его преобразовать в тип mode_t для использования в системном вызове chmod? Разрешения должны быть -rwxrwxrwx.

+0

Если строка разрешения является постоянной '«rwxrwxrwx»', вы могли бы просто написать '0777' или обширную и громоздкую комбинацию бит из константы, определенные в ''. – chqrlie

ответ

1

Вы можете использовать этот код. Однако его можно сократить с помощью цикла 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; 
+0

Спасибо! Наконец, это работает! :) – Kingusss12

+1

Я бы хотел, чтобы этот ответ был еще лучше, если он проверил длину, используя, например, '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' (липкий). –

0

Вот решение с одним выражением:

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'))); 
+0

Благодарим за помощь! :) – Kingusss12

Смежные вопросы