]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/statd/sm-notify.c
In recent Fedora builds, the '-D _FORTIFY_SOURCE=2' compile
[nfs-utils.git] / utils / statd / sm-notify.c
index d8e2c011701b05a539ba4c65ea83545541204542..f1fc619a9b4c3ab9398e27d073af588d81bdf31a 100644 (file)
@@ -131,6 +131,17 @@ static struct addrinfo *smn_lookup(const sa_family_t family, const char *name)
        return ai;
 }
 
+static void smn_forget_host(struct nsm_host *host)
+{
+       unlink(host->path);
+       free(host->path);
+       free(host->name);
+       if (host->ai)
+               freeaddrinfo(host->ai);
+
+       free(host);
+}
+
 int
 main(int argc, char **argv)
 {
@@ -340,13 +351,8 @@ notify(void)
                        hp = hosts;
                        hosts = hp->next;
 
-                       if (notify_host(sock, hp)){
-                               unlink(hp->path);
-                               free(hp->name);
-                               free(hp->path);
-                               free(hp);
+                       if (notify_host(sock, hp))
                                continue;
-                       }
 
                        /* Set the timeout for this call, using an
                           exponential timeout strategy */
@@ -401,6 +407,7 @@ notify_host(int sock, struct nsm_host *host)
                        nsm_log(LOG_WARNING,
                                "%s doesn't seem to be a valid address,"
                                " skipped", host->name);
+                       smn_forget_host(host);
                        return 1;
                }
        }
@@ -545,11 +552,7 @@ recv_reply(int sock)
                if (p <= end) {
                        nsm_log(LOG_DEBUG, "Host %s notified successfully",
                                        hp->name);
-                       unlink(hp->path);
-                       free(hp->name);
-                       free(hp->path);
-                       free(hp);
-                       freeaddrinfo(hp->ai);
+                       smn_forget_host(hp);
                        return;
                }
        }
@@ -779,7 +782,10 @@ static int record_pid(void)
        fd = open("/var/run/sm-notify.pid", O_CREAT|O_EXCL|O_WRONLY, 0600);
        if (fd < 0)
                return 0;
-       write(fd, pid, strlen(pid));
+       if (write(fd, pid, strlen(pid)) != strlen(pid))  {
+               nsm_log(LOG_WARNING, "Writing to pid file failed: errno %d(%s)",
+                       errno, strerror(errno));
+       }
        close(fd);
        return 1;
 }
@@ -815,12 +821,16 @@ static void drop_privs(void)
 static void set_kernel_nsm_state(int state)
 {
        int fd;
+       const char *file = "/proc/sys/fs/nfs/nsm_local_state";
 
-       fd = open("/proc/sys/fs/nfs/nsm_local_state",O_WRONLY);
+       fd = open(file ,O_WRONLY);
        if (fd >= 0) {
                char buf[20];
                snprintf(buf, sizeof(buf), "%d", state);
-               write(fd, buf, strlen(buf));
+               if (write(fd, buf, strlen(buf)) != strlen(buf)) {
+                       nsm_log(LOG_WARNING, "Writing to '%s' failed: errno %d (%s)",
+                               file, errno, strerror(errno));
+               }
                close(fd);
        }
 }