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

KAWASUMI Junji touchan @ papa-net.bpl.jp
2008年 8月 19日 (火) 23:04:53 JST


川澄です

本件についてまとめちゃって宜しいでしょうか。

まず configuerに対しては、
==============================================================
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>],

==============================================================
で、st_birthtimeの有無をチェックし、

lib/time.c では、configureで判定した結果が欲しいので、
config.h のincludeを追加および HAVE_STRUCT_STAT_TM_BIRTHTIME
のみを使用し生成時刻を返却するようにする。
==============================================================
diff -u lib/time.c.orig lib/time.c
--- lib/time.c.orig     2007-11-15 12:15:03.000000000 +0900
+++ lib/time.c          2008-08-18 12:42:04.000000000 +0900
@@ -22,6 +22,7 @@
 */

 #include "includes.h"
+#include "config.h"

 /**
  * @file
@@ -835,6 +836,12 @@
                return (time_t)315493200L;          /* 1/1/1980 */
        }

+#if defined(HAVE_STRUCT_STAT_TM_BIRTHTIME)
+       ret = st->st_birthtime;
+       if ((ret != (time_t)0) && (ret != ~(time_t)0)) {
+               return ret;
+       }
+#endif
        ret = MIN(st->st_ctime, st->st_mtime);
        ret1 = MIN(ret, st->st_atime);

==============================================================

という形という事で FIXで良いでしょうか。
NetBSDとFreeBSDでしかためしていませんが。。。。

Linuxとか他のプラットフォ−ムではどうなってんでしょうかね。
とりあえず身の周りでSAMBAを動作させているプラットフォ−ムでは
事は足りるので個人的にはこれでOKなんですけどね。

皆さん他に意見はありませんか?

On Fri, 15 Aug 2008 23:37:10 +0900
KAWASUMI Junji <touchan @ papa-net.bpl.jp> wrote:

> 川澄です
> 
> しらいさん,さとうさん、本件に付きご意見の程ありがとうござい
> ます。
> 
> > > もし知っている人がいたら教えて欲しいのですが、
> > > time_t って絶対に符号付き整数 (singed) なんですかね?
> > > unsigned な実装は見たことないような気がする…。
> > 
> >  一般には signed です。これは単に伝統的にそうなっているだけ
> > なんですが、mktime(3) 等の invalid 値判断条件を「-1 なら」で
> > はなくて「負数なら」とする実装を救済する意味もあります。
> >  しかし、仕様上は -1 以外は valid 値なので、2038 年問題を少
> > しでも先延ばしにすべく time_t を unsigned にしてある環境も幾
> > らかは存在します。
> 必ずしも signed とは限らない。
> でも -1 がinvalid値となりえる事もあるということですね。
> しかし UFSv1では、現状 0値が返却されます(してますの方が適切か)
> ので やはり 0値も invalid値として取り扱うのが安心かと思います。
> 
> > > >  nsec 値そのものは不要であるという点に関しては誰も異論ない
> > > > と思いますよ。
> > > 
> > > Windows (SMB?) のファイルの時刻精度は 100ns みたいですから、
> > > 不要ってことはないですね。
> > 
> >  んー、でも件の patch を当てた箇所の関数は time_t を返すの
> > で、nsec 値を使おうとしたらもっと抜本的な改造が必要になりま
> > すよ。
> 
> でもって、時刻を返却するソースを追っかけたら、CREATE TIMEを取り
> 扱っている箇所は、該当箇所しかなく且つ該当関数の直下の関数から
> の呼び出ししかありませんでした。
>    get_create_timespec()
>      +→  get_create_time() パッチ該当関数
> 
> 例外的に日付を取得する際に該当関数を呼び出している箇所が一箇所
> ありましたが、あくまで日付を取得しているのみなので、nsecは無視
> して良いんじゃないかと思います。
> 
> そこで、該当関数の上位関数 get_create_timespec()を見ると、
> get_create_time()を呼び出した直後で、関数内部の timespec構造体
> の tv_nsecに対して 0を代入しています。
> と言うことは SAMBAでは、はなっから nsec値を相手にしていない様
> です。
> 
> ですので nsecについては一切触れず、
> 
> +	ret = st->st_birthtime;
> +	if ((ret != (time_t)0) && (ret != (time_t)(-1))) {
> +		return ret;
> +	}
> 
> というコードでは、いけませんか?
> 
> 以上です
> 
> -- 
> --  川澄 淳治
> --  KAWASUMI Junji <touchan@papa-net.bpl.jp>
> --  愛知県知多郡在住 (JR武豊線使用)
> --   〜 みんなで幸せになろうよ。。。〜
> --
> 

-- 
--  川澄 淳治
--  KAWASUMI Junji <touchan@papa-net.bpl.jp>
--  愛知県知多郡在住 (JR武豊線使用)
--   〜 みんなで幸せになろうよ。。。〜
--



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