2014-06-01 :-)
_ 読書メーター
2014年5月の読書メーター
読んだ本の数:5冊
読んだページ数:1361ページ
ナイス数:19ナイス
冴えない彼女の育てかた 6 (富士見ファンタジア文庫)の感想
英梨々巻。メインヒロイン以外は倫也にデレデレなんだが相変わらず肝心の倫也の本命が見えないというかメンバー全員に対して誠実なのでなおさら本命が分からない。英梨々に対しては能動的に見えるんだけど幼馴染だからというだけだろうか
読了日:5月28日 著者:丸戸史明
学戦都市アスタリスク 05. 覇凰決戦 (MF文庫J)の感想
ロボが自我を持ち、学習により成長し、主人公たちを追い詰める。いい。ロボがいい。
読了日:5月28日 著者:三屋咲ゆう
ザ・トヨタウェイ(下)
読了日:5月24日 著者:ジェフリー・K・ライカー
ザ・トヨタウェイ(上)の感想
「トヨタウェイは、長期的な生産性を上げる狙いで、品質のつくり込みのために立ち止まったり、ゆっくり進んだりする哲学を会社のカルチャーに組み込むことである」(p.262) ところでトヨタ工場勤務していた知人が居るんだがry
読了日:5月17日 著者:ジェフリー・K・ライカー
クロス×レガリア女王の領域 (角川スニーカー文庫)の感想
ナタも蓮花も「愛する」ということを自覚したのに、物語は残酷だ / おにと鬼仙の戦争が決定したが、馳郎なら両方ひっくるめて丸く収めてくれるに違いない。
読了日:5月11日 著者:三田誠
読書メーター
_ [NetBSD][/bin/mkdir][mkdir][コードリーディング]NetBSD /bin/mkdir を読む
ソース src/bin/mkdir/mkdir.c
マニュアル mkdir - NetBSD Manual Pages
流れ
main mkpath または mkdir
main() を読む。
最初に作成するディレクトリのモードについて。~umask(0) して全部ビット立てる。umask(0) で 許可しない ビットを取得し、それを ~ で反転。mode で | で繋げるために ~ している。
/* * The default file mode is a=rwx (0777) with selected permissions * removed in accordance with the file mode creation mask. For * intermediate path name components, the mode is the default modified * by u+wx so that the subdirectories can always be created. */ mode = (S_IRWXU | S_IRWXG | S_IRWXO) & ~umask(0); dir_mode = mode | S_IWUSR | S_IXUSR;
S_IRWXU などは sys/stat.h に定義されている。
src/sys/sys/stat.h
#define S_IRWXU 0000700 /* RWX mask for owner */ #define S_IRUSR 0000400 /* R for owner */ #define S_IWUSR 0000200 /* W for owner */ #define S_IXUSR 0000100 /* X for owner */ #if defined(_NETBSD_SOURCE) #define S_IREAD S_IRUSR #define S_IWRITE S_IWUSR #define S_IEXEC S_IXUSR #endif #define S_IRWXG 0000070 /* RWX mask for group */ #define S_IRGRP 0000040 /* R for group */ #define S_IWGRP 0000020 /* W for group */ #define S_IXGRP 0000010 /* X for group */ #define S_IRWXO 0000007 /* RWX mask for other */ #define S_IROTH 0000004 /* R for other */ #define S_IWOTH 0000002 /* W for other */ #define S_IXOTH 0000001 /* X for other */
肝心のディレクトリ作成の処理はここ。引数に指定されたディレクトリをすべて処理する。
for の引数をどう使おうが勝手だけどループに影響しない変数を初期化するのやめようよ。まあ好みの問題ですが。
for (exitval = EXIT_SUCCESS; *argv != NULL; ++argv) { #ifdef notdef char *slash; /* Kernel takes care of this */ /* Remove trailing slashes, per POSIX. */ slash = strrchr(*argv, '\0'); while (--slash > *argv && *slash == '/') *slash = '\0'; #endif if (pflag) { // mkdir -p foo/bar/baz などと呼ばれたとき // ディレクトリを潜って作成する。 if (mkpath(*argv, mode, dir_mode) < 0) exitval = EXIT_FAILURE; } else { // mkdir foo などと呼ばれたとき // mkdir(2) を呼ぶだけ if (mkdir(*argv, mode) < 0) { warn("%s", *argv); exitval = EXIT_FAILURE; } else { // 自分がオーナーではないディレクトリを作成しようとしたんだろうから // ちょっと chmod しておくは /* * The mkdir() and umask() calls both honor * only the file permission bits, so if you try * to set a mode including the sticky, setuid, * setgid bits you lose them. So chmod(). */ if ((mode & ~(S_IRWXU|S_IRWXG|S_IRWXO)) != 0 && chmod(*argv, mode) == -1) { warn("%s", *argv); exitval = EXIT_FAILURE; } } } } exit(exitval); /* NOTREACHED */ }
パスを辿ってディレクトリを作成する関数がこちら。やってることはパス区切りを辿りひたすら mkdir を繰り返す。のはずなんだが
/* * mkpath -- create directories. * path - path * mode - file mode of terminal directory * dir_mode - file mode of intermediate directories */ static int mkpath(char *path, mode_t mode, mode_t dir_mode) { struct stat sb; char *slash; int done, rv; done = 0; slash = path; for (;;) { // ここの処理でパスをたどるはず slash += strspn(slash, "/"); slash += strcspn(slash, "/"); done = (*slash == '\0'); *slash = '\0'; rv = mkdir(path, done ? mode : dir_mode); if (rv < 0) { /* * Can't create; path exists or no perms. * stat() path to determine what's there now. */ int sverrno; sverrno = errno; if (stat(path, &sb) < 0) { /* Not there; use mkdir()s error */ errno = sverrno; warn("%s", path); return -1; } if (!S_ISDIR(sb.st_mode)) { /* Is there, but isn't a directory */ errno = ENOTDIR; warn("%s", path); return -1; } } else if (done) { /* * Created ok, and this is the last element */ /* * The mkdir() and umask() calls both honor only the * file permission bits, so if you try to set a mode * including the sticky, setuid, setgid bits you lose * them. So chmod(). */ if ((mode & ~(S_IRWXU|S_IRWXG|S_IRWXO)) != 0 && chmod(path, mode) == -1) { warn("%s", path); return -1; } } if (done) { break; } // でもここで slash に '/' を入れると // 次のループのとき '/' から "/" を探す↑ という処理になるので // パスを辿れないんではないのかしら *slash = '/'; } return 0; }