write_resource_flags = write_flags_to_resource_flags(write_flags);
- /* wimlib v1.6.3: pack streams by default if the WIM version has been
+ /* wimlib v1.7.0: pack streams by default if the WIM version has been
* set to WIM_VERSION_PACKED_STREAMS and at least one stream in the
* WIM's lookup table is located in a packed resource (may be the same
* WIM, or a different one in the case of export). */
}
#if defined(HAVE_SYS_FILE_H) && defined(HAVE_FLOCK)
+
+/* Set advisory lock on WIM file (if not already done so) */
int
-lock_wim(WIMStruct *wim, int fd)
+lock_wim_for_append(WIMStruct *wim)
{
- int ret = 0;
- if (fd != -1 && !wim->wim_locked) {
- ret = flock(fd, LOCK_EX | LOCK_NB);
- if (ret != 0) {
- if (errno == EWOULDBLOCK) {
- ERROR("`%"TS"' is already being modified or has been "
- "mounted read-write\n"
- " by another process!", wim->filename);
- ret = WIMLIB_ERR_ALREADY_LOCKED;
- } else {
- WARNING_WITH_ERRNO("Failed to lock `%"TS"'",
- wim->filename);
- ret = 0;
- }
- } else {
- wim->wim_locked = 1;
- }
+ if (wim->locked_for_append)
+ return 0;
+ if (!flock(wim->in_fd.fd, LOCK_EX | LOCK_NB)) {
+ wim->locked_for_append = 1;
+ return 0;
+ }
+ if (errno != EWOULDBLOCK)
+ return 0;
+ return WIMLIB_ERR_ALREADY_LOCKED;
+}
+
+/* Remove advisory lock on WIM file (if present) */
+void
+unlock_wim_for_append(WIMStruct *wim)
+{
+ if (wim->locked_for_append) {
+ flock(wim->in_fd.fd, LOCK_UN);
+ wim->locked_for_append = 0;
}
- return ret;
}
#endif
if (ret)
goto out_restore_memory_hdr;
- ret = lock_wim(wim, wim->out_fd.fd);
+ ret = lock_wim_for_append(wim);
if (ret)
goto out_close_wim;
if (ret)
goto out_truncate;
- wim->wim_locked = 0;
+ unlock_wim_for_append(wim);
return 0;
out_truncate:
out_restore_physical_hdr:
(void)write_wim_header_flags(hdr_save.flags, &wim->out_fd);
out_unlock_wim:
- wim->wim_locked = 0;
+ unlock_wim_for_append(wim);
out_close_wim:
(void)close_wim_writable(wim, write_flags);
out_restore_memory_hdr: