00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "db_config.h"
00011
00012 #ifndef NO_SYSTEM_INCLUDES
00013 #include <sys/types.h>
00014
00015 #include <string.h>
00016 #endif
00017
00018 #include "db_int.h"
00019
00020
00021
00022
00023
00024 int
00025 __os_region_unlink(dbenv, path)
00026 DB_ENV *dbenv;
00027 const char *path;
00028 {
00029 if (F_ISSET(dbenv, DB_ENV_OVERWRITE))
00030 (void)__db_file_multi_write(dbenv, path);
00031
00032 return (__os_unlink(dbenv, path));
00033 }
00034
00035
00036
00037
00038
00039
00040
00041 int
00042 __os_unlink(dbenv, path)
00043 DB_ENV *dbenv;
00044 const char *path;
00045 {
00046 HANDLE h;
00047 _TCHAR *tpath, *orig_tpath, buf[MAXPATHLEN];
00048 u_int32_t id;
00049 int ret;
00050
00051 if (DB_GLOBAL(j_unlink) != NULL) {
00052 ret = DB_GLOBAL(j_unlink)(path);
00053 goto done;
00054 }
00055
00056 TO_TSTRING(dbenv, path, tpath, ret);
00057 if (ret != 0)
00058 return (ret);
00059 orig_tpath = tpath;
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 if (__os_is_winnt()) {
00077 __os_unique_id(dbenv, &id);
00078 _sntprintf(buf, MAXPATHLEN, _T("%s.del.%010u"), tpath, id);
00079 if (MoveFile(tpath, buf))
00080 tpath = buf;
00081 else if (__os_get_errno() != ENOENT)
00082 __db_err(dbenv,
00083 "unlink: rename %s to temporary file failed", path);
00084
00085
00086
00087
00088
00089 h = CreateFile(tpath, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING,
00090 FILE_FLAG_DELETE_ON_CLOSE, 0);
00091 if (h != INVALID_HANDLE_VALUE) {
00092 (void)CloseHandle (h);
00093 if (GetFileAttributes(tpath) == INVALID_FILE_ATTRIBUTES)
00094 goto skipdel;
00095 }
00096 }
00097
00098 RETRY_CHK((!DeleteFile(tpath)), ret);
00099
00100 skipdel:
00101 FREE_STRING(dbenv, orig_tpath);
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111 done: if (ret != 0 && ret != ENOENT)
00112 __db_err(dbenv, "unlink: %s: %s", path, strerror(ret));
00113
00114 return (ret);
00115 }