f3c1d3d
--- libdaemon-0.11/libdaemon/dfork.c.debug	2007-06-11 11:36:11.000000000 -0400
f3c1d3d
+++ libdaemon-0.11/libdaemon/dfork.c	2007-07-02 14:49:35.000000000 -0400
f3c1d3d
@@ -354,31 +354,38 @@
f3c1d3d
 
f3c1d3d
 int daemon_close_all(int except_fd, ...) {
f3c1d3d
     va_list original_ap, ap;
f3c1d3d
-    int n, i, r;
f3c1d3d
-    int *p;
f3c1d3d
+    int n = 0, i = 0, r = -1;
f3c1d3d
+    int *p = NULL;
f3c1d3d
 
f3c1d3d
-    va_start(original_ap, except_fd);
f3c1d3d
-    va_copy(ap, original_ap);
f3c1d3d
+    if (except_fd >= 0) {
f3c1d3d
+      va_start(original_ap, except_fd);
f3c1d3d
+      va_copy(ap, original_ap);
f3c1d3d
 
f3c1d3d
-    for (n = 0; va_arg(ap, int) >= 0; n++)
f3c1d3d
-        ;
f3c1d3d
+      for (n = 0; va_arg(ap, int) >= 0; n++)
f3c1d3d
+          ;
f3c1d3d
 
f3c1d3d
-    va_end(ap);
f3c1d3d
-
f3c1d3d
-    if (!(p = malloc(sizeof(int) * (n+1)))) {
f3c1d3d
-        va_end(original_ap);
f3c1d3d
-        return -1;
f3c1d3d
+      va_end(ap);
f3c1d3d
     }
f3c1d3d
 
f3c1d3d
-    i = 0;
f3c1d3d
-    while ((p[i++] = va_arg(original_ap, int)) >= 0)
f3c1d3d
-        ;
f3c1d3d
+    if (!(p = malloc(sizeof(int) * (n+2))))
f3c1d3d
+        goto out;
f3c1d3d
+
f3c1d3d
+    p[i++] = except_fd;
f3c1d3d
+
f3c1d3d
+    if (except_fd >= 0) {
f3c1d3d
+      i = 1;
f3c1d3d
+      while ((p[i++] = va_arg(original_ap, int)) >= 0)
f3c1d3d
+          ;
f3c1d3d
+    }
f3c1d3d
 
f3c1d3d
     p[i] = -1;
f3c1d3d
     
f3c1d3d
     r = daemon_close_allv(p);
f3c1d3d
+
f3c1d3d
+out:
f3c1d3d
+    if (except_fd >= 0)
f3c1d3d
+        va_end(original_ap);
f3c1d3d
     free(p);
f3c1d3d
-    
f3c1d3d
     return r;
f3c1d3d
 }
f3c1d3d