X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Ffile.c;h=1bde9fb805ba906c95ca4ec24df9d1dc921994af;hp=269421cb8d02c727fb33fd607506d9c67d83710f;hb=37bff93c8b0a71432613f41f2319dc073ca64619;hpb=a70807730ef59efc4116556ecabe1b9f70ce605b diff --git a/discover/file.c b/discover/file.c index 269421c..1bde9fb 100644 --- a/discover/file.c +++ b/discover/file.c @@ -17,6 +17,8 @@ #include #include +#include +#include #include #include @@ -75,3 +77,47 @@ err_close: close(fd); return -1; } + +static int write_fd(int fd, char *buf, int len) +{ + int i, rc; + + for (i = 0; i < len; i += rc) { + rc = write(fd, buf + i, len - i); + if (rc < 0 && errno != -EINTR) + return rc; + } + + return 0; +} + +int replace_file(const char *filename, char *buf, int len) +{ + char *tempfile; + mode_t oldmask; + int rc, fd; + + tempfile = talloc_asprintf(NULL, "%s.XXXXXX", filename); + + oldmask = umask(0644); + fd = mkstemp(tempfile); + umask(oldmask); + if (fd < 0) { + talloc_free(tempfile); + return fd; + } + + rc = write_fd(fd, buf, len); + if (rc) { + unlink(tempfile); + } else { + rc = rename(tempfile, filename); + } + + talloc_free(tempfile); + + fchmod(fd, 0644); + + close(fd); + return rc; +}