]> git.saurik.com Git - apple/security.git/blob - cdsa/cdsa_utilities/fdsel.cpp
Security-164.1.tar.gz
[apple/security.git] / cdsa / cdsa_utilities / fdsel.cpp
1 /*
2 * Copyright (c) 2000-2001 Apple Computer, Inc. All Rights Reserved.
3 *
4 * The contents of this file constitute Original Code as defined in and are
5 * subject to the Apple Public Source License Version 1.2 (the 'License').
6 * You may not use this file except in compliance with the License. Please obtain
7 * a copy of the License at http://www.apple.com/publicsource and read it before
8 * using this file.
9 *
10 * This Original Code and all software distributed under the License are
11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
15 * specific language governing rights and limitations under the License.
16 */
17
18
19 //
20 // fdsel - select-style file descriptor set management
21 //
22 #include "fdsel.h"
23
24
25 namespace Security {
26 namespace UnixPlusPlus {
27
28
29 //
30 // Throw the bitvectors away on destruction
31 //
32 FDSet::~FDSet()
33 {
34 delete mBits;
35 delete mUseBits;
36 }
37
38
39 //
40 // Given the old and desired new sizes (in fd_mask words), grow
41 // the bitvectors. New storage is zero filled. Note that we preserve
42 // the mUseBits vector, so this is safe to do during a post-select scan.
43 // This function cannot shrink the bitmaps.
44 //
45 void FDSet::grow(int oldWords, int newWords)
46 {
47 assert(oldWords < newWords);
48 grow(mBits, oldWords, newWords);
49 grow(mUseBits, oldWords, newWords);
50 }
51
52 void FDSet::grow(fd_mask * &bits, int oldWords, int newWords)
53 {
54 fd_mask *newBits = new fd_mask[newWords];
55 memcpy(newBits, bits, oldWords * sizeof(fd_mask));
56 memset(newBits + oldWords, 0, (newWords - oldWords) * sizeof(fd_mask));
57 delete [] bits;
58 bits = newBits;
59 }
60
61
62 //
63 // Set or clear a single bit in the map.
64 // No check for overflow is perfomed.
65 //
66 void FDSet::set(int fd, bool on)
67 {
68 if (on) {
69 FD_SET(fd, (fd_set *)mBits);
70 } else {
71 FD_CLR(fd, (fd_set *)mBits);
72 FD_CLR(fd, (fd_set *)mUseBits);
73 }
74 }
75
76
77 //
78 // Copy only the first words fd_mask words from mBits to mUseBits
79 // and return that for select(2) use.
80 //
81 fd_set *FDSet::make(int words)
82 {
83 //@@@ if empty -> return NULL (but check caller for [] use)
84 memcpy(mUseBits, mBits, words * sizeof(fd_mask));
85 return (fd_set *)mUseBits;
86 }
87
88
89 } // end namespace IPPlusPlus
90 } // end namespace Security