file.c revision ec5347e2c775f027573ce5648b910361aa926c01
/*
* Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2002 Internet Software Consortium.
*
* 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 ISC DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS. IN NO EVENT SHALL ISC 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.
*/
/* $Id: file.c,v 1.30 2007/06/18 23:47:49 tbox Exp $ */
#include <config.h>
#include <errno.h>
#include <limits.h>
#include <stdlib.h>
#include <io.h>
#include <process.h>
#include <fcntl.h>
#include "errno2result.h"
/*
* Emulate UNIX mkstemp, which returns an open FD to the new file
*
*/
static int
int pid;
trv++;
/* extra X's get set to 0's */
while (*--trv == 'X') {
pid /= 10;
}
/*
* check the target directory; if you have six X's and it
* doesn't exist this runs for a *very* long time.
*/
break;
if (*trv == '\\') {
*trv = '\0';
return (0);
return (0);
}
*trv = '\\';
break;
}
}
for (;;) {
if (doopen) {
if ((*doopen =
return (1);
return (0);
/* tricky little algorithm for backward compatibility */
if (!*trv)
return (0);
if (*trv == 'z')
*trv++ = 'a';
else {
*trv = 'a';
else
++*trv;
break;
}
}
}
/*NOTREACHED*/
}
static int
int fd;
}
/*
* 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
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
char buf[512];
int tmpfd;
/*
* Make sure we have something to do
*/
return (-1);
}
/*
* Rename to a backup the new file if it still exists
*/
if (tmpfd > 0)
}
/* Now rename the file to the new name
*/
if (filestatus == 0) {
/*
* Try to rename the backup back to the original name
* if the backup got created
*/
if (filestatus == 0)
}
return (-1);
}
/*
* Delete the backup file if it got created
*/
return (0);
}
int fh;
return (isc__errno2result(errno));
NULL,
NULL,
{
return (isc__errno2result(errno));
}
return (ISC_R_SUCCESS);
}
int fh;
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.
*/
NULL,
{
return (isc__errno2result(errno));
}
return (ISC_R_SUCCESS);
}
}
char *s;
if (s != NULL)
templet = s + 1;
if (s != NULL) {
return (ISC_R_NOSPACE);
} else {
return (ISC_R_NOSPACE);
}
return (ISC_R_SUCCESS);
}
int fd = -1;
int res = 0;
if (fd == -1)
else
if (result == ISC_R_SUCCESS) {
if (res != 0) {
}
}
return (result);
}
int fd;
FILE *f;
/*
* Win32 does not have mkstemp. Using emulation above.
*/
if (fd == -1)
if (result == ISC_R_SUCCESS) {
if (f == NULL) {
} else
*fp = f;
}
return (result);
}
isc_file_remove(const char *filename) {
int r;
if (r == 0)
return (ISC_R_SUCCESS);
else
return (isc__errno2result(errno));
}
int r;
if (r == 0)
return (ISC_R_SUCCESS);
else
return (isc__errno2result(errno));
}
isc_file_exists(const char *pathname) {
}
isc_file_isabsolute(const char *filename) {
/*
* Look for c:\path\... style, c:/path/... or \\computer\shar\path...
* the UNC style file specs
*/
return (ISC_TRUE);
return (ISC_TRUE);
return (ISC_TRUE);
return (ISC_FALSE);
}
isc_file_iscurrentdir(const char *filename) {
}
isc_file_ischdiridempotent(const char *filename) {
if (isc_file_isabsolute(filename))
return (ISC_TRUE);
if (filename[0] == '\\')
return (ISC_TRUE);
if (filename[0] == '/')
return (ISC_TRUE);
return (ISC_TRUE);
return (ISC_FALSE);
}
const char *
isc_file_basename(const char *filename) {
char *s;
if (s == NULL)
return (filename);
return (s + 1);
}
const char *s;
char *p;
/*
* 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) {
return (ISC_R_NOSPACE);
return (ISC_R_SUCCESS);
}
/*
* Copy the result to the buffer
*/
len = p - s;
return (ISC_R_NOSPACE);
return (ISC_R_SUCCESS);
}
char *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 */
return (ISC_R_NOSPACE);
return (ISC_R_SUCCESS);
}
int fh;
return (isc__errno2result(errno));
return (isc__errno2result(errno));
}
return (ISC_R_SUCCESS);
}