[前][次][番号順一覧][スレッド一覧]

ruby-changes:6403

From: nobu <ko1@a...>
Date: Mon, 7 Jul 2008 02:05:12 +0900 (JST)
Subject: [ruby-changes:6403] Ruby:r17919 (mvm): * dir.c (dir_s_chdir): restore cwd by fchdir if possible.

nobu	2008-07-07 02:04:59 +0900 (Mon, 07 Jul 2008)

  New Revision: 17919

  Modified files:
    branches/mvm/ChangeLog
    branches/mvm/configure.in
    branches/mvm/dir.c

  Log:
    * dir.c (dir_s_chdir): restore cwd by fchdir if possible.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=17919

Index: mvm/configure.in
===================================================================
--- mvm/configure.in	(revision 17918)
+++ mvm/configure.in	(revision 17919)
@@ -727,7 +727,7 @@
                  strlcpy strlcat)
 AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall chroot fsync getcwd eaccess\
 	      truncate ftruncate chsize times utimes utimensat fcntl lockf lstat\
-	      link symlink readlink\
+	      link symlink readlink dirfd fchdir openat\
 	      setitimer setruid seteuid setreuid setresuid setproctitle socketpair\
 	      setrgid setegid setregid setresgid issetugid pause lchown lchmod\
 	      getpgrp setpgrp getpgid setpgid initgroups getgroups setgroups\
Index: mvm/ChangeLog
===================================================================
--- mvm/ChangeLog	(revision 17918)
+++ mvm/ChangeLog	(revision 17919)
@@ -1,3 +1,7 @@
+Mon Jul  7 02:04:57 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* dir.c (dir_s_chdir): restore cwd by fchdir if possible.
+
 Mon Jul  7 01:24:43 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* file.c (rb_file_s_extname): fix for file name with spaces.
Index: mvm/dir.c
===================================================================
--- mvm/dir.c	(revision 17918)
+++ mvm/dir.c	(revision 17919)
@@ -756,6 +756,9 @@
 
 struct chdir_data {
     VALUE old_path, new_path;
+#if defined HAVE_DIRFD && defined HAVE_FCHDIR
+    DIR *old_dir;
+#endif
     int done;
 };
 
@@ -777,11 +780,43 @@
 	chdir_blocking--;
 	if (chdir_blocking == 0)
 	    chdir_thread = Qnil;
+#if defined HAVE_DIRFD && defined HAVE_FCHDIR
+	if (fchdir(dirfd(args->old_dir)) < 0) {
+	    closedir(args->old_dir);
+	    rb_sys_fail(RSTRING_PTR(args->old_path));
+	}
+	closedir(args->old_dir);
+#else
 	dir_chdir(args->old_path);
+#endif
     }
     return Qnil;
 }
 
+static void
+dir_chdir_check(void)
+{
+    if (chdir_blocking > 0) {
+	if (!rb_block_given_p() || rb_thread_current() != chdir_thread)
+	    rb_warn("conflicting chdir during another chdir block");
+    }
+}
+
+static VALUE
+dir_chdir_block(VALUE path)
+{
+    struct chdir_data args;
+    char *cwd = my_getcwd();
+
+    args.old_path = rb_tainted_str_new2(cwd); xfree(cwd);
+    args.new_path = path;
+#if defined HAVE_DIRFD && defined HAVE_FCHDIR
+    args.old_dir = opendir(".");
+#endif
+    args.done = Qfalse;
+    return rb_ensure(chdir_yield, (VALUE)&args, chdir_restore, (VALUE)&args);
+}
+
 /*
  *  call-seq:
  *     Dir.chdir( [ string] ) => 0
@@ -839,20 +874,11 @@
 	path = rb_str_new2(dist);
     }
 
-    if (chdir_blocking > 0) {
-	if (!rb_block_given_p() || rb_thread_current() != chdir_thread)
-	    rb_warn("conflicting chdir during another chdir block");
+    dir_chdir_check();
+    if (rb_block_given_p()) {
+	return dir_chdir_block(path);
     }
 
-    if (rb_block_given_p()) {
-	struct chdir_data args;
-	char *cwd = my_getcwd();
-
-	args.old_path = rb_tainted_str_new2(cwd); xfree(cwd);
-	args.new_path = path;
-	args.done = Qfalse;
-	return rb_ensure(chdir_yield, (VALUE)&args, chdir_restore, (VALUE)&args);
-    }
     dir_chdir(path);
 
     return INT2FIX(0);

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]