Add a -U option to mkfiles.pl, which is just like -u except that it
[sgt/putty] / raw.c
diff --git a/raw.c b/raw.c
index 631320c..6eb605d 100644 (file)
--- a/raw.c
+++ b/raw.c
@@ -1,3 +1,7 @@
+/*
+ * "Raw" backend.
+ */
+
 #include <stdio.h>
 #include <stdlib.h>
 
@@ -29,6 +33,22 @@ static void c_write(Raw raw, char *buf, int len)
     sk_set_frozen(raw->s, backlog > RAW_MAX_BACKLOG);
 }
 
+static void raw_log(Plug plug, int type, SockAddr addr, int port,
+                   const char *error_msg, int error_code)
+{
+    Raw raw = (Raw) plug;
+    char addrbuf[256], *msg;
+
+    sk_getaddr(addr, addrbuf, lenof(addrbuf));
+
+    if (type == 0)
+       msg = dupprintf("Connecting to %s port %d", addrbuf, port);
+    else
+       msg = dupprintf("Failed to connect to %s: %s", addrbuf, error_msg);
+
+    logevent(raw->frontend, msg);
+}
+
 static int raw_closing(Plug plug, const char *error_msg, int error_code,
                       int calling_back)
 {
@@ -69,11 +89,12 @@ static void raw_sent(Plug plug, int bufsize)
  * freed by the caller.
  */
 static const char *raw_init(void *frontend_handle, void **backend_handle,
-                           Config *cfg,
+                           Conf *conf,
                            char *host, int port, char **realhost, int nodelay,
                            int keepalive)
 {
     static const struct plug_function_table fn_table = {
+       raw_log,
        raw_closing,
        raw_receive,
        raw_sent
@@ -81,6 +102,8 @@ static const char *raw_init(void *frontend_handle, void **backend_handle,
     SockAddr addr;
     const char *err;
     Raw raw;
+    int addressfamily;
+    char *loghost;
 
     raw = snew(struct raw_backend_data);
     raw->fn = &fn_table;
@@ -89,16 +112,20 @@ static const char *raw_init(void *frontend_handle, void **backend_handle,
 
     raw->frontend = frontend_handle;
 
+    addressfamily = conf_get_int(conf, CONF_addressfamily);
     /*
      * Try to find host.
      */
     {
        char *buf;
-       buf = dupprintf("Looking up host \"%s\"", host);
+       buf = dupprintf("Looking up host \"%s\"%s", host,
+                       (addressfamily == ADDRTYPE_IPV4 ? " (IPv4)" :
+                        (addressfamily == ADDRTYPE_IPV6 ? " (IPv6)" :
+                         "")));
        logevent(raw->frontend, buf);
        sfree(buf);
     }
-    addr = name_lookup(host, port, realhost, cfg);
+    addr = name_lookup(host, port, realhost, conf, addressfamily);
     if ((err = sk_addr_error(addr)) != NULL) {
        sk_addr_free(addr);
        return err;
@@ -110,18 +137,28 @@ static const char *raw_init(void *frontend_handle, void **backend_handle,
     /*
      * Open socket.
      */
-    {
-       char *buf, addrbuf[100];
-       sk_getaddr(addr, addrbuf, 100);
-       buf = dupprintf("Connecting to %s port %d", addrbuf, port);
-       logevent(raw->frontend, buf);
-       sfree(buf);
-    }
     raw->s = new_connection(addr, *realhost, port, 0, 1, nodelay, keepalive,
-                           (Plug) raw, cfg);
+                           (Plug) raw, conf);
     if ((err = sk_socket_error(raw->s)) != NULL)
        return err;
 
+    loghost = conf_get_str(conf, CONF_loghost);
+    if (*loghost) {
+       char *colon;
+
+       sfree(*realhost);
+       *realhost = dupstr(loghost);
+       colon = strrchr(*realhost, ':');
+       if (colon) {
+           /*
+            * FIXME: if we ever update this aspect of ssh.c for
+            * IPv6 literal management, this should change in line
+            * with it.
+            */
+           *colon++ = '\0';
+       }
+    }
+
     return NULL;
 }
 
@@ -137,7 +174,7 @@ static void raw_free(void *handle)
 /*
  * Stub routine (we don't have any need to reconfigure this backend).
  */
-static void raw_reconfig(void *handle, Config *cfg)
+static void raw_reconfig(void *handle, Conf *conf)
 {
 }
 
@@ -192,10 +229,10 @@ static const struct telnet_special *raw_get_specials(void *handle)
     return NULL;
 }
 
-static Socket raw_socket(void *handle)
+static int raw_connected(void *handle)
 {
     Raw raw = (Raw) handle;
-    return raw->s;
+    return raw->s != NULL;
 }
 
 static int raw_sendok(void *handle)
@@ -253,7 +290,7 @@ Backend raw_backend = {
     raw_size,
     raw_special,
     raw_get_specials,
-    raw_socket,
+    raw_connected,
     raw_exitcode,
     raw_sendok,
     raw_ldisc,
@@ -261,5 +298,7 @@ Backend raw_backend = {
     raw_provide_logctx,
     raw_unthrottle,
     raw_cfg_info,
-    1
+    "raw",
+    PROT_RAW,
+    0
 };