Logo Search packages:      
Sourcecode: dante version File versions

setproctitle.c

/* $Id: setproctitle.c,v 1.4 1999/05/13 16:35:57 karls Exp $ */

#ifdef HAVE_CONFIG_H
#include "autoconf.h"
#endif  /* HAVE_CONFIG_H */

#include "common.h"

#if !HAVE_SETPROCTITLE

#if 0
/* ---> minor changes were made to include some macros from other files
   in the sendmail distribution and and remove others */
/*
 * 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. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    This product includes software developed by the University of
 *    California, Berkeley and its contributors.
 * 4. 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.
 */

#if 0
#ifndef lint
static char sccsid[] = "@(#)conf.c  8.379 (Berkeley) 10/20/97";
#endif /* not lint */
#endif

#if 0
# include "sendmail.h"
# include "pathnames.h"
# include <sys/ioctl.h>
# include <sys/param.h>
#endif

# ifdef STDC_HEADERS

#if 0
# include <stdarg.h>
#endif

# define VA_LOCAL_DECL  va_list ap;
# define VA_START(f)    va_start(ap, f)
# define VA_END         va_end(ap)

# else

#if 0
# include <varargs.h>
#endif

# define VA_LOCAL_DECL  va_list ap;
# define VA_START(f)    va_start(ap)
# define VA_END         va_end(ap)

# endif

/* return number of bytes left in a buffer */
#define SPACELEFT(buf, ptr)   (sizeof buf - ((ptr) - buf))

/*
**  SETPROCTITLE -- set process title for ps
**
**    Parameters:
**          fmt -- a printf style format string.
**          a, b, c -- possible parameters to fmt.
**
**    Returns:
**          none.
**
**    Side Effects:
**          Clobbers argv of our main procedure so ps(1) will
**          display the title.
*/

#define SPT_NONE  0     /* don't use it at all */
#define SPT_REUSEARGV   1     /* cover argv with title information */
#define SPT_BUILTIN     2     /* use libc builtin */
#define SPT_PSTAT 3     /* use pstat(PSTAT_SETCMD, ...) */
#define SPT_PSSTRINGS   4     /* use PS_STRINGS->... */
#define SPT_SYSMIPS     5     /* use sysmips() supported by NEWS-OS 6 */
#define SPT_SCO         6     /* write kernel u. area */
#define SPT_CHANGEARGV  7     /* write our own strings into argv[] */

# define MAXLINE  2048        /* max line length */

#ifndef SPT_TYPE
# define SPT_TYPE SPT_REUSEARGV
#endif

#if SPT_TYPE != SPT_NONE && SPT_TYPE != SPT_BUILTIN

# if SPT_TYPE == SPT_PSTAT
#  include <sys/pstat.h>
# endif
# if SPT_TYPE == SPT_PSSTRINGS
#  include <machine/vmparam.h>
#  include <sys/exec.h>
#  ifndef PS_STRINGS    /* hmmmm....  apparently not available after all */
#   undef SPT_TYPE
#   define SPT_TYPE     SPT_REUSEARGV
#  else
#   ifndef NKPDE              /* FreeBSD 2.0 */
#    define NKPDE 63
typedef unsigned int    *pt_entry_t;
#   endif
#  endif
# endif

# if SPT_TYPE == SPT_PSSTRINGS || SPT_TYPE == SPT_CHANGEARGV
#  define SETPROC_STATIC      static
# else
#  define SETPROC_STATIC
# endif

# if SPT_TYPE == SPT_SYSMIPS
#  include <sys/sysmips.h>
#  include <sys/sysnews.h>
# endif

# if SPT_TYPE == SPT_SCO
#  include <sys/immu.h>
#  include <sys/dir.h>
#  include <sys/user.h>
#  include <sys/fs/s5param.h>
#  if PSARGSZ > MAXLINE
#   define SPT_BUFSIZE  PSARGSZ
#  endif
# endif

# ifndef SPT_PADCHAR
#  define SPT_PADCHAR   ' '
# endif

# ifndef SPT_BUFSIZE
#  define SPT_BUFSIZE   MAXLINE
# endif

#endif /* SPT_TYPE != SPT_NONE && SPT_TYPE != SPT_BUILTIN */

/*
**  Pointers for setproctitle.
**    This allows "ps" listings to give more useful information.
*/

char        **Argv = NULL;          /* pointer to argument vector */
char        *LastArgv = NULL; /* end of argv */

int
initsetproctitle(argc, argv, envp)
      int argc;
      char **argv;
      char **envp;
{
      register int i, envpsize = 0;
      extern char **environ;

      /*
      **  Move the environment so setproctitle can use the space at
      **  the top of memory.
      */

      for (i = 0; envp[i] != NULL; i++)
            envpsize += strlen(envp[i]) + 1;
      environ = (char **) malloc(sizeof (char *) * (i + 1));
      if (environ == NULL)
            return -1;
      /* ---> removed some macro calls */
      for (i = 0; envp[i] != NULL; i++) {
            size_t len = strlen(envp[i]) + 1;
            char *p = malloc(len);
            if (p == NULL)
                  return -1;
            environ[i] = strncpy(p, envp[i], len);
            p[len - 1] = NUL;
      }
      environ[i] = NULL;

      /*
      **  Save start and extent of argv for setproctitle.
      */

      Argv = argv;

      /*
      **  Find the last environment variable within sendmail's
      **  process memory area.
      */
      while (i > 0 && (envp[i - 1] < argv[0] ||
                   envp[i - 1] > (argv[argc - 1] +
                              strlen(argv[argc - 1]) + 1 + envpsize)))
            i--;

      if (i > 0)
            LastArgv = envp[i - 1] + strlen(envp[i - 1]);
      else
            LastArgv = argv[argc - 1] + strlen(argv[argc - 1]);

      return 0;
}

#if SPT_TYPE != SPT_BUILTIN


/*VARARGS1*/
void
# ifdef STDC_HEADERS
setproctitle(const char *fmt, ...)
# else
setproctitle(fmt, va_alist)
      const char *fmt;
      va_dcl
# endif /* STDC_HEADERS */
{
# if SPT_TYPE != SPT_NONE
      register char *p;
      register int i;
      SETPROC_STATIC char buf[SPT_BUFSIZE];
      VA_LOCAL_DECL
#  if SPT_TYPE == SPT_PSTAT
      union pstun pst;
#  endif
#  if SPT_TYPE == SPT_SCO
      off_t seek_off;
      static int kmem = -1;
      static int kmempid = -1;
      struct user u;
#  endif

      p = buf;

#if 0
#ifdef SOCKS_SERVER /* XXX only complied once now */
      snprintf(p, SPACELEFT(buf, p), "%s: ", __progname);
      p += strlen(p);
#endif  /* SOCKS_SERVER */
#endif

      /* print the argument string */
      VA_START(fmt);
      vsnprintf(p, SPACELEFT(buf, p), fmt, ap);
      VA_END;

      i = strlen(buf);

#  if SPT_TYPE == SPT_PSTAT
      pst.pst_command = buf;
      pstat(PSTAT_SETCMD, pst, i, 0, 0);
#  endif
#  if SPT_TYPE == SPT_PSSTRINGS
      PS_STRINGS->ps_nargvstr = 1;
      PS_STRINGS->ps_argvstr = buf;
#  endif
#  if SPT_TYPE == SPT_SYSMIPS
      sysmips(SONY_SYSNEWS, NEWS_SETPSARGS, buf);
#  endif
#  if SPT_TYPE == SPT_SCO
      if (kmem < 0 || kmempid != getpid())
      {
            if (kmem >= 0)
                  close(kmem);
            kmem = open(_PATH_KMEM, O_RDWR, 0);
            if (kmem < 0)
                  return;
            (void) fcntl(kmem, F_SETFD, 1);
            kmempid = getpid();
      }
      buf[PSARGSZ - 1] = '\0';
      seek_off = UVUBLK + (off_t) u.u_psargs - (off_t) &u;
      if (lseek(kmem, (off_t) seek_off, SEEK_SET) == seek_off)
            (void) write(kmem, buf, PSARGSZ);
#  endif
#  if SPT_TYPE == SPT_REUSEARGV
      if (i > LastArgv - Argv[0] - 2)
      {
            i = LastArgv - Argv[0] - 2;
            buf[i] = '\0';
      }
      (void) strcpy(Argv[0], buf);
      p = &Argv[0][i];
      while (p < LastArgv)
            *p++ = SPT_PADCHAR;
      Argv[1] = NULL;
#  endif
#  if SPT_TYPE == SPT_CHANGEARGV
      Argv[0] = buf;
      Argv[1] = 0;
#  endif
# endif /* SPT_TYPE != SPT_NONE */
}

#endif /* SPT_TYPE != SPT_BUILTIN */
#else /* !0 */
int
initsetproctitle(argc, argv, envp)
      int argc;
      char **argv;
      char **envp;
{
      return 0;
}
void
#ifdef STDC_HEADERS
setproctitle(const char *fmt, ...)
#else
setproctitle(va_alist)
      va_dcl
#endif  /* STDC_HEADERS */
{
      return;
}
#endif /* 0 */
#else
static void avoid_error __P((void));
static void avoid_error()
{
      avoid_error();
}
#endif  /* !HAVE_SETPROCTITLE */

Generated by  Doxygen 1.6.0   Back to index