Merge branch 'master' of git.distorted.org.uk:~mdw/publish/public-git/disorder
[disorder] / lib / client-common.c
index a4a9851..c2ea90d 100644 (file)
 
 /** @brief Figure out what address to connect to
  * @param c Configuration to honor
+ * @param flags Flags to guide the choice
  * @param sap Where to store pointer to sockaddr
  * @param namep Where to store socket name
  * @return Socket length, or (socklen_t)-1
  */
-socklen_t find_server(struct config *c,
-                      struct sockaddr **sap, char **namep) {
+socklen_t disorder_find_server(struct config *c, unsigned flags,
+                               struct sockaddr **sap, char **namep) {
   struct sockaddr *sa;
 #if !_WIN32
   struct sockaddr_un su;
 #endif
-  struct addrinfo *res = 0;
+  struct resolved *res;
+  size_t nres;
   char *name = NULL;
   socklen_t len;
 
   if(c->connect.af != -1) {
-    res = netaddress_resolve(&c->connect, 0, IPPROTO_TCP);
-    if(!res) 
+    if(netaddress_resolve(&c->connect, 0, SOCK_STREAM, &res, &nres))
       return -1;
-    sa = res->ai_addr;
-    len = res->ai_addrlen;
+    sa = res->sa;
+    len = res->len;
   } else {
 #if _WIN32
     disorder_fatal(0, "local connections are not supported on Windows");
 #else
     /* 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 (!(flags & DISORDER_FS_NOTPRIV)) {
+      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");
@@ -87,6 +90,7 @@ socklen_t find_server(struct config *c,
     strcpy(su.sun_path, name);
     sa = (struct sockaddr *)&su;
     len = sizeof su;
+    res = 0;
     xfree(name);
 #endif
   }
@@ -95,10 +99,25 @@ socklen_t find_server(struct config *c,
   if(namep)
     *namep = format_sockaddr(sa);
   if(res)
-    freeaddrinfo(res);
+    netaddress_free_resolved(res, nres);
   return len;
 }
 
+/** @brief Figure out what address to connect to
+ * @param c Configuration to honor
+ * @param sap Where to store pointer to sockaddr
+ * @param namep Where to store socket name
+ * @return Socket length, or (socklen_t)-1
+ *
+ * The function disorder_find_server() isn't a namespace violation, and has
+ * more functionality.  This function is equivalent, to disorder_find_server()
+ * with a zero @c flags argument.
+ */
+socklen_t find_server(struct config *c,
+                      struct sockaddr **sap, char **namep) {
+  return disorder_find_server(c, 0, sap, namep);
+}
+
 const char disorder__body[1];
 const char disorder__list[1];
 const char disorder__integer[1];