2016-10-29 3 views
0

文字列「rwxrwxrwx」があります。文字列をmode_tに変換します

chmodシステムコールで使用するには、どのようにタイプmode_tに変換できますか?権限は-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 ")'は、10文字の長さの場合は最初の '-'または' d'(ディレクトリフラグ用)をスキップし、 'S_IRUSR'、' S_IWUSR'、 'S_IXUSR'、 [man 2 open'](http://man7.org/linux/man-pages/man2/open.2.html)のマニュアルページに記載されているようにそれぞれそうです。設定可能なビットは3つあります: 'S_ISUID'は' ?? S ?????? '(set-user-id)、' S_ISGID'は '????? S''( set-group-id)と '?????????????????????????????????????????????????????????????????????????????? ??? –

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