[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-devel:16154] Re: xdvik-ja: Cannot open gziped DVI files



本当に有難うございます.> 武藤さん,鵜飼さん

>> On Thu, 23 Sep 2004 05:07:09 +0900
>> ukai@debian.or.jp (Fumitoshi UKAI) said as follows:

>> 1. xdvi.cのmainでfile_name2 = is_good_dvi_file(file_name, False)) を呼
>>    び出し。これが成功したときのみ、run_dvi_file(file_name2, &info);に
>>    よって表示が行われる。
>> 2. xdvi.cのis_good_dvi_file(const char *filename, Boolean
>>    from_history)。
>>    real_filename = find_dvi_file(filename, &tried_dvi_extension,
>>    from_history)の時点ではreal_filenameの/dev/fd/*は保持されている。
>> 3. この中のret = REALPATH(real_filename, canonical_path); で検査してい
>>    る。REALPATHはrealpathとdefineされているのでこれが使われる(非推奨の
>>    関数のはずだけど…。my_realpathというのもあるけどやっぱりうまく動かな
>>    いですね)。
>> 4. しかし、/dev/fd/*をrealpathに通すと、realpathはENOENTを返し、
>>     retは(null)、canonical_pathは/tmp/gxLyQcgfEZ (deleted)のような一時
>>    ファイルとなる(すぐに存在しなくなっちゃうけど)。

>File::Tempのtempfileでつくっているのですでにディレクトリエントリーか
>らは消されているので(deleted)がついています。そのファイルディスクリプ
>タをcloseするまでは(にぎっているプロセスが終了するまでは)ファイルの実
>体は残っています。

>まぁここでREALPATHをするのが間違い(/dev/fd/*のように symlinkをたどっ
>てみつからなくてもファイルは存在しないわけではない)のような気がするの
>

>1) REALPATHが NULLをかえしてきたら(&& errno == ENOENTなら) 
> real_filename のほうを使う。
>2) REALPATHのかわりに canonicalize_path()を使う? 
> (他の個所ではそうしているように見える)

>のどちらかじゃないでしょうか。canonicalize_path()ではsymlinkをたどっ
>て同じかどうかという判断ができなくなるので 1)のほうがよいかも。

という鵜飼さんの指摘にしたがって,添付したようなパッチを作って適用して
みたところ,無事に圧縮された dvi ファイルも見れるようになりました.

-- 
土屋 雅稔 ( TSUCHIYA Masatoshi )
#DPATCHLEVEL=1
--- xdvik-22.84.3.orig/texk/xdvik/xdvi.c	2004-08-25 11:29:18.000000000 +0900
+++ xdvik-22.84.3/texk/xdvik/xdvi.c	2004-09-29 14:39:13.000000000 +0900
@@ -3911,7 +3911,10 @@
 	return NULL;
     
     ret = REALPATH(real_filename, canonical_path);
-    free(real_filename);
+    if (ret == NULL && errno == ENOENT)
+	ret = real_filename;
+    else
+	free(real_filename);
 
     /* check for correct DVI files */
     if ((f = XFOPEN(ret, OPEN_MODE)) != NULL) {

Attachment: pgpMGDJmaSu0g.pgp
Description: PGP signature