#include <sys/un.h>
#include <errno.h>
#include <netdb.h>
+#include <unistd.h>
#include "log.h"
#include "configuration.h"
struct sockaddr *sa;
struct sockaddr_un su;
struct addrinfo *res = 0;
- char *name;
+ char *name = NULL;
socklen_t len;
if(c->connect.af != -1) {
sa = res->ai_addr;
len = res->ai_addrlen;
} else {
- name = config_get_file2(c, "socket");
+ if(getuid() == 0) {
+ /* root will use the private socket if possible (which it should be) */
+ name = config_get_file2(c, "private/socket");
+ if(access(name, R_OK) != 0) {
+ xfree(name);
+ name = NULL;
+ }
+ }
+ if(!name)
+ name = config_get_file2(c, "socket");
if(strlen(name) >= sizeof su.sun_path) {
disorder_error(errno, "socket path is too long");
return -1;