-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
"hello world" windows port #5339
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
e8c09bb
Cleanup unused lib_c requires
RX14 db9493b
Add NotImplementedError
RX14 70196cb
Add lib_c bindings for windows
RX14 e404e1b
Stub things out for windows
RX14 7579651
Implement Errno for win32
RX14 3acecfd
Add Crystal::System::Time stub for win32
RX14 c6ae527
Add Crystal::System::Random stub for win32
RX14 eb60796
Implement Crystal::System::FileDescriptor for windows
RX14 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,5 @@ | ||
require "./unix/file_descriptor" | ||
{% if flag?(:win32) %} | ||
require "./win32/file_descriptor" | ||
{% else %} | ||
require "./unix/file_descriptor" | ||
{% end %} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
require "file/stat" | ||
require "c/io" | ||
|
||
module Crystal::System::FileDescriptor | ||
@fd : LibC::Int | ||
|
||
private def unbuffered_read(slice : Bytes) | ||
bytes_read = LibC._read(@fd, slice, slice.size) | ||
if bytes_read == -1 | ||
raise Errno.new("Error reading file") | ||
end | ||
bytes_read | ||
end | ||
|
||
private def unbuffered_write(slice : Bytes) | ||
loop do | ||
bytes_written = LibC._write(@fd, slice, slice.size) | ||
if bytes_written == -1 | ||
raise Errno.new("Error writing file") | ||
end | ||
|
||
slice += bytes_written | ||
return if slice.size == 0 | ||
end | ||
end | ||
|
||
private def system_blocking? | ||
true | ||
end | ||
|
||
private def system_blocking=(blocking) | ||
raise NotImplementedError.new("Crystal::System::FileDescriptor#system_blocking=") unless blocking | ||
end | ||
|
||
private def system_close_on_exec? | ||
false | ||
end | ||
|
||
private def system_close_on_exec=(close_on_exec) | ||
raise NotImplementedError.new("Crystal::System::FileDescriptor#system_close_on_exec=") if close_on_exec | ||
end | ||
|
||
private def system_stat | ||
if LibC._fstat64(@fd, out stat) != 0 | ||
raise Errno.new("Unable to get stat") | ||
end | ||
::File::Stat.new(stat) | ||
end | ||
|
||
private def system_seek(offset, whence : IO::Seek) : Nil | ||
seek_value = LibC._lseek(@fd, offset, whence) | ||
|
||
if seek_value == -1 | ||
raise Errno.new "Unable to seek" | ||
end | ||
end | ||
|
||
private def system_pos | ||
pos = LibC._lseek(@fd, 0, IO::Seek::Current) | ||
raise Errno.new "Unable to tell" if pos == -1 | ||
pos | ||
end | ||
|
||
private def system_tty? | ||
LibC._isatty(@fd) != 0 | ||
end | ||
|
||
private def system_reopen(other : IO::FileDescriptor) | ||
{% if LibC.methods.includes? "dup3".id %} | ||
# dup doesn't copy the CLOEXEC flag, so copy it manually using dup3 | ||
flags = other.close_on_exec? ? LibC::O_CLOEXEC : 0 | ||
if LibC.dup3(other.fd, self.fd, flags) == -1 | ||
raise Errno.new("Could not reopen file descriptor") | ||
end | ||
{% else %} | ||
# dup doesn't copy the CLOEXEC flag, copy it manually to the new | ||
if LibC.dup2(other.fd, self.fd) == -1 | ||
raise Errno.new("Could not reopen file descriptor") | ||
end | ||
|
||
if other.close_on_exec? | ||
self.close_on_exec = true | ||
end | ||
{% end %} | ||
end | ||
|
||
private def system_close | ||
err = nil | ||
if LibC._close(@fd) != 0 | ||
case Errno.value | ||
when Errno::EINTR | ||
# ignore | ||
else | ||
raise Errno.new("Error closing file") | ||
end | ||
end | ||
end | ||
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
module Crystal::System::Random | ||
def self.random_bytes(buf : Bytes) : Nil | ||
raise NotImplementedError.new("Crystal::System::Random.random_bytes") | ||
end | ||
|
||
def self.next_u : UInt8 | ||
raise NotImplementedError.new("Crystal::System::Random.next_u") | ||
end | ||
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
module Crystal::System::Time | ||
def self.compute_utc_offset(seconds : Int64) : Int32 | ||
raise NotImplementedError.new("Crystal::System::Time.compute_utc_offset") | ||
end | ||
|
||
def self.compute_utc_seconds_and_nanoseconds : {Int64, Int32} | ||
raise NotImplementedError.new("Crystal::System::Time.compute_utc_seconds_and_nanoseconds") | ||
end | ||
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,34 +2,51 @@ require "c/sys/stat" | |
|
||
class File | ||
struct Stat | ||
def initialize(filename : String) | ||
if LibC.stat(filename, out @stat) != 0 | ||
raise Errno.new("Unable to get stat for '#{filename}'") | ||
end | ||
def self.new(filename : String) | ||
File.stat(filename) | ||
end | ||
|
||
def initialize(@stat : LibC::Stat) | ||
end | ||
{% if flag?(:win32) %} | ||
# :nodoc: | ||
def initialize(@stat : LibC::Stat64) | ||
end | ||
{% else %} | ||
# :nodoc: | ||
def initialize(@stat : LibC::Stat) | ||
end | ||
{% end %} | ||
|
||
def atime | ||
{% if flag?(:darwin) %} | ||
time @stat.st_atimespec | ||
{% elsif flag?(:win32) %} | ||
time @stat.st_atime | ||
{% else %} | ||
time @stat.st_atim | ||
{% end %} | ||
end | ||
|
||
def blksize | ||
@stat.st_blksize | ||
{% if flag?(:win32) %} | ||
raise NotImplementedError.new("File::Stat#blksize") | ||
{% else %} | ||
@stat.st_blksize | ||
{% end %} | ||
end | ||
|
||
def blocks | ||
@stat.st_blocks | ||
{% if flag?(:win32) %} | ||
raise NotImplementedError.new("File::Stat#blocks") | ||
{% else %} | ||
@stat.st_blocks | ||
{% end %} | ||
end | ||
|
||
def ctime | ||
{% if flag?(:darwin) %} | ||
time @stat.st_ctimespec | ||
{% elsif flag?(:win32) %} | ||
time @stat.st_ctime | ||
{% else %} | ||
time @stat.st_ctim | ||
{% end %} | ||
|
@@ -59,6 +76,8 @@ class File | |
def mtime | ||
{% if flag?(:darwin) %} | ||
time @stat.st_mtimespec | ||
{% elsif flag?(:win32) %} | ||
time @stat.st_mtime | ||
{% else %} | ||
time @stat.st_mtim | ||
{% end %} | ||
|
@@ -93,8 +112,11 @@ class File | |
io << ", rdev=0x" | ||
rdev.to_s(16, io) | ||
io << ", size=" << size | ||
io << ", blksize=" << blksize | ||
io << ", blocks=" << blocks | ||
{% unless flag?(:win32) %} | ||
# These two getters raise NotImplementedError on windows. | ||
io << ", blksize=" << blksize | ||
io << ", blocks=" << blocks | ||
{% end %} | ||
io << ", atime=" << atime | ||
io << ", mtime=" << mtime | ||
io << ", ctime=" << ctime | ||
|
@@ -119,10 +141,13 @@ class File | |
pp.comma | ||
pp.text "size=#{size}" | ||
pp.comma | ||
pp.text "blksize=#{blksize}" | ||
pp.comma | ||
pp.text "blocks=#{blocks}" | ||
pp.comma | ||
{% unless flag?(:win32) %} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ditto |
||
# These two getters raise NotImplementedError on windows. | ||
pp.text "blksize=#{blksize}" | ||
pp.comma | ||
pp.text "blocks=#{blocks}" | ||
pp.comma | ||
{% end %} | ||
pp.text "atime=#{atime}" | ||
pp.comma | ||
pp.text "mtime=#{mtime}" | ||
|
@@ -171,8 +196,14 @@ class File | |
(@stat.st_mode & LibC::S_IFMT) == LibC::S_ISVTX | ||
end | ||
|
||
private def time(value) | ||
Time.new value, Time::Kind::Utc | ||
end | ||
{% if flag?(:win32) %} | ||
private def time(value) | ||
Time.epoch(value) | ||
end | ||
{% else %} | ||
private def time(value) | ||
Time.new value, Time::Kind::Utc | ||
end | ||
{% end %} | ||
end | ||
end |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe add a comment saying that it's ignored on windows because those getter are currently not implemented and would raise?