setproctitle.c
上传用户:zm130024
上传日期:2007-01-04
资源大小:432k
文件大小:8k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /* $Id: setproctitle.c,v 1.4 1999/05/13 16:35:57 karls Exp $ */
  2. #ifdef HAVE_CONFIG_H
  3. #include "autoconf.h"
  4. #endif  /* HAVE_CONFIG_H */
  5. #include "common.h"
  6. #if !HAVE_SETPROCTITLE
  7. #if 0
  8. /* ---> minor changes were made to include some macros from other files
  9.    in the sendmail distribution and and remove others */
  10. /*
  11.  * Copyright (c) 1983, 1995-1997 Eric P. Allman
  12.  * Copyright (c) 1988, 1993
  13.  * The Regents of the University of California.  All rights reserved.
  14.  *
  15.  * Redistribution and use in source and binary forms, with or without
  16.  * modification, are permitted provided that the following conditions
  17.  * are met:
  18.  * 1. Redistributions of source code must retain the above copyright
  19.  *    notice, this list of conditions and the following disclaimer.
  20.  * 2. Redistributions in binary form must reproduce the above copyright
  21.  *    notice, this list of conditions and the following disclaimer in the
  22.  *    documentation and/or other materials provided with the distribution.
  23.  * 3. All advertising materials mentioning features or use of this software
  24.  *    must display the following acknowledgement:
  25.  * This product includes software developed by the University of
  26.  * California, Berkeley and its contributors.
  27.  * 4. Neither the name of the University nor the names of its contributors
  28.  *    may be used to endorse or promote products derived from this software
  29.  *    without specific prior written permission.
  30.  *
  31.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  32.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  33.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  34.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  35.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  36.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  37.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  38.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  39.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  40.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  41.  * SUCH DAMAGE.
  42.  */
  43. #if 0
  44. #ifndef lint
  45. static char sccsid[] = "@(#)conf.c 8.379 (Berkeley) 10/20/97";
  46. #endif /* not lint */
  47. #endif
  48. #if 0
  49. # include "sendmail.h"
  50. # include "pathnames.h"
  51. # include <sys/ioctl.h>
  52. # include <sys/param.h>
  53. #endif
  54. # ifdef STDC_HEADERS
  55. #if 0
  56. # include <stdarg.h>
  57. #endif
  58. # define VA_LOCAL_DECL va_list ap;
  59. # define VA_START(f) va_start(ap, f)
  60. # define VA_END va_end(ap)
  61. # else
  62. #if 0
  63. # include <varargs.h>
  64. #endif
  65. # define VA_LOCAL_DECL va_list ap;
  66. # define VA_START(f) va_start(ap)
  67. # define VA_END va_end(ap)
  68. # endif
  69. /* return number of bytes left in a buffer */
  70. #define SPACELEFT(buf, ptr) (sizeof buf - ((ptr) - buf))
  71. /*
  72. **  SETPROCTITLE -- set process title for ps
  73. **
  74. ** Parameters:
  75. ** fmt -- a printf style format string.
  76. ** a, b, c -- possible parameters to fmt.
  77. **
  78. ** Returns:
  79. ** none.
  80. **
  81. ** Side Effects:
  82. ** Clobbers argv of our main procedure so ps(1) will
  83. ** display the title.
  84. */
  85. #define SPT_NONE 0 /* don't use it at all */
  86. #define SPT_REUSEARGV 1 /* cover argv with title information */
  87. #define SPT_BUILTIN 2 /* use libc builtin */
  88. #define SPT_PSTAT 3 /* use pstat(PSTAT_SETCMD, ...) */
  89. #define SPT_PSSTRINGS 4 /* use PS_STRINGS->... */
  90. #define SPT_SYSMIPS 5 /* use sysmips() supported by NEWS-OS 6 */
  91. #define SPT_SCO 6 /* write kernel u. area */
  92. #define SPT_CHANGEARGV 7 /* write our own strings into argv[] */
  93. # define MAXLINE 2048 /* max line length */
  94. #ifndef SPT_TYPE
  95. # define SPT_TYPE SPT_REUSEARGV
  96. #endif
  97. #if SPT_TYPE != SPT_NONE && SPT_TYPE != SPT_BUILTIN
  98. # if SPT_TYPE == SPT_PSTAT
  99. #  include <sys/pstat.h>
  100. # endif
  101. # if SPT_TYPE == SPT_PSSTRINGS
  102. #  include <machine/vmparam.h>
  103. #  include <sys/exec.h>
  104. #  ifndef PS_STRINGS /* hmmmm....  apparently not available after all */
  105. #   undef SPT_TYPE
  106. #   define SPT_TYPE SPT_REUSEARGV
  107. #  else
  108. #   ifndef NKPDE /* FreeBSD 2.0 */
  109. #    define NKPDE 63
  110. typedef unsigned int *pt_entry_t;
  111. #   endif
  112. #  endif
  113. # endif
  114. # if SPT_TYPE == SPT_PSSTRINGS || SPT_TYPE == SPT_CHANGEARGV
  115. #  define SETPROC_STATIC static
  116. # else
  117. #  define SETPROC_STATIC
  118. # endif
  119. # if SPT_TYPE == SPT_SYSMIPS
  120. #  include <sys/sysmips.h>
  121. #  include <sys/sysnews.h>
  122. # endif
  123. # if SPT_TYPE == SPT_SCO
  124. #  include <sys/immu.h>
  125. #  include <sys/dir.h>
  126. #  include <sys/user.h>
  127. #  include <sys/fs/s5param.h>
  128. #  if PSARGSZ > MAXLINE
  129. #   define SPT_BUFSIZE PSARGSZ
  130. #  endif
  131. # endif
  132. # ifndef SPT_PADCHAR
  133. #  define SPT_PADCHAR ' '
  134. # endif
  135. # ifndef SPT_BUFSIZE
  136. #  define SPT_BUFSIZE MAXLINE
  137. # endif
  138. #endif /* SPT_TYPE != SPT_NONE && SPT_TYPE != SPT_BUILTIN */
  139. /*
  140. **  Pointers for setproctitle.
  141. ** This allows "ps" listings to give more useful information.
  142. */
  143. char **Argv = NULL; /* pointer to argument vector */
  144. char *LastArgv = NULL; /* end of argv */
  145. int
  146. initsetproctitle(argc, argv, envp)
  147. int argc;
  148. char **argv;
  149. char **envp;
  150. {
  151. register int i, envpsize = 0;
  152. extern char **environ;
  153. /*
  154. **  Move the environment so setproctitle can use the space at
  155. **  the top of memory.
  156. */
  157. for (i = 0; envp[i] != NULL; i++)
  158. envpsize += strlen(envp[i]) + 1;
  159. environ = (char **) malloc(sizeof (char *) * (i + 1));
  160. if (environ == NULL)
  161. return -1;
  162. /* ---> removed some macro calls */
  163. for (i = 0; envp[i] != NULL; i++) {
  164. size_t len = strlen(envp[i]) + 1;
  165. char *p = malloc(len);
  166. if (p == NULL)
  167. return -1;
  168. environ[i] = strncpy(p, envp[i], len);
  169. p[len - 1] = NUL;
  170. }
  171. environ[i] = NULL;
  172. /*
  173. **  Save start and extent of argv for setproctitle.
  174. */
  175. Argv = argv;
  176. /*
  177. **  Find the last environment variable within sendmail's
  178. **  process memory area.
  179. */
  180. while (i > 0 && (envp[i - 1] < argv[0] ||
  181.  envp[i - 1] > (argv[argc - 1] +
  182. strlen(argv[argc - 1]) + 1 + envpsize)))
  183. i--;
  184. if (i > 0)
  185. LastArgv = envp[i - 1] + strlen(envp[i - 1]);
  186. else
  187. LastArgv = argv[argc - 1] + strlen(argv[argc - 1]);
  188. return 0;
  189. }
  190. #if SPT_TYPE != SPT_BUILTIN
  191. /*VARARGS1*/
  192. void
  193. # ifdef STDC_HEADERS
  194. setproctitle(const char *fmt, ...)
  195. # else
  196. setproctitle(fmt, va_alist)
  197. const char *fmt;
  198. va_dcl
  199. # endif /* STDC_HEADERS */
  200. {
  201. # if SPT_TYPE != SPT_NONE
  202. register char *p;
  203. register int i;
  204. SETPROC_STATIC char buf[SPT_BUFSIZE];
  205. VA_LOCAL_DECL
  206. #  if SPT_TYPE == SPT_PSTAT
  207. union pstun pst;
  208. #  endif
  209. #  if SPT_TYPE == SPT_SCO
  210. off_t seek_off;
  211. static int kmem = -1;
  212. static int kmempid = -1;
  213. struct user u;
  214. #  endif
  215. p = buf;
  216. #if 0
  217. #ifdef SOCKS_SERVER /* XXX only complied once now */
  218. snprintf(p, SPACELEFT(buf, p), "%s: ", __progname);
  219. p += strlen(p);
  220. #endif  /* SOCKS_SERVER */
  221. #endif
  222. /* print the argument string */
  223. VA_START(fmt);
  224. vsnprintf(p, SPACELEFT(buf, p), fmt, ap);
  225. VA_END;
  226. i = strlen(buf);
  227. #  if SPT_TYPE == SPT_PSTAT
  228. pst.pst_command = buf;
  229. pstat(PSTAT_SETCMD, pst, i, 0, 0);
  230. #  endif
  231. #  if SPT_TYPE == SPT_PSSTRINGS
  232. PS_STRINGS->ps_nargvstr = 1;
  233. PS_STRINGS->ps_argvstr = buf;
  234. #  endif
  235. #  if SPT_TYPE == SPT_SYSMIPS
  236. sysmips(SONY_SYSNEWS, NEWS_SETPSARGS, buf);
  237. #  endif
  238. #  if SPT_TYPE == SPT_SCO
  239. if (kmem < 0 || kmempid != getpid())
  240. {
  241. if (kmem >= 0)
  242. close(kmem);
  243. kmem = open(_PATH_KMEM, O_RDWR, 0);
  244. if (kmem < 0)
  245. return;
  246. (void) fcntl(kmem, F_SETFD, 1);
  247. kmempid = getpid();
  248. }
  249. buf[PSARGSZ - 1] = '';
  250. seek_off = UVUBLK + (off_t) u.u_psargs - (off_t) &u;
  251. if (lseek(kmem, (off_t) seek_off, SEEK_SET) == seek_off)
  252. (void) write(kmem, buf, PSARGSZ);
  253. #  endif
  254. #  if SPT_TYPE == SPT_REUSEARGV
  255. if (i > LastArgv - Argv[0] - 2)
  256. {
  257. i = LastArgv - Argv[0] - 2;
  258. buf[i] = '';
  259. }
  260. (void) strcpy(Argv[0], buf);
  261. p = &Argv[0][i];
  262. while (p < LastArgv)
  263. *p++ = SPT_PADCHAR;
  264. Argv[1] = NULL;
  265. #  endif
  266. #  if SPT_TYPE == SPT_CHANGEARGV
  267. Argv[0] = buf;
  268. Argv[1] = 0;
  269. #  endif
  270. # endif /* SPT_TYPE != SPT_NONE */
  271. }
  272. #endif /* SPT_TYPE != SPT_BUILTIN */
  273. #else /* !0 */
  274. int
  275. initsetproctitle(argc, argv, envp)
  276. int argc;
  277. char **argv;
  278. char **envp;
  279. {
  280. return 0;
  281. }
  282. void
  283. #ifdef STDC_HEADERS
  284. setproctitle(const char *fmt, ...)
  285. #else
  286. setproctitle(va_alist)
  287. va_dcl
  288. #endif  /* STDC_HEADERS */
  289. {
  290. return;
  291. }
  292. #endif /* 0 */
  293. #else
  294. static void avoid_error __P((void));
  295. static void avoid_error()
  296. {
  297. avoid_error();
  298. }
  299. #endif  /* !HAVE_SETPROCTITLE */