On Thu, 23 Jan 2020, Damien Miller wrote:

> On Thu, 23 Jan 2020, Damien Miller wrote:
> 
> > What information would you like there? We could put the first N listen
> > addrs in the proctitle if that would help.
> 
> Maybe like this:
> 
> 63817 ??  S        0:00.05 sshd: [listen] on [0.0.0.0]:22, [::]:22, 0 of 
> 10-100

antoine@ said this was not sufficient, so please try the following:

63817 ??  I        0:00.09 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups


diff --git a/sshd.c b/sshd.c
index f6139fe..b7ed0f3 100644
--- a/sshd.c
+++ b/sshd.c
@@ -240,6 +240,8 @@ void destroy_sensitive_data(void);
 void demote_sensitive_data(void);
 static void do_ssh2_kex(struct ssh *);
 
+static char *listener_proctitle;
+
 /*
  * Close all listening sockets
  */
@@ -1032,9 +1034,9 @@ server_accept_loop(int *sock_in, int *sock_out, int 
*newsock, int *config_s)
         */
        for (;;) {
                if (ostartups != startups) {
-                       setproctitle("[listener] %d of %d-%d startups",
-                           startups, options.max_startups_begin,
-                           options.max_startups);
+                       setproctitle("%s [listener] %d of %d-%d startups",
+                           listener_proctitle, startups,
+                           options.max_startups_begin, options.max_startups);
                        ostartups = startups;
                }
                if (received_sighup) {
@@ -1347,6 +1349,41 @@ accumulate_host_timing_secret(struct sshbuf *server_cfg,
        sshbuf_free(buf);
 }
 
+static void
+xextendf(char **s, const char *sep, const char *fmt, ...)
+    __attribute__((__format__ (printf, 3, 4))) __attribute__((__nonnull__ 
(3)));
+static void
+xextendf(char **sp, const char *sep, const char *fmt, ...)
+{
+       va_list ap;
+       char *tmp1, *tmp2;
+
+       va_start(ap, fmt);
+       xvasprintf(&tmp1, fmt, ap);
+       va_end(ap);
+
+       if (*sp == NULL || **sp == '\0') {
+               free(*sp);
+               *sp = tmp1;
+               return;
+       }
+       xasprintf(&tmp2, "%s%s%s", *sp, sep, tmp1);
+       free(tmp1);
+       free(*sp);
+       *sp = tmp2;
+}
+
+static char *
+prepare_proctitle(int ac, char **av)
+{
+       char *ret = NULL;
+       int i;
+
+       for (i = 0; i < ac; i++)
+               xextendf(&ret, " ", "%s", av[i]);
+       return ret;
+}
+
 /*
  * Main program for the daemon.
  */
@@ -1774,6 +1811,7 @@ main(int ac, char **av)
                rexec_argv[rexec_argc] = "-R";
                rexec_argv[rexec_argc + 1] = NULL;
        }
+       listener_proctitle = prepare_proctitle(ac, av);
 
        /* Ensure that umask disallows at least group and world write */
        new_umask = umask(0077) | 0022;

Reply via email to