]>
git.saurik.com Git - apple/security.git/blob - cdsa/cdsa_utilities/fdsel.cpp
2 * Copyright (c) 2000-2001 Apple Computer, Inc. All Rights Reserved.
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
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.
20 // fdsel - select-style file descriptor set management
26 namespace UnixPlusPlus
{
30 // Throw the bitvectors away on destruction
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.
45 void FDSet::grow(int oldWords
, int newWords
)
47 assert(oldWords
< newWords
);
48 grow(mBits
, oldWords
, newWords
);
49 grow(mUseBits
, oldWords
, newWords
);
52 void FDSet::grow(fd_mask
* &bits
, int oldWords
, int newWords
)
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
));
63 // Set or clear a single bit in the map.
64 // No check for overflow is perfomed.
66 void FDSet::set(int fd
, bool on
)
69 FD_SET(fd
, (fd_set
*)mBits
);
71 FD_CLR(fd
, (fd_set
*)mBits
);
72 FD_CLR(fd
, (fd_set
*)mUseBits
);
78 // Copy only the first words fd_mask words from mBits to mUseBits
79 // and return that for select(2) use.
81 fd_set
*FDSet::make(int words
)
83 //@@@ if empty -> return NULL (but check caller for [] use)
84 memcpy(mUseBits
, mBits
, words
* sizeof(fd_mask
));
85 return (fd_set
*)mUseBits
;
89 } // end namespace IPPlusPlus
90 } // end namespace Security