diff --git a/ChangeLog b/ChangeLog index 2d3aa40e4a..9c856a33ac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Tue Jun 26 16:33:45 2007 Nobuyoshi Nakada + + * process.c (proc_exec_v, rb_proc_exec): preserve errno. + Sat Jun 23 00:37:46 2007 Yukihiro Matsumoto * hash.c (rb_hash_select): remove unnecessary varargs for diff --git a/process.c b/process.c index 5a351facfa..ee30fa7b84 100644 --- a/process.c +++ b/process.c @@ -110,6 +110,9 @@ static VALUE S_Tms; #endif #endif +#define preserving_errno(stmts) \ + do {int saved_errno = errno; stmts; errno = saved_errno;} while (0) + /* * call-seq: @@ -982,7 +985,7 @@ proc_exec_v(argv, prog) #endif /* MSDOS or __human68k__ or __EMX__ */ before_exec(); execv(prog, argv); - after_exec(); + preserving_errno(after_exec()); return -1; } @@ -1051,7 +1054,7 @@ rb_proc_exec(str) #else before_exec(); execl("/bin/sh", "sh", "-c", str, (char *)NULL); - after_exec(); + preserving_errno(after_exec()); #endif #endif return -1;