#include <errno.h>
#include <fcntl.h>
+#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include "wimlib/endianness.h"
#include "wimlib/error.h"
#include "wimlib/metadata.h"
+#include "wimlib/object_id.h"
#include "wimlib/pathlist.h"
#include "wimlib/paths.h"
#include "wimlib/pattern.h"
create_temporary_file(struct filedes *fd_ret, tchar **name_ret)
{
tchar *name;
- int open_flags;
int raw_fd;
+#ifdef __WIN32__
retry:
- name = ttempnam(NULL, T("wimlib"));
+ name = _wtempnam(NULL, L"wimlib");
if (!name) {
ERROR_WITH_ERRNO("Failed to create temporary filename");
return WIMLIB_ERR_NOMEM;
}
-
- open_flags = O_WRONLY | O_CREAT | O_EXCL | O_BINARY;
-#ifdef __WIN32__
- open_flags |= _O_SHORT_LIVED;
-#endif
- raw_fd = topen(name, open_flags, 0600);
+ raw_fd = _wopen(name, O_WRONLY | O_CREAT | O_EXCL | O_BINARY |
+ _O_SHORT_LIVED, 0600);
+ if (raw_fd < 0 && errno == EEXIST) {
+ FREE(name);
+ goto retry;
+ }
+#else /* __WIN32__ */
+ const char *tmpdir = getenv("TMPDIR");
+ if (!tmpdir)
+ tmpdir = P_tmpdir;
+ name = MALLOC(strlen(tmpdir) + 1 + 6 + 6 + 1);
+ if (!name)
+ return WIMLIB_ERR_NOMEM;
+ sprintf(name, "%s/wimlibXXXXXX", tmpdir);
+ raw_fd = mkstemp(name);
+#endif /* !__WIN32__ */
if (raw_fd < 0) {
- if (errno == EEXIST) {
- FREE(name);
- goto retry;
- }
ERROR_WITH_ERRNO("Failed to create temporary file "
"\"%"TS"\"", name);
FREE(name);
features->security_descriptors++;
if (inode_has_unix_data(inode))
features->unix_data++;
+ if (inode_has_object_id(inode))
+ features->object_ids++;
}
/* Tally features necessary to extract a dentry and the corresponding inode. */
required_features->unix_data);
}
+ /* Object IDs. */
+ if (required_features->object_ids && !supported_features->object_ids) {
+ WARNING("Ignoring object IDs of %lu files",
+ required_features->object_ids);
+ }
+
/* DOS Names. */
if (required_features->short_names &&
!supported_features->short_names)