From 1d12097bae00d4c87f9fb5ad5a180a523187e4dd Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 3 Sep 2024 15:27:29 +0900 Subject: [PATCH] mruby-io (mrb_file__gethome): allow avoiding getpwnam(3); ref #5358 You have to define `MRB_IO_NO_PWNAM` to skip calling getpwname(3). --- mrbgems/mruby-io/README.md | 5 +++++ mrbgems/mruby-io/src/file.c | 38 +++++++++++++++---------------------- 2 files changed, 20 insertions(+), 23 deletions(-) diff --git a/mrbgems/mruby-io/README.md b/mrbgems/mruby-io/README.md index 99c48f3d6..597aeee98 100644 --- a/mrbgems/mruby-io/README.md +++ b/mrbgems/mruby-io/README.md @@ -169,6 +169,11 @@ Add the line below to your build configuration. | File#size | | | | File#truncate | | | +## Porting Note + +If your (non Windows) platform does not support `getpwnam(3)` for some reason, define `MRB_IO_NO_PWNAM`. +See [mruby#5358](https://github.com/mruby/mruby/issues/5358). + ## License Copyright (c) 2013 Internet Initiative Japan Inc. diff --git a/mrbgems/mruby-io/src/file.c b/mrbgems/mruby-io/src/file.c index 876fe5a80..8acd8dead 100644 --- a/mrbgems/mruby-io/src/file.c +++ b/mrbgems/mruby-io/src/file.c @@ -339,7 +339,6 @@ mrb_file__gethome(mrb_state *mrb, mrb_value klass) mrb_value path; mrb->c->ci->mid = 0; -#ifndef _WIN32 mrb_value username; mrb_int argc = mrb_get_args(mrb, "|S", &username); @@ -348,10 +347,21 @@ mrb_file__gethome(mrb_state *mrb, mrb_value klass) if (home == NULL) { return mrb_nil_value(); } +#ifdef _WIN32 + home = getenv("USERPROFILE"); + if (home == NULL) { + return mrb_nil_value(); + } +#endif if (!mrb_file_is_absolute_path(home)) { mrb_raise(mrb, E_ARGUMENT_ERROR, "non-absolute home"); } } +#if defined(_WIN32) || defined(MRB_IO_NO_PWNAM) + else { + return mrb_nil_value(); + } +#else else { const char *cuser = RSTRING_CSTR(mrb, username); struct passwd *pwd = getpwnam(cuser); @@ -363,29 +373,11 @@ mrb_file__gethome(mrb_state *mrb, mrb_value klass) mrb_raisef(mrb, E_ARGUMENT_ERROR, "non-absolute home of ~%v", username); } } - home = mrb_locale_from_utf8(home, -1); - path = mrb_str_new_cstr(mrb, home); - mrb_locale_free(home); - return path; -#else /* _WIN32 */ - mrb_int argc = mrb_get_argc(mrb); - if (argc == 0) { - home = getenv("USERPROFILE"); - if (home == NULL) { - return mrb_nil_value(); - } - if (!mrb_file_is_absolute_path(home)) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "non-absolute home"); - } - } - else { - return mrb_nil_value(); - } - home = mrb_locale_from_utf8(home, -1); - path = mrb_str_new_cstr(mrb, home); - mrb_locale_free(home); - return path; #endif + home = mrb_locale_from_utf8(home, -1); + path = mrb_str_new_cstr(mrb, home); + mrb_locale_free(home); + return path; } #define TIME_OVERFLOW_P(a) (sizeof(time_t) >= sizeof(mrb_int) && ((a) > MRB_INT_MAX || (a) < MRB_INT_MIN))