New timing infrastructure. There's a new function schedule_timer()
[u/mdw/putty] / unix / uxplink.c
index c9b5075..6f17b5a 100644 (file)
@@ -73,8 +73,6 @@ static Config cfg;
  */
 char *platform_default_s(const char *name)
 {
-    if (!strcmp(name, "X11Display"))
-       return dupstr(getenv("DISPLAY"));
     if (!strcmp(name, "TermType"))
        return dupstr(getenv("TERM"));
     if (!strcmp(name, "UserName"))
@@ -212,7 +210,7 @@ static void usage(void)
     printf("  -v        show verbose messages\n");
     printf("  -load sessname  Load settings from saved session\n");
     printf("  -ssh -telnet -rlogin -raw\n");
-    printf("            force use of a particular protocol (default SSH)\n");
+    printf("            force use of a particular protocol\n");
     printf("  -P port   connect to specified port\n");
     printf("  -l user   connect with specified username\n");
     printf("  -m file   read remote command(s) from file\n");
@@ -232,6 +230,7 @@ static void usage(void)
     printf("  -C        enable compression\n");
     printf("  -i key    private key file for authentication\n");
     printf("  -s        remote command is an SSH subsystem (SSH-2 only)\n");
+    printf("  -N        don't start a shell/command (SSH-2 only)\n");
     exit(1);
 }
 
@@ -253,6 +252,7 @@ int main(int argc, char **argv)
     int errors;
     int use_subsystem = 0;
     void *ldisc, *logctx;
+    long now;
 
     ssh_get_line = console_get_line;
 
@@ -355,7 +355,7 @@ int main(int argc, char **argv)
                    strncpy(cfg.host, q, sizeof(cfg.host) - 1);
                    cfg.host[sizeof(cfg.host) - 1] = '\0';
                } else {
-                   char *r;
+                   char *r, *user, *host;
                    /*
                     * Before we process the [user@]host string, we
                     * first check for the presence of a protocol
@@ -379,28 +379,32 @@ int main(int argc, char **argv)
                    }
 
                    /*
-                    * Three cases. Either (a) there's a nonzero
-                    * length string followed by an @, in which
-                    * case that's user and the remainder is host.
-                    * Or (b) there's only one string, not counting
-                    * a potential initial @, and it exists in the
-                    * saved-sessions database. Or (c) only one
-                    * string and it _doesn't_ exist in the
-                    * database.
+                    * A nonzero length string followed by an @ is treated
+                    * as a username. (We discount an _initial_ @.) The
+                    * rest of the string (or the whole string if no @)
+                    * is treated as a session name and/or hostname.
                     */
                    r = strrchr(p, '@');
                    if (r == p)
                        p++, r = NULL; /* discount initial @ */
-                   if (r == NULL) {
-                       /*
-                        * One string.
-                        */
+                   if (r) {
+                       *r++ = '\0';
+                       user = p, host = r;
+                   } else {
+                       user = NULL, host = p;
+                   }
+
+                   /*
+                    * Now attempt to load a saved session with the
+                    * same name as the hostname.
+                    */
+                   {
                        Config cfg2;
-                       do_defaults(p, &cfg2);
+                       do_defaults(host, &cfg2);
                        if (loaded_session || cfg2.host[0] == '\0') {
                            /* No settings for this host; use defaults */
                            /* (or session was already loaded with -load) */
-                           strncpy(cfg.host, p, sizeof(cfg.host) - 1);
+                           strncpy(cfg.host, host, sizeof(cfg.host) - 1);
                            cfg.host[sizeof(cfg.host) - 1] = '\0';
                            cfg.port = default_port;
                        } else {
@@ -408,14 +412,15 @@ int main(int argc, char **argv)
                            /* Ick: patch up internal pointer after copy */
                            cfg.remote_cmd_ptr = cfg.remote_cmd;
                        }
-                   } else {
-                       *r++ = '\0';
-                       strncpy(cfg.username, p, sizeof(cfg.username) - 1);
+                   }
+
+                   if (user) {
+                       /* Patch in specified username. */
+                       strncpy(cfg.username, user,
+                               sizeof(cfg.username) - 1);
                        cfg.username[sizeof(cfg.username) - 1] = '\0';
-                       strncpy(cfg.host, r, sizeof(cfg.host) - 1);
-                       cfg.host[sizeof(cfg.host) - 1] = '\0';
-                       cfg.port = default_port;
                    }
+
                }
            } else {
                char *command;
@@ -466,7 +471,7 @@ int main(int argc, char **argv)
 
     /* See if host is of the form user@host */
     if (cfg.host[0] != '\0') {
-       char *atsign = strchr(cfg.host, '@');
+       char *atsign = strrchr(cfg.host, '@');
        /* Make sure we're not overflowing the user field */
        if (atsign) {
            if (atsign - cfg.host < sizeof cfg.username) {
@@ -580,6 +585,7 @@ int main(int argc, char **argv)
     atexit(cleanup_termios);
     ldisc_update(NULL, 1, 1);
     sending = FALSE;
+    now = GETTICKCOUNT();
 
     while (1) {
        fd_set rset, wset, xset;
@@ -640,7 +646,23 @@ int main(int argc, char **argv)
        }
 
        do {
-           ret = select(maxfd, &rset, &wset, &xset, NULL);
+           long next, ticks;
+           struct timeval tv, *ptv;
+
+           if (run_timers(now, &next)) {
+               ticks = next - GETTICKCOUNT();
+               if (ticks < 0) ticks = 0;   /* just in case */
+               tv.tv_sec = ticks / 1000;
+               tv.tv_usec = ticks % 1000 * 1000;
+               ptv = &tv;
+           } else {
+               ptv = NULL;
+           }
+           ret = select(maxfd, &rset, &wset, &xset, ptv);
+           if (ret == 0)
+               now = next;
+           else
+               now = GETTICKCOUNT();
        } while (ret < 0 && errno == EINTR);
 
        if (ret < 0) {