#define MAX_GET_SD_ACCESS_DENIED_WARNINGS 1
#define MAX_GET_SACL_PRIV_NOTHELD_WARNINGS 1
#define MAX_CREATE_HARD_LINK_WARNINGS 5
+#define MAX_CREATE_SOFT_LINK_WARNINGS 5
struct win32_capture_state {
unsigned long num_get_sd_access_denied;
unsigned long num_get_sacl_priv_notheld;
const struct wim_inode *inode,
const struct wim_lookup_table_entry *lte,
const wchar_t *path,
- const struct apply_args *args)
+ struct apply_args *args)
{
int ret;
u8 rpbuf[REPARSE_POINT_MAX_SIZE];
NULL /* lpOverlapped */))
{
DWORD err = GetLastError();
- ERROR("Failed to set reparse data on \"%ls\"", path);
- win32_error(err);
if (err == ERROR_ACCESS_DENIED || err == ERROR_PRIVILEGE_NOT_HELD)
- return WIMLIB_ERR_INSUFFICIENT_PRIVILEGES_TO_EXTRACT;
- else if (inode->i_reparse_tag == WIM_IO_REPARSE_TAG_SYMLINK ||
- inode->i_reparse_tag == WIM_IO_REPARSE_TAG_MOUNT_POINT)
- return WIMLIB_ERR_LINK;
- else
- return WIMLIB_ERR_WRITE;
+ {
+ args->num_soft_links_failed++;
+ if (args->num_soft_links_failed <= MAX_CREATE_SOFT_LINK_WARNINGS) {
+ WARNING("Can't set reparse data on \"%ls\": Access denied!\n"
+ " You may be trying to extract a symbolic "
+ "link without the\n"
+ " SeCreateSymbolicLink privilege, which by "
+ "default non-Administrator\n"
+ " accounts do not have.", path);
+ }
+ if (args->num_hard_links_failed == MAX_CREATE_HARD_LINK_WARNINGS) {
+ WARNING("Suppressing further warnings regarding failure to extract\n"
+ " reparse points due to insufficient privileges...");
+ }
+ } else {
+ ERROR("Failed to set reparse data on \"%ls\"", path);
+ win32_error(err);
+ if (inode->i_reparse_tag == WIM_IO_REPARSE_TAG_SYMLINK ||
+ inode->i_reparse_tag == WIM_IO_REPARSE_TAG_MOUNT_POINT)
+ return WIMLIB_ERR_LINK;
+ else
+ return WIMLIB_ERR_WRITE;
+ }
}
return 0;
}
return WIMLIB_ERR_LINK;
} else {
args->num_hard_links_failed++;
- if (args->num_hard_links_failed < MAX_CREATE_HARD_LINK_WARNINGS) {
+ if (args->num_hard_links_failed <= MAX_CREATE_HARD_LINK_WARNINGS) {
WARNING("Can't create hard link \"%ls => %ls\":\n"
" Volume does not support hard links!\n"
" Falling back to extracting a copy of the file.",
output_path, inode->i_extracted_file);
- } else if (args->num_hard_links_failed == MAX_CREATE_HARD_LINK_WARNINGS) {
+ }
+ if (args->num_hard_links_failed == MAX_CREATE_HARD_LINK_WARNINGS) {
WARNING("Suppressing further hard linking warnings...");
}
return -1;
int
win32_do_apply_dentry_timestamps(const wchar_t *path,
size_t path_num_chars,
- const struct wim_dentry *dentry,
- const struct apply_args *args)
+ struct wim_dentry *dentry,
+ struct apply_args *args)
{
DWORD err;
HANDLE h;
int
fsync(int fd)
{
- DWORD err;
HANDLE h;
h = (HANDLE)_get_osfhandle(fd);
extern ssize_t
win32_writev(int fd, const struct iovec *iov, int iovcnt)
{
- size_t total_bytes_written = 0;
- for (int i = 0; i < iovcnt; i++) {
- size_t bytes_written;
+ ssize_t total_bytes_written = 0;
- bytes_written = full_write(fd, iov[i].iov_base, iov[i].iov_len);
- total_bytes_written += bytes_written;
- if (bytes_written != iov[i].iov_len)
+ if (iovcnt <= 0) {
+ errno = EINVAL;
+ return -1;
+ }
+ for (int i = 0; i < iovcnt; i++) {
+ ssize_t bytes_written;
+
+ bytes_written = write(fd, iov[i].iov_base, iov[i].iov_len);
+ if (bytes_written >= 0)
+ total_bytes_written += bytes_written;
+ if (bytes_written != iov[i].iov_len) {
+ if (total_bytes_written == 0)
+ total_bytes_written = -1;
break;
+ }
}
return total_bytes_written;
}