diff --git a/ChangeLog b/ChangeLog index 5738a27890..96cda8313b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,6 @@ -Fri Feb 24 16:39:57 2012 Nobuyoshi Nakada +Fri Feb 24 16:48:29 2012 Nobuyoshi Nakada + + * dir.c, file.c, io.c (rb_sys_fail_path): use rb_sys_fail_str. * error.c: new functions to deal exceptions with string instances. diff --git a/dir.c b/dir.c index fdf1672b12..40d304cdf4 100644 --- a/dir.c +++ b/dir.c @@ -75,7 +75,7 @@ char *strchr(char*,char); #define opendir(p) rb_w32_uopendir(p) #endif -#define rb_sys_fail_path(path) rb_sys_fail(RSTRING_PTR(path)) +#define rb_sys_fail_path(path) rb_sys_fail_str(path) #define FNM_NOESCAPE 0x01 #define FNM_PATHNAME 0x02 diff --git a/file.c b/file.c index 64efe07294..c3971e11ab 100644 --- a/file.c +++ b/file.c @@ -94,7 +94,7 @@ int flock(int, int); #define STAT(p, s) stat((p), (s)) #endif -#define rb_sys_fail_path(path) rb_sys_fail(NIL_P(path) ? 0 : RSTRING_PTR(path)) +#define rb_sys_fail_path(path) rb_sys_fail_str(path) #if defined(__BEOS__) || defined(__HAIKU__) /* should not change ID if -1 */ static int @@ -211,16 +211,18 @@ rb_str_encode_ospath(VALUE path) } static long -apply2files(void (*func)(const char *, void *), VALUE vargs, void *arg) +apply2files(void (*func)(const char *, VALUE, void *), VALUE vargs, void *arg) { long i; volatile VALUE path; rb_secure(4); for (i=0; iowner, args->group) < 0) - rb_sys_fail(path); + rb_sys_fail_path(pathv); } /* @@ -2160,11 +2162,11 @@ rb_file_chown(VALUE obj, VALUE owner, VALUE group) #if defined(HAVE_LCHOWN) static void -lchown_internal(const char *path, void *arg) +lchown_internal(const char *path, VALUE pathv, void *arg) { struct chown_args *args = arg; if (lchown(path, args->owner, args->group) < 0) - rb_sys_fail(path); + rb_sys_fail_path(pathv); } /* @@ -2213,10 +2215,10 @@ struct utime_args { }; #if defined DOSISH || defined __CYGWIN__ -NORETURN(static void utime_failed(const char *, const struct timespec *, VALUE, VALUE)); +NORETURN(static void utime_failed(VALUE, const struct timespec *, VALUE, VALUE)); static void -utime_failed(const char *path, const struct timespec *tsp, VALUE atime, VALUE mtime) +utime_failed(VALUE path, const struct timespec *tsp, VALUE atime, VALUE mtime) { if (tsp && errno == EINVAL) { VALUE e[2], a = Qnil, m = Qnil; @@ -2237,23 +2239,23 @@ utime_failed(const char *path, const struct timespec *tsp, VALUE atime, VALUE mt if (!NIL_P(e[0])) { if (path) { if (!d) e[0] = rb_str_dup(e[0]); - rb_str_cat2(rb_str_cat2(e[0], " for "), path); + rb_str_append(rb_str_cat2(e[0], " for "), path); } e[1] = INT2FIX(EINVAL); rb_exc_raise(rb_class_new_instance(2, e, rb_eSystemCallError)); } errno = EINVAL; } - rb_sys_fail(path); + rb_sys_fail_path(path); } #else -#define utime_failed(path, tsp, atime, mtime) rb_sys_fail(path) +#define utime_failed(path, tsp, atime, mtime) rb_sys_fail_path(path) #endif #if defined(HAVE_UTIMES) static void -utime_internal(const char *path, void *arg) +utime_internal(const char *path, VALUE pathv, void *arg) { struct utime_args *v = arg; const struct timespec *tsp = v->tsp; @@ -2283,7 +2285,7 @@ no_utimensat: tvp = tvbuf; } if (utimes(path, tvp) < 0) - utime_failed(path, tsp, v->atime, v->mtime); + utime_failed(pathv, tsp, v->atime, v->mtime); } #else @@ -2296,7 +2298,7 @@ struct utimbuf { #endif static void -utime_internal(const char *path, void *arg) +utime_internal(const char *path, VALUE pathv, void *arg) { struct utime_args *v = arg; const struct timespec *tsp = v->tsp; @@ -2307,7 +2309,7 @@ utime_internal(const char *path, void *arg) utp = &utbuf; } if (utime(path, utp) < 0) - utime_failed(path, tsp, v->atime, v->mtime); + utime_failed(pathv, tsp, v->atime, v->mtime); } #endif @@ -2347,33 +2349,19 @@ NORETURN(static void sys_fail2(VALUE,VALUE)); static void sys_fail2(VALUE s1, VALUE s2) { - char *buf; + VALUE str; #ifdef MAX_PATH const int max_pathlen = MAX_PATH; #else const int max_pathlen = MAXPATHLEN; #endif - const char *e1, *e2; - int len = 5; - long l1 = RSTRING_LEN(s1), l2 = RSTRING_LEN(s2); - e1 = e2 = ""; - if (l1 > max_pathlen) { - l1 = max_pathlen - 3; - e1 = "..."; - len += 3; - } - if (l2 > max_pathlen) { - l2 = max_pathlen - 3; - e2 = "..."; - len += 3; - } - len += (int)l1 + (int)l2; - buf = ALLOCA_N(char, len); - snprintf(buf, len, "(%.*s%s, %.*s%s)", - (int)l1, RSTRING_PTR(s1), e1, - (int)l2, RSTRING_PTR(s2), e2); - rb_sys_fail(buf); + str = rb_str_new_cstr("("); + rb_str_append(str, rb_str_ellipsize(s1, max_pathlen)); + rb_str_cat2(str, ", "); + rb_str_append(str, rb_str_ellipsize(s2, max_pathlen)); + rb_str_cat2(str, ")"); + rb_sys_fail_path(str); } #ifdef HAVE_LINK @@ -2492,10 +2480,10 @@ rb_readlink(VALUE path) #endif static void -unlink_internal(const char *path, void *arg) +unlink_internal(const char *path, VALUE pathv, void *arg) { if (unlink(path) < 0) - rb_sys_fail(path); + rb_sys_fail_path(pathv); } /* diff --git a/io.c b/io.c index 6c7cf2523d..04868107d5 100644 --- a/io.c +++ b/io.c @@ -374,7 +374,7 @@ rb_cloexec_fcntl_dupfd(int fd, int minfd) # endif #endif -#define rb_sys_fail_path(path) rb_sys_fail(NIL_P(path) ? 0 : RSTRING_PTR(path)) +#define rb_sys_fail_path(path) rb_sys_fail_str(path) static int io_fflush(rb_io_t *);