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/