48ba8af30cd0b559d045a9a6b13f4c2b9d399b64Tinderbox User * Copyright (C) 1999-2001, 2004, 2005, 2007-2009, 2011, 2012, 2016, 2017 Internet Systems Consortium, Inc. ("ISC")
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein * \author Principal Authors: DCL */
92ef1a9b9dbd48ecb507b42ac62c15afefdaf838David Lawrence#define ISC_DIR_MAGIC ISC_MAGIC('D', 'I', 'R', '*')
0c73b546ecfa49b9d1c8fdb9a48d4cd62176124aDavid Lawrence#define VALID_DIR(dir) ISC_MAGIC_VALID(dir, ISC_DIR_MAGIC)
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein * \brief Allocate workspace and open directory stream. If either one fails,
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence * NULL will be returned.
0e1bef59f060f6442a93cb662b0313e8908500e1Bob Halleyisc_dir_open(isc_dir_t *dir, const char *dirname) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * Copy directory name. Need to have enough space for the name,
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * a possible path separator, the wildcard, and the final NUL.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* XXXDCL ? */
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt strlcpy(dir->dirname, dirname, sizeof(dir->dirname));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * Append path separator, if needed, and "*".
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence * Open stream.
f8f8a5b3a33f581c6e209c7ded8168e7acc73dfbAutomatic Updater * \brief Return previously retrieved file or get next one.
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein * Unix's dirent has
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence * separate open and read functions, but the Win32 and DOS interfaces open
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence * the dir stream and reads the first file in one operation.
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence REQUIRE(VALID_DIR(dir) && dir->handle != NULL);
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence * Fetch next file in directory.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence * Make sure that the space for the name is long enough.
0307846c714477583e4e377a915829e5afe2ef38David Lawrence if (sizeof(dir->entry.name) <= strlen(entry->d_name))
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt strlcpy(dir->entry.name, entry->d_name, sizeof(dir->entry.name));
1c333c1415bd537463983f046100d170228590ddDavid Lawrence * Some dirents have d_namlen, but it is not portable.
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein * \brief Close directory stream.
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence REQUIRE(VALID_DIR(dir) && dir->handle != NULL);
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein * \brief Reposition directory stream at start.
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence REQUIRE(VALID_DIR(dir) && dir->handle != NULL);
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein * \brief Change the current directory to 'dirname'.
4901f2c10b4393fd4407c8feb022c3415ab323c7Mark Andrews * Try to use getservbyname and getprotobyname before chroot.
4901f2c10b4393fd4407c8feb022c3415ab323c7Mark Andrews * If WKS records are used in a zone under chroot, Name Service Switch
4901f2c10b4393fd4407c8feb022c3415ab323c7Mark Andrews * may fail to load library in chroot.
4901f2c10b4393fd4407c8feb022c3415ab323c7Mark Andrews * Do not report errors if it fails, we do not need any result now.
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein * \brief mkdtemp is not portable, so this emulates it.
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence * Replace trailing Xs with the process-id, zero-filled.
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence for (x = templet + strlen(templet) - 1; *x == 'X' && x >= templet;
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence x++; /* Set x to start of ex-Xs. */
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence * The BSD algorithm.
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence while (*p != '\0') {
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence else if (*p != 'z')
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence * Reset character and move to next.
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence if (*p == '\0') {
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence * Tried all combinations. errno should already
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence * be EEXIST, but ensure it is anyway for
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence * isc__errno2result().