2017-03-07 5 views
0

ファイル属性のスティッキービットとGUIDを含むファイルのアクセス権を取得しようとしています。それはすべてのファイルで機能していないようです。スティッキービットが動作しないファイルのアクセス許可

char *permstr = malloc(sizeof(char) * LEN); 

    snprintf(permstr, LEN, "%c%c%c%c%c%c%c%c%c%c", ftpe, (sb->st_mode & S_IRUSR) ? 'r' : '-', 
    (sb->st_mode & S_IWUSR) ? 'w' : '-', (sb->st_mode & S_ISUID) ? (sb->st_mode & S_IXUSR ? 's' : 'S') : 
                (sb->st_mode & S_IXUSR ? 'x' : '-'), 

    (sb->st_mode && S_IRGRP) ? 'r' : '-', (sb->st_mode & S_IWGRP) ? 'w' : '-', 
    (sb->st_mode & S_ISGID) ? (sb->st_mode & S_IXGRP ? 's' : 'S') : (sb->st_mode & S_IXGRP ? 'x' : '-'), 

    (sb->st_mode & S_IROTH) ? 'r' : '-', (sb->st_mode & S_IWOTH) ? 'w' : '-', 
    (sb->st_mode & S_ISVTX) ? (sb->st_mode & S_IXOTH ? 't' : 'T') : (sb->st_mode & S_IXOTH ? 'x' : '-')); 

私はいくつかの通常のファイルでそれを試してみましたが、それは動作しますが、それは間違った出力に

を与えますが、私はコマンドを探すノルマルGNUでそれをテストするとき、それがうまく機能ある特定のファイルがあります。あなたが&&の代わりに、この中&使用しているため testcase-screenshot

+0

が、なぜあなたは、文字列の長さのために二つの異なるシンボリック定数を使用していますか? 'LEN'と' STR_SIZE'は異なりますか?なぜ文字列ターミネータを明示的に追加する必要があるのですか? 'snprintf'はあなたにそれを行うべきです(スペースがあれば)。そして、シンボリック定数を使用する場合、なぜ動的に割り振るのか、なぜ単純配列を作成しないのでしょうか? –

+0

@Someprogrammerdudeありがとう、私はそれを知らなかった。 sizeof(LEN)、 '' snprintf'は私に '' sizeo'fを使ってエラーを出していたので、マクロを使うことにしました。 basiclly 'sizeof(LEN)' –

+0

あなたのコードがいくつかのファイルでは動作するが、他のファイルでは動作しない場合、これらの種類のファイルを区別する何かを言うのが適切であるように思えます。 –

答えて

1

は次のようになります。フォーマットの提案としてsb->st_mode && S_IRGRP

+3

'sb-> st_mode&S_ISGID'を起動する行の先頭にはカッコがありません。 ' –

1

を、ご検討ください。

snprintf(permstr, STR_SIZE, "%c%c%c%c%c%c%c%c%c%c", ftpe, 
      (sb->st_mode & S_IRUSR) ? 'r' : '-', 
      (sb->st_mode & S_IWUSR) ? 'w' : '-', 
      (sb->st_mode & S_ISUID) ? (sb->st_mode & S_IXUSR ? 's' : 'S') : 
             (sb->st_mode & S_IXUSR ? 'x' : '-'), 

      (sb->st_mode & S_IRGRP) ? 'r' : '-', // Fix 1 (&& --> &) 
      (sb->st_mode & S_IWGRP) ? 'w' : '-', // Fix 2 (prefix '(') 
      (sb->st_mode & S_ISGID) ? (sb->st_mode & S_IXGRP ? 's' : 'S') : 
             (sb->st_mode & S_IXGRP ? 'x' : '-'), 

      (sb->st_mode & S_IROTH) ? 'r' : '-', 
      (sb->st_mode & S_IWOTH) ? 'w' : '-', 
      (sb->st_mode & S_ISVTX) ? (sb->st_mode & S_IXOTH ? 't' : 'T') : 
             (sb->st_mode & S_IXOTH ? 'x' : '-') 
     ); 

少なくともそれが簡単に起こっているのか見てできることが。私は、インデントの最も良い点についていくつかの意見の相違があると確信しています( 'per-bit'の行は3スペース分左にインデントされていなければなりません - それでも問題ありません;ファイルタイプftpeは、また、構造間の対称性を明確にするという全体的な考え方は、読みやすさに役立ちます。

私は、両方の修正プログラムがこのフォーマットで見つけやすくなっていることに気づくでしょう。

「」の答えとしてこれを受け入れないでください。コメントでは説明できないレイアウトのアドバイスとして考えてください。それは答えと同じくらいフォーマットされたコメントです。

あなたの質問に関係のない
+0

ありがとう、それはきれいです。私はホットコーディング時に良いフォーマットを維持する方法を学ばなければならない –

関連する問題