$OpenBSD: patch-util_c,v 1.6 2008/12/20 08:58:32 jakemsr Exp $
--- util.c.orig	Sun Dec 14 13:35:48 2008
+++ util.c	Sun Dec 14 13:39:45 2008
@@ -1,5 +1,8 @@
 #include "config.h"
 #include "esd.h"
+#include <limits.h>
+#include <pwd.h>
+#include <stdio.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <stdlib.h>
@@ -24,36 +27,31 @@ have_ipv6(void) {
 const char*
 esd_get_socket_dirname (void) 
 {
-	const char *audiodev = NULL;
-	static char *dirname = NULL;
+	static char *sockdir = NULL, sockdirbuf[PATH_MAX];
+	struct passwd *pw;
 
-        if (dirname == NULL) {
-            if ((audiodev = getenv("AUDIODEV"))) {
-                    char *newdev = strrchr(audiodev, '/');
-                    if (newdev != NULL) {
-                            audiodev = newdev++;
-                    }
-            } else
-                audiodev = "";
-            dirname = malloc(strlen(audiodev) +  40);
-            sprintf (dirname, "/tmp/.esd%s-%i", audiodev, getuid());
+	if (sockdir != NULL)
+		return sockdir;
+	pw = getpwuid(getuid());
+	if (pw == NULL || pw->pw_dir == NULL) {
+		fprintf(stderr, "esd: could not find home directory\n");
+		exit(1);
         }
-
-	return dirname;
+	snprintf(sockdirbuf, sizeof(sockdirbuf), "%s/.esd", pw->pw_dir);
+	endpwent();
+	sockdir = sockdirbuf;
+	return sockdir;
 }
 
 const char*
 esd_get_socket_name (void) 
 {
-	const char *dirname;
-	static char *name = NULL;
+	static char *sockname = NULL, socknamebuf[PATH_MAX];
 
-	if (name == NULL) {
-		dirname = esd_get_socket_dirname();
-		name = malloc(strlen(dirname) + sizeof("/socket"));
-		strcpy(name, dirname);
-		strcat(name, "/socket");
-	}
-
-	return name;
+	if (sockname != NULL)
+		return sockname;
+	snprintf(socknamebuf, sizeof(socknamebuf), "%s/socket",
+		esd_get_socket_dirname());
+	sockname = socknamebuf;
+	return sockname;
 }
