フィヨルドブートキャンプのカリキュラムでlsをrubyで実装するというのがあるんですが、パーミッションの八進表記を記号表記(symbolic notation)に変換する部分をどう実装するのがベターなのかなというのを悩んでおります。
rubyのFile::Statで取れるのは八進表記。
$ ruby -e 'printf "%o\n", open("./foo").stat.mode'
100644
これを記号表記 -rw-r--r--
に変換したい。
このr
とかw
とかがどこで定義されているのかがわからなかった。
何か共通の定義があってrubyでも簡単に読み込めるならそれを使うべきだし、本物のls
でもプログラム中で個別に定義してるならruby内で自分も定義して使っちゃっていいのかなと考え、macのソースコードを調べてました。
twitterで@massoさんなどに助言をいただき調べたところ、Libcのstrmode
の中に書いてありました。(lsもstrmodeを使って表示している)
/* usr */
if (mode & S_IRUSR)
*p++ = 'r';
else
*p++ = '-';
if (mode & S_IWUSR)
*p++ = 'w';
else
*p++ = '-';
switch (mode & (S_IXUSR | S_ISUID)) {
case 0:
*p++ = '-';
break;
case S_IXUSR:
*p++ = 'x';
break;
case S_ISUID:
*p++ = 'S';
break;
case S_IXUSR | S_ISUID:
*p++ = 's';
break;
}
chmod
などはこれを使ってなくて直接chmod.cに書いてあったりしました。
今のところrubyから簡単にstrmodeを使う方法もなさそうなのでrubyコードの中に自分で定義しちゃうのでいいのかなというのが現状です。
もし「こういう方法が一般的 or スマート」というのをご存知の方がいらっしゃったらtwitterの@komagataまで教えていただければありがたいです〜。