37 #define compat_init_setproctitle ruby_init_setproctitle
39 #ifndef HAVE_SETPROCTITLE
46 #ifdef HAVE_SYS_PSTAT_H
47 #include <sys/pstat.h>
51 #if defined(__APPLE__)
52 #include <crt_externs.h>
54 #define environ (*_NSGetEnviron())
59 #define SPT_REUSEARGV 2
62 # define SPT_TYPE SPT_NONE
66 # define SPT_PADCHAR '\0'
69 #if SPT_TYPE == SPT_REUSEARGV
70 static char *argv_start =
NULL;
71 static size_t argv_env_len = 0;
72 static size_t argv_len = 0;
80 #if defined(SPT_TYPE) && SPT_TYPE == SPT_REUSEARGV
82 char *lastargv =
NULL;
83 char *lastenvp =
NULL;
93 if (argc == 0 || argv[0] ==
NULL)
97 for (i = 0; envp[
i] !=
NULL; i++)
99 if ((environ =
calloc(i + 1,
sizeof(*environ))) ==
NULL) {
108 for (i = 0; i <
argc; i++) {
109 if (lastargv ==
NULL || lastargv + 1 == argv[i])
110 lastargv = argv[
i] +
strlen(argv[i]);
113 for (i = 0; envp[
i] !=
NULL; i++) {
114 if (lastenvp + 1 == envp[i])
115 lastenvp = envp[
i] +
strlen(envp[i]);
119 argv_start = argv[0];
120 argv_len = lastargv - argv[0];
121 argv_env_len = lastenvp - argv[0];
123 for (i = 0; envp[
i] !=
NULL; i++)
129 #ifndef HAVE_SETPROCTITLE
133 #if SPT_TYPE != SPT_NONE
138 #if SPT_TYPE == SPT_PSTAT
142 #if SPT_TYPE == SPT_REUSEARGV
143 if (argv_env_len <= 0)
149 vsnprintf(ptitle,
sizeof(ptitle) , fmt, ap);
153 #if SPT_TYPE == SPT_PSTAT
154 pst.pst_command = ptitle;
155 pstat(PSTAT_SETCMD, pst,
strlen(ptitle), 0, 0);
156 #elif SPT_TYPE == SPT_REUSEARGV
157 len =
strlcpy(argv_start, ptitle, argv_env_len);
158 argvlen = len > argv_len ? argv_env_len : argv_len;
159 for(; len < argvlen; len++)