$NetBSD: patch-ab,v 1.3 2013/01/11 23:36:16 joerg Exp $

--- uwm.c.orig	1988-10-23 13:21:55.000000000 +0000
+++ uwm.c
@@ -41,9 +41,25 @@ char *ProgramName;
 
 #include "uwm.h"
 #include <ctype.h>
+#include <signal.h>
+
+#ifdef CSRG_BASED
+#undef MIN
+#undef MAX
+#include <sys/param.h>
+#if defined(BSD) && BSD >= 199306
+#define HAVE_MKSTEMP
+#endif
+#endif
+
+#ifdef X_NOT_STDC_ENV
+char *malloc();
+#endif
+
+static void SetEnvironment (void);
+void LoadXDefaults (void);
 
 #ifdef PROFIL
-#include <signal.h>
 /*
  * Dummy handler for profiling.
  */
@@ -53,6 +69,27 @@ ptrap()
 }
 #endif
 
+#ifdef SIGCHLD
+#include <sys/wait.h>
+/*
+ * clear (probably inherited) children which are dead or will die.
+ */
+clear_children()
+{
+	int status, pid;
+
+	do {
+#ifdef CSRG_BASED
+		pid = wait3(&status, WNOHANG, (struct rusage *) 0);
+#else	/* SVR4 */
+		pid = waitpid(-1, &status, WNOHANG);
+#endif
+	} while (pid != 0 && pid != -1);
+
+	signal(SIGCHLD, clear_children);
+}
+#endif
+
 #define gray_width 16
 #define gray_height 16
 static char gray_bits[] = {
@@ -103,7 +140,6 @@ char **environ;
     GC gc;			/* graphics context for gray background */
     XImage grayimage;		/* for gray background */
     XGCValues xgc;		/* to create font GCs */
-    char *malloc();
     Bool fallbackMFont = False,	/* using default GC font for menus, */
          fallbackPFont = False,	/* popups, */
          fallbackIFont = False;	/* icons */
@@ -115,6 +151,10 @@ char **environ;
 #ifdef PROFIL
     signal(SIGTERM, ptrap);
 #endif
+#ifdef SIGCHLD
+    /* no zombies */
+    clear_children();
+#endif
 
     /*
      * Set up internal defaults.
@@ -369,7 +409,7 @@ char **environ;
     if (IFontInfo == NULL) {
         fprintf(stderr, "uwm: Unable to open icon font '%s', using server default.\n",
                 IFontName);
-	IFontInfo = XQueryFont(dpy, DefaultGC(dpy, scr)->gid);
+	IFontInfo = XQueryFont(dpy, XGContextFromGC(DefaultGC(dpy, scr)));
 	fallbackIFont = True;
     }
     PFontInfo = XLoadQueryFont(dpy, PFontName);
@@ -379,7 +419,7 @@ char **environ;
 	if (fallbackIFont)
 	    PFontInfo = IFontInfo;
 	else
-	    PFontInfo = XQueryFont(dpy, DefaultGC(dpy, scr)->gid);
+	    PFontInfo = XQueryFont(dpy, XGContextFromGC(DefaultGC(dpy, scr)));
 	fallbackPFont = True;
     }
     MFontInfo = XLoadQueryFont(dpy, MFontName);
@@ -389,7 +429,7 @@ char **environ;
 	if (fallbackIFont || fallbackPFont)
 	    MFontInfo = fallbackPFont ? PFontInfo : IFontInfo;
 	else
-	    MFontInfo = XQueryFont(dpy, DefaultGC(dpy, scr)->gid);
+	    MFontInfo = XQueryFont(dpy, XGContextFromGC(DefaultGC(dpy, scr)));
 	fallbackMFont = True;
     }
 
@@ -685,7 +725,11 @@ char **environ;
  */
 InitBindings()
 {
+#ifdef HAVE_MKSTEMP
+    int fd;
+#else
     char *mktemp();
+#endif
     char *tempfile;		/* Temporary filename. */
     register FILE *fp;		/* Temporary file pointer. */
     register char **ptr;	/* Default bindings string array pointer. */
@@ -699,15 +743,26 @@ InitBindings()
 	exit (1);
     }
     strcpy (tempfile, TEMPFILE);
+#ifdef HAVE_MKSTEMP
+    if ((fd = mkstemp(tempfile)) < 0 || (fp = fdopen(fd, "r+")) == NULL) {
+        perror("uwm: cannot create temp file");
+        exit(1);
+    }
+#else
     sfilename = mktemp(tempfile);
     if ((fp = fopen(tempfile, "w")) == NULL) {
         perror("uwm: cannot create temp file");
         exit(1);
     }
+#endif
     for (ptr = DefaultBindings; *ptr; ptr++) {
         fputs(*ptr, fp);
         fputc('\n', fp);
     }
+#ifdef HAVE_MKSTEMP
+    rewind(fp);
+    yyin = fp;
+#else
     fclose(fp);
 
     /*
@@ -717,6 +772,7 @@ InitBindings()
         perror("uwm: cannot open temp file");
         exit(1);
     }
+#endif
     Lineno = 1;
     yyparse();
     fclose(yyin);
@@ -998,7 +1054,7 @@ static int parse_boolean (s)
     return -1;
 }
 
-LoadXDefaults ()
+void LoadXDefaults (void)
 {
     Keyword *k;
     char *option;
@@ -1068,7 +1124,7 @@ char **newenviron;
  * make a new copy of environment that has room for DISPLAY
  */
 
-SetEnvironment ()
+static void SetEnvironment (void)
 {
     int nenvvars;
     char **newPtr, **oldPtr;
