0001    /**
0002     * Copyright IBM Corporation 2016
0003     *
0004     * Licensed under the Apache License, Version 2.0 (the "License");
0005     * you may not use this file except in compliance with the License.
0006     * You may obtain a copy of the License at
0007     *
0008     * http://www.apache.org/licenses/LICENSE-2.0
0009     *
0010     * Unless required by applicable law or agreed to in writing, software
0011     * distributed under the License is distributed on an "AS IS" BASIS,
0012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
0013     * See the License for the specific language governing permissions and
0014     * limitations under the License.
0015     **/
0016    
0017    #if os(Linux)
0018    import Glibc
0019    /// Replacement for FD_ZERO macro
0020    public func fdZero(inout set: fd_set) {
0021      set.__fds_bits = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
0022    }
0023    
0024    /// Replacement for FD_SET macro
0025    public func fdSet(fd: Int32, inout set: fd_set) {
0026      let intOffset = Int(fd / 16)
0027      let bitOffset: Int = Int(fd % 16)
0028      let mask: Int = 1 << bitOffset
0029      switch intOffset {
0030        case 0: set.__fds_bits.0 = set.__fds_bits.0 | mask
0031        case 1: set.__fds_bits.1 = set.__fds_bits.1 | mask
0032        case 2: set.__fds_bits.2 = set.__fds_bits.2 | mask
0033        case 3: set.__fds_bits.3 = set.__fds_bits.3 | mask
0034        case 4: set.__fds_bits.4 = set.__fds_bits.4 | mask
0035        case 5: set.__fds_bits.5 = set.__fds_bits.5 | mask
0036        case 6: set.__fds_bits.6 = set.__fds_bits.6 | mask
0037        case 7: set.__fds_bits.7 = set.__fds_bits.7 | mask
0038        case 8: set.__fds_bits.8 = set.__fds_bits.8 | mask
0039        case 9: set.__fds_bits.9 = set.__fds_bits.9 | mask
0040        case 10: set.__fds_bits.10 = set.__fds_bits.10 | mask
0041        case 11: set.__fds_bits.11 = set.__fds_bits.11 | mask
0042        case 12: set.__fds_bits.12 = set.__fds_bits.12 | mask
0043        case 13: set.__fds_bits.13 = set.__fds_bits.13 | mask
0044        case 14: set.__fds_bits.14 = set.__fds_bits.14 | mask
0045        case 15: set.__fds_bits.15 = set.__fds_bits.15 | mask
0046        default: break
0047      }
0048    }
0049    
0050    /// Replacement for FD_CLR macro
0051    public func fdClr(fd: Int32, inout set: fd_set) {
0052      let intOffset = Int(fd / 16)
0053      let bitOffset: Int = Int(fd % 16)
0054      let mask: Int = ~(1 << bitOffset)
0055      switch intOffset {
0056        case 0: set.__fds_bits.0 = set.__fds_bits.0 & mask
0057        case 1: set.__fds_bits.1 = set.__fds_bits.1 & mask
0058        case 2: set.__fds_bits.2 = set.__fds_bits.2 & mask
0059        case 3: set.__fds_bits.3 = set.__fds_bits.3 & mask
0060        case 4: set.__fds_bits.4 = set.__fds_bits.4 & mask
0061        case 5: set.__fds_bits.5 = set.__fds_bits.5 & mask
0062        case 6: set.__fds_bits.6 = set.__fds_bits.6 & mask
0063        case 7: set.__fds_bits.7 = set.__fds_bits.7 & mask
0064        case 8: set.__fds_bits.8 = set.__fds_bits.8 & mask
0065        case 9: set.__fds_bits.9 = set.__fds_bits.9 & mask
0066        case 10: set.__fds_bits.10 = set.__fds_bits.10 & mask
0067        case 11: set.__fds_bits.11 = set.__fds_bits.11 & mask
0068        case 12: set.__fds_bits.12 = set.__fds_bits.12 & mask
0069        case 13: set.__fds_bits.13 = set.__fds_bits.13 & mask
0070        case 14: set.__fds_bits.14 = set.__fds_bits.14 & mask
0071        case 15: set.__fds_bits.15 = set.__fds_bits.15 & mask
0072        default: break
0073      }
0074    }
0075    
0076    /// Replacement for FD_ISSET macro
0077    public func fdIsSet(fd: Int32, inout set: fd_set) -> Bool {
0078      let intOffset = Int(fd / 16)
0079      let bitOffset = Int(fd % 16)
0080      let mask: Int = 1 << bitOffset
0081      switch intOffset {
0082        case 0: return set.__fds_bits.0 & mask != 0
0083        case 1: return set.__fds_bits.1 & mask != 0
0084        case 2: return set.__fds_bits.2 & mask != 0
0085        case 3: return set.__fds_bits.3 & mask != 0
0086        case 4: return set.__fds_bits.4 & mask != 0
0087        case 5: return set.__fds_bits.5 & mask != 0
0088        case 6: return set.__fds_bits.6 & mask != 0
0089        case 7: return set.__fds_bits.7 & mask != 0
0090        case 8: return set.__fds_bits.8 & mask != 0
0091        case 9: return set.__fds_bits.9 & mask != 0
0092        case 10: return set.__fds_bits.10 & mask != 0
0093        case 11: return set.__fds_bits.11 & mask != 0
0094        case 12: return set.__fds_bits.12 & mask != 0
0095        case 13: return set.__fds_bits.13 & mask != 0
0096        case 14: return set.__fds_bits.14 & mask != 0
0097        case 15: return set.__fds_bits.15 & mask != 0
0098        default: return false
0099      }
0100    }
0101    #else
0102    import Darwin
0103    /// Replacement for FD_ZERO macro
0104    public func fdZero(inout set: fd_set) {
0105      set.fds_bits = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
0106    }
0107    
0108    /// Replacement for FD_SET macro
0109    public func fdSet(fd: Int32, inout set: fd_set) {
0110      let intOffset = Int(fd / 32)
0111      let bitOffset = fd % 32
0112      let mask = 1 << bitOffset
0113      switch intOffset {
0114        case 0: set.fds_bits.0 = set.fds_bits.0 | mask
0115        case 1: set.fds_bits.1 = set.fds_bits.1 | mask
0116        case 2: set.fds_bits.2 = set.fds_bits.2 | mask
0117        case 3: set.fds_bits.3 = set.fds_bits.3 | mask
0118        case 4: set.fds_bits.4 = set.fds_bits.4 | mask
0119        case 5: set.fds_bits.5 = set.fds_bits.5 | mask
0120        case 6: set.fds_bits.6 = set.fds_bits.6 | mask
0121        case 7: set.fds_bits.7 = set.fds_bits.7 | mask
0122        case 8: set.fds_bits.8 = set.fds_bits.8 | mask
0123        case 9: set.fds_bits.9 = set.fds_bits.9 | mask
0124        case 10: set.fds_bits.10 = set.fds_bits.10 | mask
0125        case 11: set.fds_bits.11 = set.fds_bits.11 | mask
0126        case 12: set.fds_bits.12 = set.fds_bits.12 | mask
0127        case 13: set.fds_bits.13 = set.fds_bits.13 | mask
0128        case 14: set.fds_bits.14 = set.fds_bits.14 | mask
0129        case 15: set.fds_bits.15 = set.fds_bits.15 | mask
0130        case 16: set.fds_bits.16 = set.fds_bits.16 | mask
0131        case 17: set.fds_bits.17 = set.fds_bits.17 | mask
0132        case 18: set.fds_bits.18 = set.fds_bits.18 | mask
0133        case 19: set.fds_bits.19 = set.fds_bits.19 | mask
0134        case 20: set.fds_bits.20 = set.fds_bits.20 | mask
0135        case 21: set.fds_bits.21 = set.fds_bits.21 | mask
0136        case 22: set.fds_bits.22 = set.fds_bits.22 | mask
0137        case 23: set.fds_bits.23 = set.fds_bits.23 | mask
0138        case 24: set.fds_bits.24 = set.fds_bits.24 | mask
0139        case 25: set.fds_bits.25 = set.fds_bits.25 | mask
0140        case 26: set.fds_bits.26 = set.fds_bits.26 | mask
0141        case 27: set.fds_bits.27 = set.fds_bits.27 | mask
0142        case 28: set.fds_bits.28 = set.fds_bits.28 | mask
0143        case 29: set.fds_bits.29 = set.fds_bits.29 | mask
0144        case 30: set.fds_bits.30 = set.fds_bits.30 | mask
0145        case 31: set.fds_bits.31 = set.fds_bits.31 | mask
0146        default: break
0147      }
0148    }
0149    
0150    /// Replacement for FD_CLR macro
0151    public func fdClr(fd: Int32, inout set: fd_set) {
0152      let intOffset = Int(fd / 32)
0153      let bitOffset = fd % 32
0154      let mask = ~(1 << bitOffset)
0155      switch intOffset {
0156        case 0: set.fds_bits.0 = set.fds_bits.0 & mask
0157        case 1: set.fds_bits.1 = set.fds_bits.1 & mask
0158        case 2: set.fds_bits.2 = set.fds_bits.2 & mask
0159        case 3: set.fds_bits.3 = set.fds_bits.3 & mask
0160        case 4: set.fds_bits.4 = set.fds_bits.4 & mask
0161        case 5: set.fds_bits.5 = set.fds_bits.5 & mask
0162        case 6: set.fds_bits.6 = set.fds_bits.6 & mask
0163        case 7: set.fds_bits.7 = set.fds_bits.7 & mask
0164        case 8: set.fds_bits.8 = set.fds_bits.8 & mask
0165        case 9: set.fds_bits.9 = set.fds_bits.9 & mask
0166        case 10: set.fds_bits.10 = set.fds_bits.10 & mask
0167        case 11: set.fds_bits.11 = set.fds_bits.11 & mask
0168        case 12: set.fds_bits.12 = set.fds_bits.12 & mask
0169        case 13: set.fds_bits.13 = set.fds_bits.13 & mask
0170        case 14: set.fds_bits.14 = set.fds_bits.14 & mask
0171        case 15: set.fds_bits.15 = set.fds_bits.15 & mask
0172        case 16: set.fds_bits.16 = set.fds_bits.16 & mask
0173        case 17: set.fds_bits.17 = set.fds_bits.17 & mask
0174        case 18: set.fds_bits.18 = set.fds_bits.18 & mask
0175        case 19: set.fds_bits.19 = set.fds_bits.19 & mask
0176        case 20: set.fds_bits.20 = set.fds_bits.20 & mask
0177        case 21: set.fds_bits.21 = set.fds_bits.21 & mask
0178        case 22: set.fds_bits.22 = set.fds_bits.22 & mask
0179        case 23: set.fds_bits.23 = set.fds_bits.23 & mask
0180        case 24: set.fds_bits.24 = set.fds_bits.24 & mask
0181        case 25: set.fds_bits.25 = set.fds_bits.25 & mask
0182        case 26: set.fds_bits.26 = set.fds_bits.26 & mask
0183        case 27: set.fds_bits.27 = set.fds_bits.27 & mask
0184        case 28: set.fds_bits.28 = set.fds_bits.28 & mask
0185        case 29: set.fds_bits.29 = set.fds_bits.29 & mask
0186        case 30: set.fds_bits.30 = set.fds_bits.30 & mask
0187        case 31: set.fds_bits.31 = set.fds_bits.31 & mask
0188        default: break
0189      }
0190    }
0191    
0192    /// Replacement for FD_ISSET macro
0193    public func fdIsSet(fd: Int32, inout set: fd_set) -> Bool {
0194      let intOffset = Int(fd / 32)
0195      let bitOffset = fd % 32
0196      let mask = 1 << bitOffset
0197      switch intOffset {
0198        case 0: return set.fds_bits.0 & mask != 0
0199        case 1: return set.fds_bits.1 & mask != 0
0200        case 2: return set.fds_bits.2 & mask != 0
0201        case 3: return set.fds_bits.3 & mask != 0
0202        case 4: return set.fds_bits.4 & mask != 0
0203        case 5: return set.fds_bits.5 & mask != 0
0204        case 6: return set.fds_bits.6 & mask != 0
0205        case 7: return set.fds_bits.7 & mask != 0
0206        case 8: return set.fds_bits.8 & mask != 0
0207        case 9: return set.fds_bits.9 & mask != 0
0208        case 10: return set.fds_bits.10 & mask != 0
0209        case 11: return set.fds_bits.11 & mask != 0
0210        case 12: return set.fds_bits.12 & mask != 0
0211        case 13: return set.fds_bits.13 & mask != 0
0212        case 14: return set.fds_bits.14 & mask != 0
0213        case 15: return set.fds_bits.15 & mask != 0
0214        case 16: return set.fds_bits.16 & mask != 0
0215        case 17: return set.fds_bits.17 & mask != 0
0216        case 18: return set.fds_bits.18 & mask != 0
0217        case 19: return set.fds_bits.19 & mask != 0
0218        case 20: return set.fds_bits.20 & mask != 0
0219        case 21: return set.fds_bits.21 & mask != 0
0220        case 22: return set.fds_bits.22 & mask != 0
0221        case 23: return set.fds_bits.23 & mask != 0
0222        case 24: return set.fds_bits.24 & mask != 0
0223        case 25: return set.fds_bits.25 & mask != 0
0224        case 26: return set.fds_bits.26 & mask != 0
0225        case 27: return set.fds_bits.27 & mask != 0
0226        case 28: return set.fds_bits.28 & mask != 0
0227        case 29: return set.fds_bits.29 & mask != 0
0228        case 30: return set.fds_bits.30 & mask != 0
0229        case 31: return set.fds_bits.31 & mask != 0
0230        default: return false
0231      }
0232    }
0233    #endif
0234