diff -rup gnupg-2.0.18.orig/agent/gpg-agent.c gnupg-2.0.18/agent/gpg-agent.c
--- gnupg-2.0.18.orig/agent/gpg-agent.c	2011-08-04 10:57:02.000000000 +0100
+++ gnupg-2.0.18/agent/gpg-agent.c	2011-08-06 21:01:32.000000000 +0100
@@ -1002,6 +1002,10 @@ main (int argc, char **argv )
       gnupg_fd_t fd_ssh;
       pid_t pid;
 
+      char *tmp1, *tmp;
+      char *tmp2 = "gpg-XXXXXX/S.gpg-agent";
+      size_t len;
+
       /* Remove the DISPLAY variable so that a pinentry does not
          default to a specific display.  There is still a default
          display when gpg-agent was started using --display or a
@@ -1013,13 +1017,23 @@ main (int argc, char **argv )
         unsetenv ("DISPLAY");
 #endif
 
+      if ((tmp1 = getenv("TMPDIR")) == NULL)
+        tmp1 = "/tmp";
+
+      len = strlen(tmp1) + strlen(tmp2) + 10;
+      tmp = malloc(len);
+
+      snprintf(tmp, len, "%s%s%s", tmp1, tmp1 && strlen(tmp1) > 0 ? "/" : "", tmp2);
 
       /* Create the sockets.  */
       socket_name = create_socket_name
-        ("S.gpg-agent", "/tmp/gpg-XXXXXX/S.gpg-agent");
-      if (opt.ssh_support)
+        ("S.gpg-agent", tmp);
+      if (opt.ssh_support) {
+        snprintf(tmp, len, "%s%s%s.ssh", tmp1, tmp1 && strlen(tmp1) > 0 ? "/" : "", tmp2);
 	socket_name_ssh = create_socket_name
-          ("S.gpg-agent.ssh", "/tmp/gpg-XXXXXX/S.gpg-agent.ssh");
+          ("S.gpg-agent.ssh", tmp);
+      }
+      free(tmp);
 
       fd = create_server_socket (socket_name, 0, &socket_nonce);
       if (opt.ssh_support)