From 03718b936ee9072075d56e5f25a84cd2f7f91030 Mon Sep 17 00:00:00 2001 From: Joshua Kwan Date: Sat, 3 Jul 2004 19:19:28 +0000 Subject: [PATCH] setproctitle for teh lunix git-svn-id: svn://katsu.triplehelix.org/dgamelaunch/trunk@327 db0b04b0-f4d1-0310-9a6d-de3e77497b0e --- Makefile.in | 2 +- configure.ac | 19 +++++- dgamelaunch.c | 29 +++++---- dgamelaunch.h | 5 ++ setproctitle.c | 155 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 198 insertions(+), 12 deletions(-) create mode 100644 setproctitle.c diff --git a/Makefile.in b/Makefile.in index a16e896..76f65a9 100644 --- a/Makefile.in +++ b/Makefile.in @@ -19,7 +19,7 @@ MKDEP_DIRECT = @MKDEP_DIRECT@ MAN8 = dgamelaunch.8 EDITOR = @EDITOR@ -STATIC_SRCS = $(EDITOR) dgl-common.c ttyrec.c dgamelaunch.c io.c ttyplay.c mygetnstr.c stripgfx.c strlcpy.c strlcat.c +STATIC_SRCS = $(EDITOR) dgl-common.c ttyrec.c dgamelaunch.c io.c ttyplay.c mygetnstr.c stripgfx.c strlcpy.c strlcat.c @SETPROCTITLE_C@ DYN_SRCS = y.tab.c lex.yy.c EXTRA_SRCS = nethackstub.c DEP_SRCS := $(STATIC_SRCS) $(EXTRA_SRCS) dgl-wall.c diff --git a/configure.ac b/configure.ac index cec25a7..47a7f39 100644 --- a/configure.ac +++ b/configure.ac @@ -77,6 +77,23 @@ AC_ARG_WITH(config-file, AC_DEFINE_UNQUOTED(DEFCONFIG, "$configfile", [Path to the default config file.]) -AC_CHECK_FUNCS([openpty setenv setproctitle]) +AC_CHECK_HEADERS([sys/pstat.h]) +AC_CHECK_FUNCS([openpty setenv setproctitle pstat]) + +if test "$ac_cv_func_setproctitle" = no; then + SETPROCTITLE_C=setproctitle.c + if test "$ac_cv_func_pstat" = yes; then + AC_DEFINE(SPT_TYPE,SPT_PSTAT,[Type of setproctitle emulation to use.]) + else + AC_DEFINE(SPT_TYPE,SPT_REUSEARGV) + fi +else + SETPROCTITLE_C="" +fi + + + +AC_SUBST(SETPROCTITLE_C) + AC_CONFIG_FILES(Makefile) AC_OUTPUT diff --git a/dgamelaunch.c b/dgamelaunch.c index 0a4da9e..818fff5 100644 --- a/dgamelaunch.c +++ b/dgamelaunch.c @@ -88,6 +88,7 @@ extern int editor_main (int argc, char **argv); /* global variables */ +char * __progname; char rcfilename[80]; int f_num = 0; @@ -792,9 +793,7 @@ autologin (char* user, char *pass) { loggedin = 1; snprintf (rcfilename, 80, "%srcfiles/%s.nethackrc", myconfig->dglroot, me->username); -#ifdef HAVE_SETPROCTITLE setproctitle ("%s", me->username); -#endif } } } @@ -857,9 +856,7 @@ loginprompt (int from_ttyplay) { loggedin = 1; snprintf (rcfilename, 80, "%srcfiles/%s.nethackrc", myconfig->dglroot, me->username); -#ifdef HAVE_SETPROCTITLE setproctitle ("%s", me->username); -#endif } else { @@ -1008,9 +1005,7 @@ newuser () loggedin = 1; snprintf (rcfilename, 80, "%srcfiles/%s.nethackrc", myconfig->dglroot, me->username); -#ifdef HAVE_SETPROCTITLE setproctitle ("%s", me->username); -#endif if (access (rcfilename, R_OK) == -1) write_canned_rcfile (rcfilename); @@ -1676,6 +1671,24 @@ main (int argc, char** argv) int c; int nhext = 0, nhauth = 0; +#ifndef HAVE_SETPROCTITLE + /* save argc, argv */ + char** saved_argv; + int saved_argc, i; + + saved_argc = argc; + + saved_argv = malloc(sizeof(char**) * (argc + 1)); + for (i = 0; i < argc; i++) + saved_argv[i] = strdup(argv[i]); + saved_argv[i] = '\0'; + + compat_init_setproctitle(argc, argv); + argv = saved_argv; +#endif + + __progname = basename(strdup(argv[0])); + while ((c = getopt(argc, argv, "qh:pf:ae")) != -1) { switch (c) @@ -1710,9 +1723,7 @@ main (int argc, char** argv) size_t len = strlen(argv[optind]); memset(argv[optind++], 0, len); } -#ifdef HAVE_SETPROCTITLE setproctitle ("(not logged in)"); -#endif create_config(); @@ -1815,9 +1826,7 @@ main (int argc, char** argv) while (!purge_stale_locks()) menuloop(); -#ifdef HAVE_SETPROCTITLE setproctitle ("%s [playing]", me->username); -#endif endwin (); signal(SIGWINCH, SIG_DFL); diff --git a/dgamelaunch.h b/dgamelaunch.h index 72dbeca..692cbe8 100644 --- a/dgamelaunch.h +++ b/dgamelaunch.h @@ -3,6 +3,7 @@ #ifndef __DGAMELAUNCH_H #define __DGAMELAUNCH_H +#include "config.h" #include #include #include @@ -97,6 +98,10 @@ extern int mysetenv (const char* name, const char* value, int overwrite); #else # define mysetenv setenv #endif +#ifndef HAVE_SETPROCTITLE +void compat_init_setproctitle(int argc, char *argv[]); +void setproctitle(const char *fmt, ...); +#endif /* strlcpy.c */ extern size_t strlcpy (char *dst, const char *src, size_t siz); diff --git a/setproctitle.c b/setproctitle.c new file mode 100644 index 0000000..30eb7ea --- /dev/null +++ b/setproctitle.c @@ -0,0 +1,155 @@ +/* Based on conf.c from UCB sendmail 8.8.8 */ + +/* + * Copyright 2003 Damien Miller + * Copyright (c) 1983, 1995-1997 Eric P. Allman + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#include "dgamelaunch.h" + +#include +#include +#include +#include +#include +#ifdef HAVE_SYS_PSTAT_H +#include +#endif + +#define SPT_NONE 0 /* don't use it at all */ +#define SPT_PSTAT 1 /* use pstat(PSTAT_SETCMD, ...) */ +#define SPT_REUSEARGV 2 /* cover argv with title information */ + +#ifndef SPT_TYPE +# define SPT_TYPE SPT_NONE +#endif + +#ifndef SPT_PADCHAR +# define SPT_PADCHAR '\0' +#endif + +#if SPT_TYPE == SPT_REUSEARGV +static char *argv_start = NULL; +static size_t argv_env_len = 0; +#endif + +void +compat_init_setproctitle(int argc, char *argv[]) +{ +#if defined(SPT_TYPE) && SPT_TYPE == SPT_REUSEARGV + extern char **environ; + char *lastargv = NULL; + char **envp = environ; + int i; + + /* + * NB: This assumes that argv has already been copied out of the + * way. This is true for sshd, but may not be true for other + * programs. Beware. + */ + + if (argc == 0 || argv[0] == NULL) + return; + + /* Fail if we can't allocate room for the new environment */ + for (i = 0; envp[i] != NULL; i++) + ; + if ((environ = malloc(sizeof(*environ) * (i + 1))) == NULL) { + environ = envp; /* put it back */ + return; + } + + /* + * Find the last argv string or environment variable within + * our process memory area. + */ + for (i = 0; i < argc; i++) { + if (lastargv == NULL || lastargv + 1 == argv[i]) + lastargv = argv[i] + strlen(argv[i]); + } + for (i = 0; envp[i] != NULL; i++) { + if (lastargv + 1 == envp[i]) + lastargv = envp[i] + strlen(envp[i]); + } + + argv[1] = NULL; + argv_start = argv[0]; + argv_env_len = lastargv - argv[0] - 1; + + /* + * Copy environment + * XXX - will truncate env on strdup fail + */ + for (i = 0; envp[i] != NULL; i++) + environ[i] = strdup(envp[i]); + environ[i] = NULL; +#endif /* SPT_REUSEARGV */ +} + +void +setproctitle(const char *fmt, ...) +{ +#if SPT_TYPE != SPT_NONE + va_list ap; + char buf[1024]; + size_t len; + extern char *__progname; +#if SPT_TYPE == SPT_PSTAT + union pstun pst; +#endif + +#if SPT_TYPE == SPT_REUSEARGV + if (argv_env_len <= 0) + return; +#endif + + strlcpy(buf, __progname, sizeof(buf)); + + va_start(ap, fmt); + if (fmt != NULL) { + len = strlcat(buf, ": ", sizeof(buf)); + if (len < sizeof(buf)) + vsnprintf(buf + len, sizeof(buf) - len , fmt, ap); + } + va_end(ap); + +#if SPT_TYPE == SPT_PSTAT + pst.pst_command = buf; + pstat(PSTAT_SETCMD, pst, strlen(buf), 0, 0); +#elif SPT_TYPE == SPT_REUSEARGV +/* debug("setproctitle: copy \"%s\" into len %d", + buf, argv_env_len); */ + len = strlcpy(argv_start, buf, argv_env_len); + for(; len < argv_env_len; len++) + argv_start[len] = SPT_PADCHAR; +#endif + +#endif /* SPT_NONE */ +} -- 2.47.3