dnsmasq: Fix errno handling and don't unlink non-existing files

addnhostsSave and hostsfileSave expect < 0 return value on error from
addnhostsWrite and hostsfileWrite but then pass err instead of -err
to virReportSystemError that expects an errno value.

Also addnhostsWrite returns -ENOMEM and errno, change this to -errno.

addnhostsWrite and hostsfileWrite tried to unlink the tempfile after
renaming it, making both fail on the final step. Remove the unnecessary
unlink calls.
This commit is contained in:
Matthias Bolte 2011-06-29 01:50:06 +02:00
parent 9fdeaeef89
commit 8cce5436dd

View File

@ -185,14 +185,14 @@ addnhostsWrite(const char *path,
if (!(f = fopen(tmp, "w"))) { if (!(f = fopen(tmp, "w"))) {
istmp = false; istmp = false;
if (!(f = fopen(path, "w"))) { if (!(f = fopen(path, "w"))) {
rc = errno; rc = -errno;
goto cleanup; goto cleanup;
} }
} }
for (i = 0; i < nhosts; i++) { for (i = 0; i < nhosts; i++) {
if (fputs(hosts[i].ip, f) == EOF || fputc('\t', f) == EOF) { if (fputs(hosts[i].ip, f) == EOF || fputc('\t', f) == EOF) {
rc = errno; rc = -errno;
VIR_FORCE_FCLOSE(f); VIR_FORCE_FCLOSE(f);
if (istmp) if (istmp)
@ -203,7 +203,7 @@ addnhostsWrite(const char *path,
for (ii = 0; ii < hosts[i].nhostnames; ii++) { for (ii = 0; ii < hosts[i].nhostnames; ii++) {
if (fputs(hosts[i].hostnames[ii], f) == EOF || fputc('\t', f) == EOF) { if (fputs(hosts[i].hostnames[ii], f) == EOF || fputc('\t', f) == EOF) {
rc = errno; rc = -errno;
VIR_FORCE_FCLOSE(f); VIR_FORCE_FCLOSE(f);
if (istmp) if (istmp)
@ -214,7 +214,7 @@ addnhostsWrite(const char *path,
} }
if (fputc('\n', f) == EOF) { if (fputc('\n', f) == EOF) {
rc = errno; rc = -errno;
VIR_FORCE_FCLOSE(f); VIR_FORCE_FCLOSE(f);
if (istmp) if (istmp)
@ -225,21 +225,14 @@ addnhostsWrite(const char *path,
} }
if (VIR_FCLOSE(f) == EOF) { if (VIR_FCLOSE(f) == EOF) {
rc = errno; rc = -errno;
goto cleanup; goto cleanup;
} }
if (istmp) { if (istmp && rename(tmp, path) < 0) {
if (rename(tmp, path) < 0) { rc = -errno;
rc = errno; unlink(tmp);
unlink(tmp); goto cleanup;
goto cleanup;
}
if (unlink(tmp) < 0) {
rc = errno;
goto cleanup;
}
} }
cleanup: cleanup:
@ -255,7 +248,7 @@ addnhostsSave(dnsmasqAddnHostsfile *addnhostsfile)
addnhostsfile->nhosts); addnhostsfile->nhosts);
if (err < 0) { if (err < 0) {
virReportSystemError(err, _("cannot write config file '%s'"), virReportSystemError(-err, _("cannot write config file '%s'"),
addnhostsfile->path); addnhostsfile->path);
return -1; return -1;
} }
@ -402,17 +395,10 @@ hostsfileWrite(const char *path,
goto cleanup; goto cleanup;
} }
if (istmp) { if (istmp && rename(tmp, path) < 0) {
if (rename(tmp, path) < 0) { rc = -errno;
rc = -errno; unlink(tmp);
unlink(tmp); goto cleanup;
goto cleanup;
}
if (unlink(tmp) < 0) {
rc = -errno;
goto cleanup;
}
} }
cleanup: cleanup:
@ -428,7 +414,7 @@ hostsfileSave(dnsmasqHostsfile *hostsfile)
hostsfile->nhosts); hostsfile->nhosts);
if (err < 0) { if (err < 0) {
virReportSystemError(err, _("cannot write config file '%s'"), virReportSystemError(-err, _("cannot write config file '%s'"),
hostsfile->path); hostsfile->path);
return -1; return -1;
} }