unsigned long long offset,
unsigned long long length,
int flags,
- int mode)
+ int mode,
+ bool delete)
{
int fd = -1;
int fds[2] = { -1, -1 };
int errfd = -1;
pid_t pid = 0;
- VIR_DEBUG("st=%p path=%s flags=%d offset=%llu length=%llu mode=%d",
- st, path, flags, offset, length, mode);
+ VIR_DEBUG("st=%p path=%s flags=%d offset=%llu length=%llu mode=%d delete=%d",
+ st, path, flags, offset, length, mode, delete);
if (flags & O_CREAT)
fd = open(path, flags, mode);
virCommandAddArgFormat(cmd, "%d", mode);
virCommandAddArgFormat(cmd, "%llu", offset);
virCommandAddArgFormat(cmd, "%llu", length);
+ virCommandAddArgFormat(cmd, "%u", delete);
+
+ /* when running iohelper we don't want to delete file now,
+ * because a race condition may occur in which we delete it
+ * before iohelper even opens it. We want iohelper to remove
+ * the file instead.
+ */
+ delete = false;
if (flags == O_RDONLY) {
childfd = fds[1];
if (virFDStreamOpenInternal(st, fd, cmd, errfd, length) < 0)
goto error;
+ if (delete)
+ unlink(path);
+
return 0;
error:
const char *path,
unsigned long long offset,
unsigned long long length,
- int flags)
+ int flags,
+ bool delete)
{
if (flags & O_CREAT) {
streamsReportError(VIR_ERR_INTERNAL_ERROR,
}
return virFDStreamOpenFileInternal(st, path,
offset, length,
- flags, 0);
+ flags, 0, delete);
}
int virFDStreamCreateFile(virStreamPtr st,
unsigned long long offset,
unsigned long long length,
int flags,
- mode_t mode)
+ mode_t mode,
+ bool delete)
{
return virFDStreamOpenFileInternal(st, path,
offset, length,
- flags | O_CREAT, mode);
+ flags | O_CREAT,
+ mode, delete);
}
const char *path,
unsigned long long offset,
unsigned long long length,
- int flags);
+ int flags,
+ bool delete);
int virFDStreamCreateFile(virStreamPtr st,
const char *path,
unsigned long long offset,
unsigned long long length,
int flags,
- mode_t mode);
+ mode_t mode,
+ bool delete);
#endif /* __VIR_FDSTREAM_H_ */
goto cleanup;
}
- if (virFDStreamOpenFile(st, chr->source.data.file.path, 0, 0, O_RDWR) < 0)
+ if (virFDStreamOpenFile(st, chr->source.data.file.path,
+ 0, 0, O_RDWR, false) < 0)
goto cleanup;
ret = 0;
goto cleanup;
}
- if (virFDStreamOpenFile(st, chr->source.data.file.path, 0, 0, O_RDWR) < 0)
+ if (virFDStreamOpenFile(st, chr->source.data.file.path,
+ 0, 0, O_RDWR, false) < 0)
goto cleanup;
ret = 0;
if (virFDStreamOpenFile(stream,
vol->target.path,
offset, length,
- O_RDONLY) < 0)
+ O_RDONLY, false) < 0)
goto out;
ret = 0;
if (virFDStreamOpenFile(stream,
vol->target.path,
offset, length,
- O_WRONLY) < 0)
+ O_WRONLY, false) < 0)
goto out;
ret = 0;
goto cleanup;
}
- if (virFDStreamOpenFile(st, chr->source.data.file.path, 0, 0, O_RDWR) < 0)
+ if (virFDStreamOpenFile(st, chr->source.data.file.path,
+ 0, 0, O_RDWR, false) < 0)
goto cleanup;
ret = 0;
unsigned long long length;
int flags;
int mode;
+ unsigned int delete;
if (setlocale(LC_ALL, "") == NULL ||
bindtextdomain(PACKAGE, LOCALEDIR) == NULL ||
exit(EXIT_FAILURE);
}
- if (argc != 6) {
- fprintf(stderr, _("%s: syntax FILENAME FLAGS MODE OFFSET LENGTH\n"), argv[0]);
+ if (argc != 7) {
+ fprintf(stderr, _("%s: syntax FILENAME FLAGS MODE OFFSET LENGTH DELETE\n"), argv[0]);
exit(EXIT_FAILURE);
}
fprintf(stderr, _("%s: malformed file length %s"), argv[0], argv[5]);
exit(EXIT_FAILURE);
}
+ if (virStrToLong_ui(argv[6], NULL, 10, &delete) < 0) {
+ fprintf(stderr, _("%s: malformed delete flag %s"), argv[0],argv[6]);
+ exit(EXIT_FAILURE);
+ }
if (runIO(path, flags, mode, offset, length) < 0)
goto error;
+ if (delete)
+ unlink(path);
+
return 0;
error:
goto cleanup;
}
- if (virFDStreamOpenFile(st, chr->source.data.file.path, 0, 0, O_RDWR) < 0)
+ if (virFDStreamOpenFile(st, chr->source.data.file.path,
+ 0, 0, O_RDWR, false) < 0)
goto cleanup;
ret = 0;