diff --git a/mrbgems/hal-win-io/src/io_hal.c b/mrbgems/hal-win-io/src/io_hal.c index f4220434f..6f2ecacea 100644 --- a/mrbgems/hal-win-io/src/io_hal.c +++ b/mrbgems/hal-win-io/src/io_hal.c @@ -200,57 +200,22 @@ mrb_hal_io_rename(mrb_state *mrb, const char *oldpath, const char *newpath) int mrb_hal_io_symlink(mrb_state *mrb, const char *target, const char *linkpath) { - DWORD flags = 0; - (void)mrb; - - /* Check if target is a directory */ - DWORD attrs = GetFileAttributes(target); - if (attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_DIRECTORY)) { - flags = SYMBOLIC_LINK_FLAG_DIRECTORY; - } - - if (!CreateSymbolicLink(linkpath, target, flags)) { - set_errno_from_win_error(GetLastError()); - return -1; - } - return 0; + (void)target; + (void)linkpath; + /* Symlinks require special privileges on Windows */ + mrb_raise(mrb, E_NOTIMP_ERROR, "symlink is not supported on Windows"); + return -1; /* not reached */ } int64_t mrb_hal_io_readlink(mrb_state *mrb, const char *path, char *buf, size_t bufsize) { - HANDLE h; - DWORD ret; - char temp[PATH_MAX]; - (void)mrb; - - h = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); - if (h == INVALID_HANDLE_VALUE) { - set_errno_from_win_error(GetLastError()); - return -1; - } - - ret = GetFinalPathNameByHandle(h, temp, PATH_MAX, FILE_NAME_NORMALIZED); - CloseHandle(h); - - if (ret == 0 || ret >= PATH_MAX) { - errno = EIO; - return -1; - } - - /* Remove \\?\ prefix if present */ - const char *result = temp; - if (strncmp(temp, "\\\\?\\", 4) == 0) { - result = temp + 4; - } - - size_t len = strlen(result); - if (len > bufsize) { - len = bufsize; - } - memcpy(buf, result, len); - return (int64_t)len; + (void)path; + (void)buf; + (void)bufsize; + /* Symlinks require special handling on Windows */ + mrb_raise(mrb, E_NOTIMP_ERROR, "readlink is not supported on Windows"); + return -1; /* not reached */ } char* diff --git a/mrbgems/mruby-io/src/file_test.c b/mrbgems/mruby-io/src/file_test.c index c1c37e1bb..e038c29d6 100644 --- a/mrbgems/mruby-io/src/file_test.c +++ b/mrbgems/mruby-io/src/file_test.c @@ -137,6 +137,10 @@ mrb_filetest_s_pipe_p(mrb_state *mrb, mrb_value klass) static mrb_value mrb_filetest_s_symlink_p(mrb_state *mrb, mrb_value klass) { +#ifdef _WIN32 + /* Symlinks not reliably supported on Windows */ + mrb_raise(mrb, E_NOTIMP_ERROR, "symlink? is not supported on Windows"); +#else #ifndef S_ISLNK # ifdef _S_ISLNK # define S_ISLNK(m) _S_ISLNK(m) @@ -159,6 +163,7 @@ mrb_filetest_s_symlink_p(mrb_state *mrb, mrb_value klass) return mrb_false_value(); if (S_ISLNK(st.st_mode)) return mrb_true_value(); +#endif #endif return mrb_false_value(); @@ -178,6 +183,10 @@ mrb_filetest_s_symlink_p(mrb_state *mrb, mrb_value klass) static mrb_value mrb_filetest_s_socket_p(mrb_state *mrb, mrb_value klass) { +#ifdef _WIN32 + /* Unix domain sockets not supported on Windows */ + mrb_raise(mrb, E_NOTIMP_ERROR, "socket? is not supported on Windows"); +#else #ifndef S_ISSOCK # ifdef _S_ISSOCK # define S_ISSOCK(m) _S_ISSOCK(m) @@ -200,6 +209,7 @@ mrb_filetest_s_socket_p(mrb_state *mrb, mrb_value klass) return mrb_false_value(); if (S_ISSOCK(st.st_mode)) return mrb_true_value(); +#endif #endif return mrb_false_value(); diff --git a/mrbgems/mruby-io/test/file.rb b/mrbgems/mruby-io/test/file.rb index 3bcb123bf..b65f7f8f8 100644 --- a/mrbgems/mruby-io/test/file.rb +++ b/mrbgems/mruby-io/test/file.rb @@ -380,6 +380,8 @@ assert('File.chmod') do begin assert_equal 1, File.chmod(0400, "#{$mrbtest_io_wfname}.chmod-test") ensure + # On Windows, must restore write permission before deletion + File.chmod(0600, "#{$mrbtest_io_wfname}.chmod-test") rescue nil File.delete("#{$mrbtest_io_wfname}.chmod-test") end end