Greg Banks suggested some variations, particularly improved
use of xmalloc/xstrdup functions.  Thanks.
        struct stat stb, pstb;
        int rv;
 
-       dotdot = malloc(strlen(path)+4);
-       if (!dotdot)
-               return 0;
+       dotdot = xmalloc(strlen(path)+4);
+
        strcat(strcpy(dotdot, path), "/..");
        if (lstat(path, &stb) != 0 ||
            lstat(dotdot, &pstb) != 0)
 
 
        if (noclose == 0) {
                tempfd = open("/dev/null", O_RDWR);
+               if (tempfd < 0)
+                       tempfd = open("/", O_RDONLY);
                if (tempfd >= 0) {
                        dup2(tempfd, 0);
                        dup2(tempfd, 1);
                        dup2(tempfd, 2);
-               }
-               closeall(3);
+                       closeall(3);
+               } else
+                       closeall(0);
        }
 
        return;
 
 {
        notify_list     *new;
 
-       if (!(new = (notify_list *) xmalloc(sizeof(notify_list))))
-               return NULL;
+       new = (notify_list *) xmalloc(sizeof(notify_list));
        memset(new, 0, sizeof(*new));
 
        NL_TIMES(new) = MAX_TRIES;
        NL_STATE(new) = state;
-       if (!(NL_MY_NAME(new) = xstrdup(my_name))
-           || !(NL_MON_NAME(new) = xstrdup(mon_name))) {
-               if (NL_MY_NAME(new))
-                       free(NL_MY_NAME(new));
-               free(new);
-               return NULL;
-       }
+       NL_MY_NAME(new) = xstrdup(my_name);
+       NL_MON_NAME(new) = xstrdup(mon_name);
 
        return new;
 }