トップ «前の日記(2014-05-31) 最新 次の日記(2014-06-02)» 編集

ヨタの日々

2001|08|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|12|
2024|01|02|03|04|

2014-06-01 :-)

_ 読書メーター

2014年5月の読書メーター 読んだ本の数:5冊 読んだページ数:1361ページ ナイス数:19ナイス 冴えない彼女の育てかた 6 (富士見ファンタジア文庫)冴えない彼女の育てかた 6 (富士見ファンタジア文庫)感想 英梨々巻。メインヒロイン以外は倫也にデレデレなんだが相変わらず肝心の倫也の本命が見えないというかメンバー全員に対して誠実なのでなおさら本命が分からない。英梨々に対しては能動的に見えるんだけど幼馴染だからというだけだろうか 読了日:5月28日 著者:丸戸史明
学戦都市アスタリスク 05. 覇凰決戦 (MF文庫J)学戦都市アスタリスク 05. 覇凰決戦 (MF文庫J)感想 ロボが自我を持ち、学習により成長し、主人公たちを追い詰める。いい。ロボがいい。 読了日:5月28日 著者:三屋咲ゆう
ザ・トヨタウェイ(下)ザ・トヨタウェイ(下) 読了日:5月24日 著者:ジェフリー・K・ライカー
ザ・トヨタウェイ(上)ザ・トヨタウェイ(上)感想 「トヨタウェイは、長期的な生産性を上げる狙いで、品質のつくり込みのために立ち止まったり、ゆっくり進んだりする哲学を会社のカルチャーに組み込むことである」(p.262) ところでトヨタ工場勤務していた知人が居るんだがry 読了日:5月17日 著者:ジェフリー・K・ライカー
クロス×レガリア女王の領域 (角川スニーカー文庫)クロス×レガリア女王の領域 (角川スニーカー文庫)感想 ナタも蓮花も「愛する」ということを自覚したのに、物語は残酷だ / おにと鬼仙の戦争が決定したが、馳郎なら両方ひっくるめて丸く収めてくれるに違いない。 読了日:5月11日 著者:三田誠
読書メーター

_ 午前

0930 起床

1020 おひる。スパゲティ

1040 ご注文はコーヒーですか?

1100 アニメ消化

IMG_5052

IMG_5053

_ 午後

1400 買い物

1500 散歩

紫陽花が咲いている。んだが梅雨はどこに

IMG_5055

IMG_5059

_

1700 アニメ消化

2100 飯。鮭のムニエル

_ 扇風機を起動させた

おい暑いぞ

IMG_5054

_ [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;
}

_ 買い物

amazon

ニセコイ 2 巻は未発送。

B00HX3CNHA

イラストレーター買い Pion

4041016983