summaryrefslogtreecommitdiff
path: root/usr.sbin/bind/lib/isc/win32/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/bind/lib/isc/win32/file.c')
-rw-r--r--usr.sbin/bind/lib/isc/win32/file.c490
1 files changed, 0 insertions, 490 deletions
diff --git a/usr.sbin/bind/lib/isc/win32/file.c b/usr.sbin/bind/lib/isc/win32/file.c
deleted file mode 100644
index 0c7f9525309..00000000000
--- a/usr.sbin/bind/lib/isc/win32/file.c
+++ /dev/null
@@ -1,490 +0,0 @@
-/*
- * Copyright (C) 2000-2002 Internet Software Consortium.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
- * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
- * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
- * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
- * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
- * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-/* $ISC: file.c,v 1.20.2.4 2002/03/26 00:55:11 marka Exp $ */
-
-#include <config.h>
-
-#undef rename
-#include <errno.h>
-#include <limits.h>
-#include <stdlib.h>
-#include <io.h>
-#include <process.h>
-
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/utime.h>
-
-#include <isc/file.h>
-#include <isc/result.h>
-#include <isc/time.h>
-#include <isc/util.h>
-#include <isc/stat.h>
-
-#include "errno2result.h"
-
-/*
- * Emulate UNIX mkstemp, which returns an open FD to the new file
- *
- */
-static int
-gettemp(char *path, int *doopen) {
- char *start, *trv;
- struct stat sbuf;
- int pid;
-
- trv = strrchr(path, 'X');
- trv++;
- pid = getpid();
- /* extra X's get set to 0's */
- while (*--trv == 'X') {
- *trv = (pid % 10) + '0';
- pid /= 10;
- }
- /*
- * check the target directory; if you have six X's and it
- * doesn't exist this runs for a *very* long time.
- */
- for (start = trv + 1;; --trv) {
- if (trv <= path)
- break;
- if (*trv == '\\') {
- *trv = '\0';
- if (stat(path, &sbuf))
- return (0);
- if (!S_ISDIR(sbuf.st_mode)) {
- errno = ENOTDIR;
- return (0);
- }
- *trv = '\\';
- break;
- }
- }
-
- for (;;) {
- if (doopen) {
- if ((*doopen =
- open(path, O_CREAT|O_EXCL|O_RDWR,
- _S_IREAD | _S_IWRITE)) >= 0)
- return (1);
- if (errno != EEXIST)
- return (0);
- } else if (stat(path, &sbuf))
- return (errno == ENOENT ? 1 : 0);
-
- /* tricky little algorithm for backward compatibility */
- for (trv = start;;) {
- if (!*trv)
- return (0);
- if (*trv == 'z')
- *trv++ = 'a';
- else {
- if (isdigit(*trv))
- *trv = 'a';
- else
- ++*trv;
- break;
- }
- }
- }
- /*NOTREACHED*/
-}
-
-static int
-mkstemp(char *path) {
- int fd;
-
- return (gettemp(path, &fd) ? fd : -1);
-}
-
-/*
- * XXXDCL As the API for accessing file statistics undoubtedly gets expanded,
- * it might be good to provide a mechanism that allows for the results
- * of a previous stat() to be used again without having to do another stat,
- * such as perl's mechanism of using "_" in place of a file name to indicate
- * that the results of the last stat should be used. But then you get into
- * annoying MP issues. BTW, Win32 has stat().
- */
-static isc_result_t
-file_stats(const char *file, struct stat *stats) {
- isc_result_t result = ISC_R_SUCCESS;
-
- REQUIRE(file != NULL);
- REQUIRE(stats != NULL);
-
- if (stat(file, stats) != 0)
- result = isc__errno2result(errno);
-
- return (result);
-}
-
-/*
- * isc_file_safemovefile is needed to be defined here to ensure that
- * any file with the new name is renamed to a backup name and then the
- * rename is done. If all goes well then the backup can be deleted,
- * otherwise it gets renamed back.
- */
-
-int
-isc_file_safemovefile(const char *oldname, const char *newname) {
- BOOL filestatus;
- char buf[512];
- struct stat sbuf;
- BOOL exists = FALSE;
- int tmpfd;
-
- /*
- * Make sure we have something to do
- */
- if (stat(oldname, &sbuf) != 0) {
- errno = ENOENT;
- return (-1);
- }
-
- /*
- * Rename to a backup the new file if it still exists
- */
- if (stat(newname, &sbuf) == 0) {
- exists = TRUE;
- strcpy(buf, newname);
- strcat(buf, ".XXXXX");
- tmpfd = mkstemp(buf);
- if (tmpfd > 0)
- _close(tmpfd);
- DeleteFile(buf);
- _chmod(newname, _S_IREAD | _S_IWRITE);
-
- filestatus = MoveFile(newname, buf);
- }
- /* Now rename the file to the new name
- */
- _chmod(oldname, _S_IREAD | _S_IWRITE);
-
- filestatus = MoveFile(oldname, newname);
- if (filestatus == 0) {
- /*
- * Try to rename the backup back to the original name
- * if the backup got created
- */
- if (exists == TRUE) {
- filestatus = MoveFile(buf, newname);
- if (filestatus == 0) {
- errno = EACCES;
- }
- }
- return (-1);
- }
-
- /*
- * Delete the backup file if it got created
- */
- if (exists == TRUE)
- filestatus = DeleteFile(buf);
- return (0);
-}
-
-isc_result_t
-isc_file_getmodtime(const char *file, isc_time_t *time) {
- int fh;
-
- REQUIRE(file != NULL);
- REQUIRE(time != NULL);
-
- if ((fh = open(file, _O_RDONLY | _O_BINARY)) < 0)
- return (isc__errno2result(errno));
-
- if (!GetFileTime((HANDLE) _get_osfhandle(fh),
- NULL,
- NULL,
- &time->absolute))
- {
- close(fh);
- errno = EINVAL;
- return (isc__errno2result(errno));
- }
- close(fh);
- return (ISC_R_SUCCESS);
-}
-
-isc_result_t
-isc_file_settime(const char *file, isc_time_t *time) {
- int fh;
-
- REQUIRE(file != NULL && time != NULL);
-
- if ((fh = open(file, _O_RDWR | _O_BINARY)) < 0)
- return (isc__errno2result(errno));
-
- /*
- * Set the date via the filedate system call and return. Failing
- * this call implies the new file times are not supported by the
- * underlying file system.
- */
- if (!SetFileTime((HANDLE) _get_osfhandle(fh),
- NULL,
- &time->absolute,
- &time->absolute))
- {
- close(fh);
- errno = EINVAL;
- return (isc__errno2result(errno));
- }
-
- close(fh);
- return (ISC_R_SUCCESS);
-
-}
-
-#undef TEMPLATE
-#define TEMPLATE "XXXXXXXXXX.tmp" /* 14 characters. */
-
-isc_result_t
-isc_file_mktemplate(const char *path, char *buf, size_t buflen) {
- return (isc_file_template(path, TEMPLATE, buf, buflen));
-}
-
-isc_result_t
-isc_file_template(const char *path, const char *templet, char *buf,
- size_t buflen) {
- char *s;
-
- REQUIRE(path != NULL);
- REQUIRE(templet != NULL);
- REQUIRE(buf != NULL);
-
- s = strrchr(templet, '\\');
- if (s != NULL)
- templet = s + 1;
-
- s = strrchr(path, '\\');
-
- if (s != NULL) {
- if ((s - path + 1 + strlen(templet) + 1) > buflen)
- return (ISC_R_NOSPACE);
-
- strncpy(buf, path, s - path + 1);
- buf[s - path + 1] = '\0';
- strcat(buf, templet);
- } else {
- if ((strlen(templet) + 1) > buflen)
- return (ISC_R_NOSPACE);
-
- strcpy(buf, templet);
- }
-
- return (ISC_R_SUCCESS);
-}
-
-isc_result_t
-isc_file_renameunique(const char *file, char *templet) {
- int fd = -1;
- int res = 0;
- isc_result_t result = ISC_R_SUCCESS;
-
- REQUIRE(file != NULL);
- REQUIRE(templet != NULL);
-
- fd = mkstemp(templet);
- if (fd == -1)
- result = isc__errno2result(errno);
- else
- close(fd);
-
- if (result == ISC_R_SUCCESS) {
- res = isc_file_safemovefile(file, templet);
- if (res != 0) {
- result = isc__errno2result(errno);
- (void)unlink(templet);
- }
- }
- return (result);
-}
-
-isc_result_t
-isc_file_openunique(char *templet, FILE **fp) {
- int fd;
- FILE *f;
- isc_result_t result = ISC_R_SUCCESS;
-
- REQUIRE(templet != NULL);
- REQUIRE(fp != NULL && *fp == NULL);
-
- /*
- * Win32 does not have mkstemp. Using emulation above.
- */
- fd = mkstemp(templet);
-
- if (fd == -1)
- result = isc__errno2result(errno);
- if (result == ISC_R_SUCCESS) {
- f = fdopen(fd, "w+");
- if (f == NULL) {
- result = isc__errno2result(errno);
- (void)remove(templet);
- (void)close(fd);
- } else
- *fp = f;
- }
-
- return (result);
-}
-
-isc_result_t
-isc_file_remove(const char *filename) {
- int r;
-
- REQUIRE(filename != NULL);
-
- r = unlink(filename);
- if (r == 0)
- return (ISC_R_SUCCESS);
- else
- return (isc__errno2result(errno));
-}
-
-isc_result_t
-isc_file_rename(const char *oldname, const char *newname) {
- int r;
-
- REQUIRE(oldname != NULL);
- REQUIRE(newname != NULL);
-
- r = isc_file_safemovefile(oldname, newname);
- if (r == 0)
- return (ISC_R_SUCCESS);
- else
- return (isc__errno2result(errno));
-}
-
-isc_boolean_t
-isc_file_exists(const char *pathname) {
- struct stat stats;
-
- REQUIRE(pathname != NULL);
-
- return (ISC_TF(file_stats(pathname, &stats) == ISC_R_SUCCESS));
-}
-
-isc_boolean_t
-isc_file_isabsolute(const char *filename) {
- REQUIRE(filename != NULL);
- /*
- * Look for c:\path\... style, c:/path/... or \\computer\shar\path...
- * the UNC style file specs
- */
- if ((filename[0] == '\\') && (filename[1] == '\\'))
- return (ISC_TRUE);
- if (isalpha(filename[0]) && filename[1] == ':' && filename[2] == '\\')
- return (ISC_TRUE);
- if (isalpha(filename[0]) && filename[1] == ':' && filename[2] == '/')
- return (ISC_TRUE);
- return (ISC_FALSE);
-}
-
-isc_boolean_t
-isc_file_iscurrentdir(const char *filename) {
- REQUIRE(filename != NULL);
- return (ISC_TF(filename[0] == '.' && filename[1] == '\0'));
-}
-
-isc_boolean_t
-isc_file_ischdiridempotent(const char *filename) {
- REQUIRE(filename != NULL);
-
- if (isc_file_isabsolute(filename))
- return (ISC_TRUE);
- if (filename[0] == '\\')
- return (ISC_TRUE);
- if (filename[0] == '/')
- return (ISC_TRUE);
- if (isc_file_iscurrentdir(filename))
- return (ISC_TRUE);
- return (ISC_FALSE);
-}
-
-const char *
-isc_file_basename(const char *filename) {
- char *s;
-
- REQUIRE(filename != NULL);
-
- s = strrchr(filename, '\\');
- if (s == NULL)
- return (filename);
- return (s + 1);
-}
-
-isc_result_t
-isc_file_progname(const char *filename, char *progname, size_t namelen) {
- const char *s;
- char *p;
- size_t len;
-
- REQUIRE(filename != NULL);
- REQUIRE(progname != NULL);
-
- /*
- * Strip the path from the name
- */
- s = isc_file_basename(filename);
- if (s == NULL) {
- return (ISC_R_NOSPACE);
- }
-
- /*
- * Strip any and all suffixes
- */
- p = strchr(s, '.');
- if (p == NULL) {
- if (namelen <= strlen(s))
- return (ISC_R_NOSPACE);
-
- strcpy(progname, s);
- return (ISC_R_SUCCESS);
- }
-
- /*
- * Copy the result to the buffer
- */
- len = p - s;
- if (len >= namelen)
- return (ISC_R_NOSPACE);
-
- strncpy(progname, s, len);
- progname[len] = '\0';
- return (ISC_R_SUCCESS);
-}
-
-isc_result_t
-isc_file_absolutepath(const char *filename, char *path, size_t pathlen) {
- char *ptrname;
- DWORD retval;
-
- REQUIRE(filename != NULL);
- REQUIRE(path != NULL);
-
- retval = GetFullPathName(filename, pathlen, path, &ptrname);
-
- /* Something went wrong in getting the path */
- if (retval == 0)
- return (ISC_R_NOTFOUND);
- /* Caller needs to provide a larger buffer to contain the string */
- if (retval >= pathlen)
- return (ISC_R_NOSPACE);
- return (ISC_R_SUCCESS);
-}