$OpenBSD: patch-util_c,v 1.5 2008/03/31 01:05:54 jakemsr Exp $ --- util.c.orig Thu Apr 19 17:43:59 2007 +++ util.c Sat Jun 2 23:38:31 2007 @@ -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> @@ -23,38 +26,31 @@ have_ipv6(void) { const char* esd_get_socket_dirname (void) { - const char *audiodev; - static char *dirname = NULL; + static char *sockdir = NULL, sockdirbuf[PATH_MAX]; + struct passwd *pw; - if (dirname == NULL) { - if (!(audiodev = getenv("AUDIODEV"))) { - audiodev = ""; - } else { - char *newdev = strrchr(audiodev, '/'); - if (newdev != NULL) { - audiodev = newdev++; - } - } - dirname = malloc(strlen(audiodev) + sizeof("/tmp/.esd")); - strcpy(dirname, "/tmp/.esd"); - strcat(dirname, audiodev); + 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; }