[samba-jp:20330] Re: ファイル生成時刻の扱いについて

SATOH Fumiyasu fumiyas @ osstech.jp
2008年 8月 13日 (水) 01:02:44 JST


さとうふみやす @ OSS テクノロジです。
脳みそ疲れた状態でパッチ作ると全然ダメだな…。

At Tue, 12 Aug 2008 17:37:54 +0900,
Takashi SHIRAI wrote:
> > ちょっと調べた限りでは、ファイルシステムが birthtime に
> > 未対応の場合に st_birthtime の値がどうなるかが BSD に依って
> > 異なるようですね。:-(
> 
>  でも、「未対応」を示す数値は birthtime 実装環境では現れ得
> ない数値でないと、区別がつかなくなるんじゃないかと思うんです
> がどうでしょう?

うう…そのつもりで書いたのですが、間違ってました。

というわけで、頭のなかにあったのは:

  * birthtime と birthtimensec が両方とも 0 
  * birthtime が (time_t)-1
  * birthtimensec が -1L

のいずれかなら無効な birthtime と判定 (いずれも該当しなければ有効)、
だったんですが、どうですかねぇ。本当は実装に合わせて
configure 等で切り替えるのがベストなんだろうけど。

diff --git a/source/configure.in b/source/configure.in
index 7f8a97f..ea01ae4 100644
--- a/source/configure.in
+++ b/source/configure.in
@@ -5913,6 +5913,9 @@ AC_CHECK_MEMBERS([struct secmethod_table.method_attrlist], , ,
 AC_CHECK_MEMBERS([struct secmethod_table.method_version], , ,
        [#include <usersec.h>])
 
+AC_CHECK_MEMBERS([struct stat.st_birthtime],,,[#include <sys/stat.h>])
+AC_CHECK_MEMBERS([struct stat.st_birthtimensec],,,[#include <sys/stat.h>])
+
 AC_CACHE_CHECK([for SO_PEERCRED],samba_cv_HAVE_PEERCRED,[
 AC_TRY_COMPILE([#include <sys/types.h>
 #include <sys/socket.h>],
diff --git a/source/lib/time.c b/source/lib/time.c
index 8e28fcc..92e9633 100644
--- a/source/lib/time.c
+++ b/source/lib/time.c
@@ -834,7 +834,14 @@ time_t get_create_time(const SMB_STRUCT_STAT *st,BOOL fake_dirs)
 	if(S_ISDIR(st->st_mode) && fake_dirs) {
 		return (time_t)315493200L;          /* 1/1/1980 */
 	}
-    
+
+#if defined(HAVE_STRUCT_STAT_TM_BIRTHTIME) && defined(HAVE_STRUCT_STAT_TM_BIRTHTIMENSEC)
+	if (!(st->st_birthtime == (time_t)-1 || st->st_birthtimensec == -1L) &&
+	    !(st->st_birthtime == (time_t)0 && st->st_birthtimensec == 0L)) {
+		return st->st_birthtime;
+	}
+#endif
+
 	ret = MIN(st->st_ctime, st->st_mtime);
 	ret1 = MIN(ret, st->st_atime);
 
At Tue, 12 Aug 2008 23:54:06 +0900,
Takashi SHIRAI wrote:
> > >  でも、「未対応」を示す数値は birthtime 実装環境では現れ得
> > > ない数値でないと、区別がつかなくなるんじゃないかと思うんです
> > > がどうでしょう?
> > そうですね、単純に 0より大きかったら採用という風に思っていまし
> > たが、浅かったです。
> 
>  UTC を返してる st_birthtime の方はそれでも構わないと思いま
> す。完璧じゃないにしろ、実用上特に問題ないでしょう。epoch に
> 遡って file を作成するニーズなんてまずありませんし。

もし知っている人がいたら教えて欲しいのですが、
time_t って絶対に符号付き整数 (singed) なんですかね?
unsigned な実装は見たことないような気がする…。

>  さとうさんの patch その 2 の方を見ると、nsec 値が 0 になっ
> てしまうと st_birthtime の方が有効な値であっても「非対応」と
> 見なしてその値は使わないんですよね。

これを読んで、ようやく間違いに気付いた次第。
ありがとうございました。(まだ間違っていたらごめんなさい)

> > 個人的には、st_birthtimensecまで必要と思いませんが如何でしょう
> > か。
> 
>  さとうさんが言ってるのは、nsec 値を有効数値として使うとい
> う意味ではなくて、nsec 値が無効な値を示していた際には、仮に
> st_birthtime が有効範囲にあっても無視するという意味です。

yes.

>  nsec 値そのものは不要であるという点に関しては誰も異論ない
> と思いますよ。

Windows (SMB?) のファイルの時刻精度は 100ns みたいですから、
不要ってことはないですね。

-- 
-- Name: SATOH Fumiyasu (fumiyas @ osstech co jp)
-- Business Home: http://www.OSSTech.co.jp/
-- Personal Home: http://www.SFO.jp/blog/



samba-jp メーリングリストの案内