Shiro Kawai
shiro****@lava*****
2010年 5月 13日 (木) 20:25:10 JST
あっそうか。unseekableなfdからポートを作る時も使われているわけですね。 それでseekerをNULLにしてたんだ。きっと。 それなら、Scm_MakePortWithFd()で試しにlseekを読んでみて判断してみる というのはどうでしょう。 =================================================================== --- port.c (revision 7143) +++ port.c (working copy) @@ -991,8 +991,14 @@ bufrec.closer = file_closer; bufrec.ready = file_ready; bufrec.filenum = file_filenum; - bufrec.seeker = NULL; bufrec.data = (void*)(intptr_t)fd; + + /* Check if the given fd is seekable, and set seeker if so. */ + if (lseek(fd, 0, SEEK_CUR) < 0) { + bufrec.seeker = NULL; + } else { + bufrec.seeker = file_seeker; + } p = Scm_MakeBufferedPort(SCM_CLASS_PORT, name, direction, ownerp, &bufrec); return p; =================================================================== From: Masatake YAMATO <yamat****@redha*****> Subject: Re: [Gauche-devel-jp] テンポラリファイルのseek Date: Thu, 13 May 2010 19:45:46 +0900 (JST) >> そもそもScm_MakePortWithFdでseekerをNULLにした理由が思い出せません。 >> file_seekerをセットしてしまえばいいような気がするのですが、 >> 念のため、もし誰か、Scm_MakePortWithFdでオープンしたポートを >> seekしたらまずいケースを思いついたら教えてください。 >> (fdが共有されてると面倒なことになりますが、それは読み書きでも同じ >> ことなので、seekだけがまずい理由ですね)。 > > ;; Open port from fd > (define-cproc open-input-fd-port (fd::<fixnum> > :key (buffering #f) > (owner?::<boolean> #f) > (name #f)) > (let* ([bufmode::int (Scm_BufferingMode buffering SCM_PORT_INPUT > SCM_PORT_BUFFER_FULL)]) > (when (< fd 0) (Scm_Error "bad file descriptor: %d" fd)) > (result (Scm_MakePortWithFd name SCM_PORT_INPUT fd bufmode ownerP)))) > > 良く確認していないのですが、pipeやらsocketを作ってそこからfdを取り出して、 > open-input-fd-portに渡したりすると不味くないでしょうか? > > 大和 > > _______________________________________________ > Gauche-devel-jp mailing list > Gauch****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/gauche-devel-jp