49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence/*
48ba8af30cd0b559d045a9a6b13f4c2b9d399b64Tinderbox User * Copyright (C) 1999-2001, 2004, 2005, 2007-2009, 2011, 2012, 2016, 2017 Internet Systems Consortium, Inc. ("ISC")
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
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/.
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence */
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein/*! \file
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein * \author Principal Authors: DCL */
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence#include <config.h>
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence#include <sys/types.h>
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence#include <sys/stat.h>
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence#include <ctype.h>
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence#include <errno.h>
431fb211db3cc59cb9b115e72526b83c76a2a082Bob Halley#include <unistd.h>
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence#include <isc/dir.h>
0c73b546ecfa49b9d1c8fdb9a48d4cd62176124aDavid Lawrence#include <isc/magic.h>
4901f2c10b4393fd4407c8feb022c3415ab323c7Mark Andrews#include <isc/netdb.h>
a13e9f894ce1fa80b4076a40ade53982d8e9d1d9Mukund Sivaraman#include <isc/print.h>
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence#include <isc/string.h>
364a82f7c25b62967678027043425201a5e5171aBob Halley#include <isc/util.h>
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
0c73b546ecfa49b9d1c8fdb9a48d4cd62176124aDavid Lawrence#include "errno2result.h"
0c73b546ecfa49b9d1c8fdb9a48d4cd62176124aDavid Lawrence
92ef1a9b9dbd48ecb507b42ac62c15afefdaf838David Lawrence#define ISC_DIR_MAGIC ISC_MAGIC('D', 'I', 'R', '*')
0c73b546ecfa49b9d1c8fdb9a48d4cd62176124aDavid Lawrence#define VALID_DIR(dir) ISC_MAGIC_VALID(dir, ISC_DIR_MAGIC)
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrencevoid
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrenceisc_dir_init(isc_dir_t *dir) {
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence REQUIRE(dir != NULL);
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence dir->entry.name[0] = '\0';
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence dir->entry.length = 0;
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence dir->handle = NULL;
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence dir->magic = ISC_DIR_MAGIC;
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence}
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein/*!
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein * \brief Allocate workspace and open directory stream. If either one fails,
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence * NULL will be returned.
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence */
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrenceisc_result_t
0e1bef59f060f6442a93cb662b0313e8908500e1Bob Halleyisc_dir_open(isc_dir_t *dir, const char *dirname) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews char *p;
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence isc_result_t result = ISC_R_SUCCESS;
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence REQUIRE(VALID_DIR(dir));
0e1bef59f060f6442a93cb662b0313e8908500e1Bob Halley REQUIRE(dirname != NULL);
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /*
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 */
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt if (strlen(dirname) + 3 > sizeof(dir->dirname)) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* XXXDCL ? */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return (ISC_R_NOSPACE);
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt }
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt strlcpy(dir->dirname, dirname, sizeof(dir->dirname));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /*
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * Append path separator, if needed, and "*".
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews p = dir->dirname + strlen(dir->dirname);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (dir->dirname < p && *(p - 1) != '/')
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews *p++ = '/';
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews *p++ = '*';
0874abad14e3e9ecfc3dc1a1a2b9969f2f027724Mark Andrews *p = '\0';
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence /*
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence * Open stream.
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence */
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence dir->handle = opendir(dirname);
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt if (dir->handle == NULL) {
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt return (isc__errno2result(errno));
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt }
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence return (result);
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence}
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein/*!
f8f8a5b3a33f581c6e209c7ded8168e7acc73dfbAutomatic Updater * \brief Return previously retrieved file or get next one.
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein
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 */
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrenceisc_result_t
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrenceisc_dir_read(isc_dir_t *dir) {
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence struct dirent *entry;
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence REQUIRE(VALID_DIR(dir) && dir->handle != NULL);
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence /*
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence * Fetch next file in directory.
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence */
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence entry = readdir(dir->handle);
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence if (entry == NULL)
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence return (ISC_R_NOMORE);
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence /*
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence * Make sure that the space for the name is long enough.
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence */
0307846c714477583e4e377a915829e5afe2ef38David Lawrence if (sizeof(dir->entry.name) <= strlen(entry->d_name))
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt return (ISC_R_UNEXPECTED);
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt strlcpy(dir->entry.name, entry->d_name, sizeof(dir->entry.name));
1c333c1415bd537463983f046100d170228590ddDavid Lawrence
1c333c1415bd537463983f046100d170228590ddDavid Lawrence /*
1c333c1415bd537463983f046100d170228590ddDavid Lawrence * Some dirents have d_namlen, but it is not portable.
1c333c1415bd537463983f046100d170228590ddDavid Lawrence */
1c333c1415bd537463983f046100d170228590ddDavid Lawrence dir->entry.length = strlen(entry->d_name);
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence return (ISC_R_SUCCESS);
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence}
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein/*!
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein * \brief Close directory stream.
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence */
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrencevoid
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrenceisc_dir_close(isc_dir_t *dir) {
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence REQUIRE(VALID_DIR(dir) && dir->handle != NULL);
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
0e1bef59f060f6442a93cb662b0313e8908500e1Bob Halley (void)closedir(dir->handle);
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence dir->handle = NULL;
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence}
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein/*!
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein * \brief Reposition directory stream at start.
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence */
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrenceisc_result_t
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrenceisc_dir_reset(isc_dir_t *dir) {
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence REQUIRE(VALID_DIR(dir) && dir->handle != NULL);
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence rewinddir(dir->handle);
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence return (ISC_R_SUCCESS);
49e558760e9c21a6b7c726ccf999a2711fd8eef9David Lawrence}
0e1bef59f060f6442a93cb662b0313e8908500e1Bob Halley
0e1bef59f060f6442a93cb662b0313e8908500e1Bob Halleyisc_result_t
0e1bef59f060f6442a93cb662b0313e8908500e1Bob Halleyisc_dir_chdir(const char *dirname) {
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein /*!
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein * \brief Change the current directory to 'dirname'.
0e1bef59f060f6442a93cb662b0313e8908500e1Bob Halley */
0e1bef59f060f6442a93cb662b0313e8908500e1Bob Halley
0e1bef59f060f6442a93cb662b0313e8908500e1Bob Halley REQUIRE(dirname != NULL);
0e1bef59f060f6442a93cb662b0313e8908500e1Bob Halley
0c73b546ecfa49b9d1c8fdb9a48d4cd62176124aDavid Lawrence if (chdir(dirname) < 0)
0c73b546ecfa49b9d1c8fdb9a48d4cd62176124aDavid Lawrence return (isc__errno2result(errno));
0e1bef59f060f6442a93cb662b0313e8908500e1Bob Halley
0e1bef59f060f6442a93cb662b0313e8908500e1Bob Halley return (ISC_R_SUCCESS);
0e1bef59f060f6442a93cb662b0313e8908500e1Bob Halley}
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence
fd50497bbea156911c10ab2cc5a932c30eb709a5Mark Andrewsisc_result_t
fd50497bbea156911c10ab2cc5a932c30eb709a5Mark Andrewsisc_dir_chroot(const char *dirname) {
a09e49f3f45386d7e12fce56724f1336a97207d6Evan Hunt#ifdef HAVE_CHROOT
a09e49f3f45386d7e12fce56724f1336a97207d6Evan Hunt void *tmp;
a09e49f3f45386d7e12fce56724f1336a97207d6Evan Hunt#endif
fd50497bbea156911c10ab2cc5a932c30eb709a5Mark Andrews
fd50497bbea156911c10ab2cc5a932c30eb709a5Mark Andrews REQUIRE(dirname != NULL);
fd50497bbea156911c10ab2cc5a932c30eb709a5Mark Andrews
9935447b51456f598b45246d0114b8006049244dMark Andrews#ifdef HAVE_CHROOT
4901f2c10b4393fd4407c8feb022c3415ab323c7Mark Andrews /*
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.
4901f2c10b4393fd4407c8feb022c3415ab323c7Mark Andrews */
a09e49f3f45386d7e12fce56724f1336a97207d6Evan Hunt tmp = getprotobyname("udp");
a09e49f3f45386d7e12fce56724f1336a97207d6Evan Hunt if (tmp != NULL)
a09e49f3f45386d7e12fce56724f1336a97207d6Evan Hunt (void) getservbyname("domain", "udp");
4901f2c10b4393fd4407c8feb022c3415ab323c7Mark Andrews
e502b133d630bda0ee64c1e2ce6729d96750d8abMark Andrews if (chroot(dirname) < 0 || chdir("/") < 0)
fd50497bbea156911c10ab2cc5a932c30eb709a5Mark Andrews return (isc__errno2result(errno));
fd50497bbea156911c10ab2cc5a932c30eb709a5Mark Andrews
fd50497bbea156911c10ab2cc5a932c30eb709a5Mark Andrews return (ISC_R_SUCCESS);
9935447b51456f598b45246d0114b8006049244dMark Andrews#else
9935447b51456f598b45246d0114b8006049244dMark Andrews return (ISC_R_NOTIMPLEMENTED);
9935447b51456f598b45246d0114b8006049244dMark Andrews#endif
fd50497bbea156911c10ab2cc5a932c30eb709a5Mark Andrews}
fd50497bbea156911c10ab2cc5a932c30eb709a5Mark Andrews
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrenceisc_result_t
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrenceisc_dir_createunique(char *templet) {
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence isc_result_t result;
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence char *x;
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence char *p;
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence int i;
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence int pid;
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence REQUIRE(templet != NULL);
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein /*!
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein * \brief mkdtemp is not portable, so this emulates it.
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence */
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence pid = getpid();
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence /*
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence * Replace trailing Xs with the process-id, zero-filled.
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence */
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence for (x = templet + strlen(templet) - 1; *x == 'X' && x >= templet;
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence x--, pid /= 10)
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence *x = pid % 10 + '0';
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence x++; /* Set x to start of ex-Xs. */
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence do {
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence i = mkdir(templet, 0700);
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence if (i == 0 || errno != EEXIST)
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence break;
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence /*
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence * The BSD algorithm.
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence */
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence p = x;
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence while (*p != '\0') {
450e48205fa8d7069efebd8426c5f7378fd3a907David Lawrence if (isdigit(*p & 0xff))
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence *p = 'a';
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence else if (*p != 'z')
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence ++*p;
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence else {
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence /*
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence * Reset character and move to next.
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence */
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence *p++ = 'a';
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence continue;
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence }
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence break;
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence }
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence if (*p == '\0') {
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence /*
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence * Tried all combinations. errno should already
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence * be EEXIST, but ensure it is anyway for
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence * isc__errno2result().
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence */
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence errno = EEXIST;
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence break;
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence }
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence } while (1);
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence if (i == -1)
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence result = isc__errno2result(errno);
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence else
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence result = ISC_R_SUCCESS;
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence return (result);
febf5f8b55abb2e6e840488a29a5ef4e20654f67David Lawrence}