diff options
author | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-01-19 09:12:06 +0000 |
---|---|---|
committer | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-01-19 09:12:06 +0000 |
commit | b6740d33a2d31cd54172a5e2a3c8bb00d707c44f (patch) | |
tree | 8d2183a3a4e346ff0e56cd443f6a21df32d4a838 | |
parent | 1fe11b20409e141597074dffadea87c569435b10 (diff) | |
download | ruby-b6740d33a2d31cd54172a5e2a3c8bb00d707c44f.tar.gz |
there is no guarantee that mode_t is as wide as int
POSIX only defines mode_t to be "an integer typea", and in fact
MacOS defines it to be uint16_t. We didn't have NUM2USHORT before
so it did not make sense but now that we have it. Why not check
apptopriately.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61950 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | configure.ac | 5 | ||||
-rw-r--r-- | file.c | 4 | ||||
-rw-r--r-- | include/ruby/ruby.h | 4 | ||||
-rw-r--r-- | process.c | 2 |
4 files changed, 11 insertions, 4 deletions
diff --git a/configure.ac b/configure.ac index 4565be98ca..eb8daf2131 100644 --- a/configure.ac +++ b/configure.ac @@ -1611,6 +1611,8 @@ AC_DEFUN([RUBY_REPLACE_TYPE], [dnl t=LL], [*" long "*], [ t=LONG], + [*" short "*], [ + t=SHORT], [ t=INT]) rb_cv_[$1]_convertible=${u}${t}]) @@ -1620,6 +1622,7 @@ AC_DEFUN([RUBY_REPLACE_TYPE], [dnl AS_CASE(["${rb_cv_[$1]_convertible}"], [*LL], [n="long long"], [*LONG], [n="long"], + [*SHORT], [n="short"], [n="int"]) AS_CASE(["${rb_cv_[$1]_convertible}"], [U*], [n="unsigned $n"]) @@ -1637,7 +1640,7 @@ RUBY_REPLACE_TYPE(uid_t, int, UIDT) RUBY_REPLACE_TYPE(gid_t, int, GIDT) RUBY_REPLACE_TYPE(time_t, [], TIMET, [@%:@include <time.h>]) RUBY_REPLACE_TYPE(dev_t, [int long "long long"], DEVT) -RUBY_REPLACE_TYPE(mode_t, ["unsigned int" long], MODET, [@%:@include <sys/stat.h>]) +RUBY_REPLACE_TYPE(mode_t, ["unsigned short" "unsigned int" long], MODET, [@%:@include <sys/stat.h>]) RUBY_REPLACE_TYPE(rlim_t, [int long "long long"], RLIM, [ @%:@ifdef HAVE_SYS_TYPES_H @%:@include <sys/types.h> @@ -2384,12 +2384,12 @@ static VALUE rb_file_chmod(VALUE obj, VALUE vmode) { rb_io_t *fptr; - int mode; + mode_t mode; #if !defined HAVE_FCHMOD || !HAVE_FCHMOD VALUE path; #endif - mode = NUM2INT(vmode); + mode = NUM2MODET(vmode); GetOpenFile(obj, fptr); #ifdef HAVE_FCHMOD diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h index f244d140fb..1a1c6bd4a8 100644 --- a/include/ruby/ruby.h +++ b/include/ruby/ruby.h @@ -113,6 +113,9 @@ typedef char ruby_check_sizeof_voidp[SIZEOF_VOIDP == sizeof(void*) ? 1 : -1]; #ifndef PRI_LONG_PREFIX #define PRI_LONG_PREFIX "l" #endif +#ifndef PRI_SHORT_PREFIX +#define PRI_SHORT_PREFIX "h" +#endif #if SIZEOF_LONG == 8 #define PRI_64_PREFIX PRI_LONG_PREFIX @@ -1571,6 +1574,7 @@ rb_num2char_inline(VALUE x) #define LONG2NUM(x) RB_LONG2NUM(x) #define ULONG2NUM(x) RB_ULONG2NUM(x) +#define USHORT2NUM(x) RB_INT2FIX(x) #define NUM2CHR(x) RB_NUM2CHR(x) #define CHR2FIX(x) RB_CHR2FIX(x) @@ -2348,7 +2348,7 @@ rb_execarg_parent_start1(VALUE execarg_obj) VALUE param = RARRAY_AREF(elt, 1); VALUE vpath = RARRAY_AREF(param, 0); int flags = NUM2INT(RARRAY_AREF(param, 1)); - int perm = NUM2INT(RARRAY_AREF(param, 2)); + mode_t perm = NUM2MODET(RARRAY_AREF(param, 2)); VALUE fd2v = RARRAY_AREF(param, 3); int fd2; if (NIL_P(fd2v)) { |