Masatake YAMATO
yamat****@redha*****
2010年 5月 13日 (木) 21:15:17 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 > > _______________________________________________ > Gauche-devel-jp mailing list > Gauch****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/gauche-devel-jp