Hi,

The following patch change the system(3) call in swapctl(8) to
vfork(2)+exec(2).

swapctl use it for invoking mount_nfs(8) when fstab contains option for
swapping to NFS files.

Comments ? OK ?
-- 
Sebastien Marie


Index: swapctl.c
===================================================================
RCS file: /cvs/src/sbin/swapctl/swapctl.c,v
retrieving revision 1.20
diff -u -p -r1.20 swapctl.c
--- swapctl.c   18 Apr 2015 18:28:37 -0000      1.20
+++ swapctl.c   13 Aug 2015 11:58:12 -0000
@@ -52,6 +52,7 @@
 
 #include <sys/stat.h>
 #include <sys/swap.h>
+#include <sys/wait.h>
 
 #include <unistd.h>
 #include <err.h>
@@ -366,8 +367,9 @@ do_fstab(void)
                        priority = pri;
 
                if ((s = strstr(fp->fs_mntops, NFSMNTPT)) != NULL) {
-                       char *t, cmd[sizeof(PATH_MOUNT)+PATH_MAX+1+PATH_MAX+1];
-                       int l;
+                       char *t;
+                       pid_t pid;
+                       int status;
 
                        /*
                         * Skip this song and dance if we're only
@@ -391,11 +393,18 @@ do_fstab(void)
                                free((char *)spec);
                                continue;
                        }
-                       l = snprintf(cmd, sizeof(cmd), "%s %s %s",
-                           PATH_MOUNT, fp->fs_spec, spec);
-                       if (l == -1 || l >= sizeof(cmd))
-                               errx(1, "path too long");
-                       if (system(cmd) != 0) {
+
+                       switch (pid = vfork()) {
+                       case -1:        /* error */
+                               err(1, "vfork");
+                       case 0:
+                               execl(PATH_MOUNT, PATH_MOUNT, fp->fs_spec, spec,
+                                   NULL);
+                               err(1, "execl");
+                       }
+                       if (waitpid(pid, &status, 0) < 0)
+                               err(1, "waitpid");
+                       if (status != 0) {
                                warnx("%s: mount failed", fp->fs_spec);
                                free((char *)spec);
                                continue;

Reply via email to