Satoru SATOH wrote:
Thank you for the update.
Here are a few more suggestions:
+static int
+hostsfileWrite(const char *path,
+ dnsmasqDhcpHost *hosts,
+ unsigned int nhosts)
+{
+ char *tmp = NULL;
+ FILE *f;
+ bool istmp = true;
+ unsigned int i;
+ int rc;
Please initialize "rc" here,
int rc = 0;
so that, below(at the end)...
+ if (nhosts == 0)
+ return 0;
+
+ if (virAsprintf(&tmp, "%s.new", path) < 0)
+ return -1;
Please change that to "return ENOMEM;".
At first I thought it should be "return errno;",
but neither virAsprintf nor vasprintf/asprintf specify
if/how errno is set upon failure.
+ if (!(f = fopen(tmp, "w"))) {
+ istmp = false;
+ if (!(f = fopen(path, "w"))) {
+ rc = errno;
+ goto cleanup;
+ }
+ }
+
+ for (i = 0; i < nhosts; i++) {
+ if (fputs(hosts[i].host, f) == EOF || fputc('\n', f) == EOF) {
+ rc = errno;
+ fclose(f);
+
+ if (istmp)
+ unlink(tmp);
+
+ goto cleanup;
+ }
+ }
+
+ if (fclose(f) == EOF) {
+ rc = errno;
+ goto cleanup;
+ }
+
+ if (istmp) {
+ if (rename(tmp, path) < 0) {
+ rc = errno;
+ unlink(tmp);
+ goto cleanup;
+ }
+
+ if (unlink(tmp) < 0) {
+ rc = errno;
+ goto cleanup;
+ }
+ }
+
+ VIR_FREE(tmp);
+
+ return 0;
... you can remove the "VIR_FREE..." and "return 0" above.
+ cleanup:
+ VIR_FREE(tmp);
+
+ return rc;
+}
...
+int
+dnsmasqReload(pid_t pid)
+{
+ if (kill(pid, SIGHUP) != 0) {
+ virReportSystemError(errno,
+ _("Failed to make dnsmasq (PID: %d) reloading config files.\n"),
s/reloading/reload/
+ pid);
+ return -1;
+ }
+
+ return 0;
+}