|
@@ -18,6 +18,7 @@
|
|
|
|
|
|
|
|
static char *tmpdir = NULL;
|
|
static char *tmpdir = NULL;
|
|
|
static unsigned int count;
|
|
static unsigned int count;
|
|
|
|
|
+bool tools_verbose = false;
|
|
|
|
|
|
|
|
/* Ten minutes. */
|
|
/* Ten minutes. */
|
|
|
const unsigned int default_timeout_ms = 10 * 60 * 1000;
|
|
const unsigned int default_timeout_ms = 10 * 60 * 1000;
|
|
@@ -77,6 +78,9 @@ char *run_with_timeout(const void *ctx, const char *cmd,
|
|
|
return talloc_asprintf(ctx, "Failed to create pipe: %s",
|
|
return talloc_asprintf(ctx, "Failed to create pipe: %s",
|
|
|
strerror(errno));
|
|
strerror(errno));
|
|
|
|
|
|
|
|
|
|
+ if (tools_verbose)
|
|
|
|
|
+ printf("Running: %s\n", cmd);
|
|
|
|
|
+
|
|
|
gettimeofday(&start, NULL);
|
|
gettimeofday(&start, NULL);
|
|
|
pid = fork();
|
|
pid = fork();
|
|
|
if (pid == -1) {
|
|
if (pid == -1) {
|
|
@@ -128,6 +132,13 @@ char *run_with_timeout(const void *ctx, const char *cmd,
|
|
|
else
|
|
else
|
|
|
*timeout_ms -= ms;
|
|
*timeout_ms -= ms;
|
|
|
|
|
|
|
|
|
|
+ if (tools_verbose) {
|
|
|
|
|
+ printf("%s", ret);
|
|
|
|
|
+ printf("Finished: %u ms, %s %u\n", ms,
|
|
|
|
|
+ WIFEXITED(status) ? "exit status" : "killed by signal",
|
|
|
|
|
+ WIFEXITED(status) ? WEXITSTATUS(status)
|
|
|
|
|
+ : WTERMSIG(status));
|
|
|
|
|
+ }
|
|
|
*ok = (WIFEXITED(status) && WEXITSTATUS(status) == 0);
|
|
*ok = (WIFEXITED(status) && WEXITSTATUS(status) == 0);
|
|
|
return ret;
|
|
return ret;
|
|
|
}
|
|
}
|
|
@@ -167,6 +178,8 @@ static int unlink_all(char *dir)
|
|
|
{
|
|
{
|
|
|
char cmd[strlen(dir) + sizeof("rm -rf ")];
|
|
char cmd[strlen(dir) + sizeof("rm -rf ")];
|
|
|
sprintf(cmd, "rm -rf %s", dir);
|
|
sprintf(cmd, "rm -rf %s", dir);
|
|
|
|
|
+ if (tools_verbose)
|
|
|
|
|
+ printf("Running: %s\n", cmd);
|
|
|
if (system(cmd) != 0)
|
|
if (system(cmd) != 0)
|
|
|
warn("Could not remove temporary work in %s", dir);
|
|
warn("Could not remove temporary work in %s", dir);
|
|
|
return 0;
|
|
return 0;
|
|
@@ -192,25 +205,34 @@ char *temp_dir(const void *ctx)
|
|
|
}
|
|
}
|
|
|
talloc_set_destructor(tmpdir, unlink_all);
|
|
talloc_set_destructor(tmpdir, unlink_all);
|
|
|
}
|
|
}
|
|
|
|
|
+ if (tools_verbose)
|
|
|
|
|
+ printf("Created temporary directory %s\n", tmpdir);
|
|
|
return tmpdir;
|
|
return tmpdir;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
char *temp_file(const void *ctx, const char *extension)
|
|
char *temp_file(const void *ctx, const char *extension)
|
|
|
{
|
|
{
|
|
|
- return talloc_asprintf(ctx, "%s/%u%s",
|
|
|
|
|
- temp_dir(ctx), count++, extension);
|
|
|
|
|
|
|
+ char *f = talloc_asprintf(ctx, "%s/%u%s",
|
|
|
|
|
+ temp_dir(ctx), count++, extension);
|
|
|
|
|
+ if (tools_verbose)
|
|
|
|
|
+ printf("Created temporary file %s\n", f);
|
|
|
|
|
+ return f;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
char *maybe_temp_file(const void *ctx, const char *extension, bool keep,
|
|
char *maybe_temp_file(const void *ctx, const char *extension, bool keep,
|
|
|
const char *srcname)
|
|
const char *srcname)
|
|
|
{
|
|
{
|
|
|
size_t baselen;
|
|
size_t baselen;
|
|
|
|
|
+ char *f;
|
|
|
|
|
|
|
|
if (!keep)
|
|
if (!keep)
|
|
|
return temp_file(ctx, extension);
|
|
return temp_file(ctx, extension);
|
|
|
|
|
|
|
|
baselen = strrchr(srcname, '.') - srcname;
|
|
baselen = strrchr(srcname, '.') - srcname;
|
|
|
- return talloc_asprintf(ctx, "%.*s%s", baselen, srcname, extension);
|
|
|
|
|
|
|
+ f = talloc_asprintf(ctx, "%.*s%s", baselen, srcname, extension);
|
|
|
|
|
+ if (tools_verbose)
|
|
|
|
|
+ printf("Creating file %s\n", f);
|
|
|
|
|
+ return f;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
bool move_file(const char *oldname, const char *newname)
|
|
bool move_file(const char *oldname, const char *newname)
|
|
@@ -220,17 +242,28 @@ bool move_file(const char *oldname, const char *newname)
|
|
|
int fd;
|
|
int fd;
|
|
|
bool ret;
|
|
bool ret;
|
|
|
|
|
|
|
|
|
|
+ if (tools_verbose)
|
|
|
|
|
+ printf("Moving file %s to %s: ", oldname, newname);
|
|
|
|
|
+
|
|
|
/* Simple case: rename works. */
|
|
/* Simple case: rename works. */
|
|
|
- if (rename(oldname, newname) == 0)
|
|
|
|
|
|
|
+ if (rename(oldname, newname) == 0) {
|
|
|
|
|
+ if (tools_verbose)
|
|
|
|
|
+ printf("rename worked\n");
|
|
|
return true;
|
|
return true;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
/* Try copy and delete: not atomic! */
|
|
/* Try copy and delete: not atomic! */
|
|
|
contents = grab_file(NULL, oldname, &size);
|
|
contents = grab_file(NULL, oldname, &size);
|
|
|
- if (!contents)
|
|
|
|
|
|
|
+ if (!contents) {
|
|
|
|
|
+ if (tools_verbose)
|
|
|
|
|
+ printf("read failed: %s\n", strerror(errno));
|
|
|
return false;
|
|
return false;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
fd = open(newname, O_WRONLY|O_CREAT|O_TRUNC, 0666);
|
|
fd = open(newname, O_WRONLY|O_CREAT|O_TRUNC, 0666);
|
|
|
if (fd < 0) {
|
|
if (fd < 0) {
|
|
|
|
|
+ if (tools_verbose)
|
|
|
|
|
+ printf("output open failed: %s\n", strerror(errno));
|
|
|
ret = false;
|
|
ret = false;
|
|
|
goto free;
|
|
goto free;
|
|
|
}
|
|
}
|
|
@@ -239,10 +272,15 @@ bool move_file(const char *oldname, const char *newname)
|
|
|
if (close(fd) != 0)
|
|
if (close(fd) != 0)
|
|
|
ret = false;
|
|
ret = false;
|
|
|
|
|
|
|
|
- if (ret)
|
|
|
|
|
|
|
+ if (ret) {
|
|
|
|
|
+ if (tools_verbose)
|
|
|
|
|
+ printf("copy worked\n");
|
|
|
unlink(oldname);
|
|
unlink(oldname);
|
|
|
- else
|
|
|
|
|
|
|
+ } else {
|
|
|
|
|
+ if (tools_verbose)
|
|
|
|
|
+ printf("write/close failed\n");
|
|
|
unlink(newname);
|
|
unlink(newname);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
free:
|
|
free:
|
|
|
talloc_free(contents);
|
|
talloc_free(contents);
|