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

ruby-changes:6581

From: nobu <ko1@a...>
Date: Thu, 17 Jul 2008 06:10:15 +0900 (JST)
Subject: [ruby-changes:6581] Ruby:r18096 (mvm): * dir.c (get_cwd_fd): support for platforms which has fchdir but no

nobu	2008-07-17 06:09:50 +0900 (Thu, 17 Jul 2008)

  New Revision: 18096

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

  Log:
    * dir.c (get_cwd_fd): support for platforms which has fchdir but no
      openat.

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

Index: mvm/ChangeLog
===================================================================
--- mvm/ChangeLog	(revision 18095)
+++ mvm/ChangeLog	(revision 18096)
@@ -1,3 +1,8 @@
+Thu Jul 17 06:09:48 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* dir.c (get_cwd_fd): support for platforms which has fchdir but no
+	  openat.
+
 Mon Jul 14 18:16:32 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* tool/merge_from_trunk.rb: try to resolve ChangeLog conflicts
Index: mvm/dir.c
===================================================================
--- mvm/dir.c	(revision 18095)
+++ mvm/dir.c	(revision 18096)
@@ -736,9 +736,27 @@
 #endif
 }
 
+#ifdef HAVE_FCHDIR
+# if defined HAVE_OPENAT
+#   define get_cwd_fd() openat(GET_THREAD()->cwd.fd, ".", O_RDONLY)
+# elif defined HAVE_DIRFD
+void
+get_cwd_fd(void)
+{
+    DIR *cwd = opendir(GET_THREAD()->cwd.path);
+    int fd = dup(dirfd(cwd));
+    closedir(cwd);
+    return fd;
+}
+#   define get_cwd_fd() get_cwd_fd()
+# elif defined O_DIRECTORY
+#   define get_cwd_fd() open(GET_THREAD()->cwd.path, O_RDONLY|O_DIRECTORY)
+# endif
+#endif
+
 struct chdir_data {
     VALUE new_path;
-#if USE_OPENAT
+#ifdef get_cwd_fd
     int old_dir;
 #endif
     VALUE old_path;
@@ -757,7 +775,7 @@
 chdir_restore(struct chdir_data *args)
 {
     if (args->done) {
-#if defined HAVE_DIRFD && defined HAVE_FCHDIR
+#ifdef get_cwd_fd
 	if (fchdir(args->old_dir) < 0) {
 	    close(args->old_dir);
 	    rb_sys_fail(RSTRING_PTR(args->old_path));
@@ -774,8 +792,8 @@
 dir_chdir_block(VALUE path)
 {
     struct chdir_data args;
-#if USE_OPENAT
-    args.old_dir = openat(GET_THREAD()->cwd.fd, ".", O_RDONLY);
+#ifdef get_cwd_fd
+    args.old_dir = get_cwd_fd();
 #endif
     args.old_path = rb_tainted_str_new2(GET_THREAD()->cwd.path);
     args.new_path = path;

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

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