📄 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 lintstatic 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 63typedef 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 */intinitsetproctitle(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_HEADERSsetproctitle(const char *fmt, ...)# elsesetproctitle(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 */intinitsetproctitle(argc, argv, envp) int argc; char **argv; char **envp;{ return 0;}void#ifdef STDC_HEADERSsetproctitle(const char *fmt, ...)#elsesetproctitle(va_alist) va_dcl#endif /* STDC_HEADERS */{ return;}#endif /* 0 */#elsestatic void avoid_error __P((void));static void avoid_error(){ avoid_error();}#endif /* !HAVE_SETPROCTITLE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -