X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2Ftools.c;h=18cc1b84cb299fcc8c5659a05b6c6c05da701a82;hp=87ff4a3b65f4fe9899cf8aebb6e99a40cd244221;hb=354c772e913d137034d5bcd00efdcb880697532e;hpb=f7b3eb1ecf6935dbf2b6c283e848ebfbaaeca47c diff --git a/tools/tools.c b/tools/tools.c index 87ff4a3b..18cc1b84 100644 --- a/tools/tools.c +++ b/tools/tools.c @@ -1,7 +1,10 @@ #include #include +#include +#include #include #include +#include #include #include #include @@ -107,3 +110,39 @@ char *temp_file(const void *ctx, const char *extension) return talloc_asprintf(ctx, "%s/%u%s", tmpdir, count++, extension); } + +bool move_file(const char *oldname, const char *newname) +{ + char *contents; + size_t size; + int fd; + bool ret; + + /* Simple case: rename works. */ + if (rename(oldname, newname) == 0) + return true; + + /* Try copy and delete: not atomic! */ + contents = grab_file(NULL, oldname, &size); + if (!contents) + return false; + + fd = open(newname, O_WRONLY|O_CREAT|O_TRUNC, 0666); + if (fd < 0) { + ret = false; + goto free; + } + + ret = write_all(fd, contents, size); + if (close(fd) != 0) + ret = false; + + if (ret) + unlink(oldname); + else + unlink(newname); + +free: + talloc_free(contents); + return ret; +}