Turned the old `Telnet Command' System-submenu into a more general
[u/mdw/putty] / rlogin.c
index 8e5e628..c12a080 100644 (file)
--- a/rlogin.c
+++ b/rlogin.c
@@ -19,6 +19,7 @@ typedef struct rlogin_tag {
 
     Socket s;
     int bufsize;
+    int firstbyte;
     int term_width, term_height;
     void *frontend;
 } *Rlogin;
@@ -69,13 +70,12 @@ static int rlogin_receive(Plug plug, int urgent, char *data, int len)
         * byte is expected to be NULL and is ignored, and the rest
         * is printed.
         */
-       static int firstbyte = 1;
-       if (firstbyte) {
+       if (rlogin->firstbyte) {
            if (data[0] == '\0') {
                data++;
                len--;
            }
-           firstbyte = 0;
+           rlogin->firstbyte = 0;
        }
        if (len > 0)
             c_write(rlogin, data, len);
@@ -110,12 +110,13 @@ static char *rlogin_init(void *frontend_handle, void **backend_handle,
     char *err;
     Rlogin rlogin;
 
-    rlogin = smalloc(sizeof(*rlogin));
+    rlogin = snew(struct rlogin_tag);
     rlogin->fn = &fn_table;
     rlogin->s = NULL;
     rlogin->frontend = frontend_handle;
     rlogin->term_width = cfg->width;
     rlogin->term_height = cfg->height;
+    rlogin->firstbyte = 1;
     *backend_handle = rlogin;
 
     /*
@@ -168,7 +169,7 @@ static char *rlogin_init(void *frontend_handle, void **backend_handle,
        sk_write(rlogin->s, cfg->termtype,
                 strlen(cfg->termtype));
        sk_write(rlogin->s, "/", 1);
-       for (p = cfg->termspeed; isdigit(*p); p++) continue;
+       for (p = cfg->termspeed; isdigit((unsigned char)*p); p++) continue;
        sk_write(rlogin->s, cfg->termspeed, p - cfg->termspeed);
        rlogin->bufsize = sk_write(rlogin->s, &z, 1);
     }
@@ -176,6 +177,15 @@ static char *rlogin_init(void *frontend_handle, void **backend_handle,
     return NULL;
 }
 
+static void rlogin_free(void *handle)
+{
+    Rlogin rlogin = (Rlogin) handle;
+
+    if (rlogin->s)
+       sk_close(rlogin->s);
+    sfree(rlogin);
+}
+
 /*
  * Stub routine (we don't have any need to reconfigure this backend).
  */
@@ -238,6 +248,15 @@ static void rlogin_special(void *handle, Telnet_Special code)
     return;
 }
 
+/*
+ * Return a list of the special codes that make sense in this
+ * protocol.
+ */
+static const struct telnet_special *rlogin_get_specials(void *handle)
+{
+    return NULL;
+}
+
 static Socket rlogin_socket(void *handle)
 {
     Rlogin rlogin = (Rlogin) handle;
@@ -274,18 +293,23 @@ static void rlogin_provide_logctx(void *handle, void *logctx)
 
 static int rlogin_exitcode(void *handle)
 {
-    /* Rlogin rlogin = (Rlogin) handle; */
-    /* If we ever implement RSH, we'll probably need to do this properly */
-    return 0;
+    Rlogin rlogin = (Rlogin) handle;
+    if (rlogin->s != NULL)
+        return -1;                     /* still connected */
+    else
+        /* If we ever implement RSH, we'll probably need to do this properly */
+        return 0;
 }
 
 Backend rlogin_backend = {
     rlogin_init,
+    rlogin_free,
     rlogin_reconfig,
     rlogin_send,
     rlogin_sendbuffer,
     rlogin_size,
     rlogin_special,
+    rlogin_get_specials,
     rlogin_socket,
     rlogin_exitcode,
     rlogin_sendok,