Project

General

Profile

Feature #15797 » use-native-realpath-v3.patch

jeremyevans0 (Jeremy Evans), 04/28/2019 04:04 AM

View differences:

file.c
#define rename(f, t) rb_w32_urename((f), (t))
#undef symlink
#define symlink(s, l) rb_w32_usymlink((s), (l))
#ifdef HAVE_REALPATH
/* Don't use native realpath(3) on Windows, as it the check for
absolute paths does not work for drive letters. */
#undef HAVE_REALPATH
#endif
#else
#define STAT(p, s) stat((p), (s))
#endif
......
RB_REALPATH_MODE_MAX
};
#ifndef HAVE_REALPATH
static int
realpath_rec(long *prefixlenp, VALUE *resolvedp, const char *unresolved, VALUE fallback,
VALUE loopcheck, enum rb_realpath_mode mode, int last)
......
}
return 0;
}
#endif
static VALUE rb_file_join(VALUE ary);
static VALUE
rb_check_realpath_internal(VALUE basedir, VALUE path, enum rb_realpath_mode mode)
{
#ifdef HAVE_REALPATH
rb_encoding *origenc;
char *resolved_ptr = NULL;
VALUE unresolved_path;
VALUE resolved;
unresolved_path = rb_str_dup_frozen(path);
origenc = rb_enc_get(unresolved_path);
if (*RSTRING_PTR(unresolved_path) != '/' && !NIL_P(basedir)) {
unresolved_path = rb_file_join(rb_ary_new_from_args(2, basedir, unresolved_path));
}
unresolved_path = TO_OSPATH(unresolved_path);
if((resolved_ptr = realpath(RSTRING_PTR(unresolved_path), NULL)) == NULL) {
if (mode == RB_REALPATH_CHECK) {
return Qnil;
}
rb_sys_fail_path(unresolved_path);
}
resolved = rb_enc_str_new_cstr(resolved_ptr, origenc);
free(resolved_ptr);
if (mode == RB_REALPATH_STRICT || mode == RB_REALPATH_CHECK) {
struct stat st;
if (rb_stat(resolved, &st) < 0) {
if (mode == RB_REALPATH_STRICT) {
rb_sys_fail_path(unresolved_path);
}
return Qnil;
}
}
if(rb_enc_str_coderange(resolved) == ENC_CODERANGE_BROKEN) {
rb_enc_associate(resolved, rb_ascii8bit_encoding());
}
#else
long prefixlen;
VALUE resolved;
VALUE unresolved_path;
......
if (realpath_rec(&prefixlen, &resolved, path_names, Qnil, loopcheck, mode, 1))
return Qnil;
RB_GC_GUARD(curdir);
if (origenc != rb_enc_get(resolved)) {
if (rb_enc_str_asciionly_p(resolved)) {
rb_enc_associate(resolved, origenc);
......
resolved = rb_str_conv_enc(resolved, NULL, origenc);
}
}
#endif
rb_obj_taint(resolved);
RB_GC_GUARD(unresolved_path);
RB_GC_GUARD(curdir);
return resolved;
}
......
return rb_assoc_new(rb_file_dirname(path), rb_file_s_basename(1,&path));
}
static VALUE rb_file_join(VALUE ary);
static VALUE
file_inspect_join(VALUE ary, VALUE arg, int recur)
{
(3-3/4)