-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Android: add native platform support #2396
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
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
#if os(Linux) | ||
#if canImport(Glibc) | ||
import Glibc | ||
#else | ||
import Darwin.C | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -428,55 +428,76 @@ public final class Inotify { | |
// FIXME: <rdar://problem/45794219> Swift should provide shims for FD_ macros | ||
|
||
private func FD_ZERO(_ set: inout fd_set) { | ||
#if os(Android) | ||
set.fds_bits = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) | ||
#else | ||
set.__fds_bits = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) | ||
#endif | ||
} | ||
|
||
private func FD_SET(_ fd: Int32, _ set: inout fd_set) { | ||
let intOffset = Int(fd / 16) | ||
let bitOffset = Int(fd % 16) | ||
#if os(Android) | ||
var fd_bits = set.fds_bits | ||
let mask: UInt = 1 << bitOffset | ||
#else | ||
var fd_bits = set.__fds_bits | ||
let mask = 1 << bitOffset | ||
#endif | ||
switch intOffset { | ||
case 0: set.__fds_bits.0 = set.__fds_bits.0 | mask | ||
case 1: set.__fds_bits.1 = set.__fds_bits.1 | mask | ||
case 2: set.__fds_bits.2 = set.__fds_bits.2 | mask | ||
case 3: set.__fds_bits.3 = set.__fds_bits.3 | mask | ||
case 4: set.__fds_bits.4 = set.__fds_bits.4 | mask | ||
case 5: set.__fds_bits.5 = set.__fds_bits.5 | mask | ||
case 6: set.__fds_bits.6 = set.__fds_bits.6 | mask | ||
case 7: set.__fds_bits.7 = set.__fds_bits.7 | mask | ||
case 8: set.__fds_bits.8 = set.__fds_bits.8 | mask | ||
case 9: set.__fds_bits.9 = set.__fds_bits.9 | mask | ||
case 10: set.__fds_bits.10 = set.__fds_bits.10 | mask | ||
case 11: set.__fds_bits.11 = set.__fds_bits.11 | mask | ||
case 12: set.__fds_bits.12 = set.__fds_bits.12 | mask | ||
case 13: set.__fds_bits.13 = set.__fds_bits.13 | mask | ||
case 14: set.__fds_bits.14 = set.__fds_bits.14 | mask | ||
case 15: set.__fds_bits.15 = set.__fds_bits.15 | mask | ||
case 0: fd_bits.0 = fd_bits.0 | mask | ||
case 1: fd_bits.1 = fd_bits.1 | mask | ||
case 2: fd_bits.2 = fd_bits.2 | mask | ||
case 3: fd_bits.3 = fd_bits.3 | mask | ||
case 4: fd_bits.4 = fd_bits.4 | mask | ||
case 5: fd_bits.5 = fd_bits.5 | mask | ||
case 6: fd_bits.6 = fd_bits.6 | mask | ||
case 7: fd_bits.7 = fd_bits.7 | mask | ||
case 8: fd_bits.8 = fd_bits.8 | mask | ||
case 9: fd_bits.9 = fd_bits.9 | mask | ||
case 10: fd_bits.10 = fd_bits.10 | mask | ||
case 11: fd_bits.11 = fd_bits.11 | mask | ||
case 12: fd_bits.12 = fd_bits.12 | mask | ||
case 13: fd_bits.13 = fd_bits.13 | mask | ||
case 14: fd_bits.14 = fd_bits.14 | mask | ||
case 15: fd_bits.15 = fd_bits.15 | mask | ||
default: break | ||
} | ||
#if os(Android) | ||
set.fds_bits = fd_bits | ||
#else | ||
set.__fds_bits = fd_bits | ||
#endif | ||
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. It'd be nice if I could assign some kind of compile-time symbol reference to each platform's variable name, so that this runtime copying isn't needed. |
||
} | ||
|
||
private func FD_ISSET(_ fd: Int32, _ set: inout fd_set) -> Bool { | ||
let intOffset = Int(fd / 32) | ||
let bitOffset = Int(fd % 32) | ||
#if os(Android) | ||
let fd_bits = set.fds_bits | ||
let mask: UInt = 1 << bitOffset | ||
#else | ||
let fd_bits = set.__fds_bits | ||
let mask = 1 << bitOffset | ||
#endif | ||
switch intOffset { | ||
case 0: return set.__fds_bits.0 & mask != 0 | ||
case 1: return set.__fds_bits.1 & mask != 0 | ||
case 2: return set.__fds_bits.2 & mask != 0 | ||
case 3: return set.__fds_bits.3 & mask != 0 | ||
case 4: return set.__fds_bits.4 & mask != 0 | ||
case 5: return set.__fds_bits.5 & mask != 0 | ||
case 6: return set.__fds_bits.6 & mask != 0 | ||
case 7: return set.__fds_bits.7 & mask != 0 | ||
case 8: return set.__fds_bits.8 & mask != 0 | ||
case 9: return set.__fds_bits.9 & mask != 0 | ||
case 10: return set.__fds_bits.10 & mask != 0 | ||
case 11: return set.__fds_bits.11 & mask != 0 | ||
case 12: return set.__fds_bits.12 & mask != 0 | ||
case 13: return set.__fds_bits.13 & mask != 0 | ||
case 14: return set.__fds_bits.14 & mask != 0 | ||
case 15: return set.__fds_bits.15 & mask != 0 | ||
case 0: return fd_bits.0 & mask != 0 | ||
case 1: return fd_bits.1 & mask != 0 | ||
case 2: return fd_bits.2 & mask != 0 | ||
case 3: return fd_bits.3 & mask != 0 | ||
case 4: return fd_bits.4 & mask != 0 | ||
case 5: return fd_bits.5 & mask != 0 | ||
case 6: return fd_bits.6 & mask != 0 | ||
case 7: return fd_bits.7 & mask != 0 | ||
case 8: return fd_bits.8 & mask != 0 | ||
case 9: return fd_bits.9 & mask != 0 | ||
case 10: return fd_bits.10 & mask != 0 | ||
case 11: return fd_bits.11 & mask != 0 | ||
case 12: return fd_bits.12 & mask != 0 | ||
case 13: return fd_bits.13 & mask != 0 | ||
case 14: return fd_bits.14 & mask != 0 | ||
case 15: return fd_bits.15 & mask != 0 | ||
default: return false | ||
} | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,6 +13,7 @@ import Foundation | |
|
||
/// Recognized Platform types. | ||
public enum Platform { | ||
case android | ||
case darwin | ||
case linux(LinuxFlavor) | ||
|
||
|
@@ -33,6 +34,10 @@ public enum Platform { | |
if localFileSystem.isFile(AbsolutePath("/etc/debian_version")) { | ||
return .linux(.debian) | ||
} | ||
if localFileSystem.isFile(AbsolutePath("/system/bin/toolbox")) || | ||
localFileSystem.isFile(AbsolutePath("/system/bin/toybox")) { | ||
return .android | ||
} | ||
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. This function doesn't seem to be called anywhere, can remove if not needed. 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. yah let's remove it if it's dead code. 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. I was wrong, the variable it's used to initialize, 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. Any reason you chose these particular files vs 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. No other reason that I'm familiar with toolbox/toybox, as they're sometimes invoked from the Termux command-line, and not build.prop, which is unreadable without root on my device. If there's a better file that signifies Android, glad to use that instead, just let me know. 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. OK, that's fine for now, we can always update the check later if we need to. Thanks for your contribution! |
||
default: | ||
return nil | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -60,8 +60,10 @@ public struct DLOpenFlags: RawRepresentable, OptionSet { | |
public static let deepBind: DLOpenFlags = DLOpenFlags(rawValue: 0) | ||
#else | ||
public static let first: DLOpenFlags = DLOpenFlags(rawValue: 0) | ||
#if !os(Android) | ||
public static let deepBind: DLOpenFlags = DLOpenFlags(rawValue: RTLD_DEEPBIND) | ||
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. No |
||
#endif | ||
#endif | ||
#endif | ||
|
||
public var rawValue: Int32 | ||
|
Uh oh!
There was an error while loading. Please reload this page.