[Gauche-devel-jp] テンポラリファイルのseek

Back to archive index

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




Gauche-devel-jp メーリングリストの案内
Back to archive index