X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/80e2389990082500d76eb566d4946be3e786c3ef..d8f41ccd20de16f8ebe2ccc84d47bf1cb2b26bbb:/Security/libsecurity_utilities/lib/fdsel.cpp?ds=sidebyside diff --git a/Security/libsecurity_utilities/lib/fdsel.cpp b/Security/libsecurity_utilities/lib/fdsel.cpp new file mode 100644 index 00000000..3ea8f59e --- /dev/null +++ b/Security/libsecurity_utilities/lib/fdsel.cpp @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2000-2001,2004,2011,2014 Apple Inc. All Rights Reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +// +// fdsel - select-style file descriptor set management +// +#include "fdsel.h" + + +namespace Security { +namespace UnixPlusPlus { + + +// +// Throw the bitvectors away on destruction +// +FDSet::~FDSet() +{ + delete mBits; + delete mUseBits; +} + + +// +// Given the old and desired new sizes (in fd_mask words), grow +// the bitvectors. New storage is zero filled. Note that we preserve +// the mUseBits vector, so this is safe to do during a post-select scan. +// This function cannot shrink the bitmaps. +// +void FDSet::grow(int oldWords, int newWords) +{ + assert(oldWords < newWords); + grow(mBits, oldWords, newWords); + grow(mUseBits, oldWords, newWords); +} + +void FDSet::grow(fd_mask * &bits, int oldWords, int newWords) +{ + fd_mask *newBits = new fd_mask[newWords]; + memcpy(newBits, bits, oldWords * sizeof(fd_mask)); + memset(newBits + oldWords, 0, (newWords - oldWords) * sizeof(fd_mask)); + delete [] bits; + bits = newBits; +} + + +// +// Set or clear a single bit in the map. +// No check for overflow is perfomed. +// +void FDSet::set(int fd, bool on) +{ + if (on) { + FD_SET(fd, (fd_set *)mBits); + } else { + FD_CLR(fd, (fd_set *)mBits); + FD_CLR(fd, (fd_set *)mUseBits); + } +} + + +// +// Copy only the first words fd_mask words from mBits to mUseBits +// and return that for select(2) use. +// +fd_set *FDSet::make(int words) +{ + //@@@ if empty -> return NULL (but check caller for [] use) + memcpy(mUseBits, mBits, words * sizeof(fd_mask)); + return (fd_set *)mUseBits; +} + + +} // end namespace IPPlusPlus +} // end namespace Security