本当に有難うございます.> 武藤さん,鵜飼さん >> 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