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 # ifdef HAVE_CRT_EXTERNS_H
55 # define environ (*_NSGetEnviron())
63 #define SPT_REUSEARGV 2
66 # define SPT_TYPE SPT_NONE
70 # define SPT_PADCHAR '\0'
73 #if SPT_TYPE == SPT_REUSEARGV
74 static char *argv_start =
NULL;
75 static size_t argv_env_len = 0;
76 static size_t argv_len = 0;
84 #if defined(SPT_TYPE) && SPT_TYPE == SPT_REUSEARGV
86 char *lastargv =
NULL;
87 char *lastenvp =
NULL;
97 if (argc == 0 || argv[0] ==
NULL)
101 for (i = 0; envp[
i] !=
NULL; i++)
103 if ((environ =
calloc(i + 1,
sizeof(*environ))) ==
NULL) {
112 for (i = 0; i <
argc; i++) {
113 if (lastargv ==
NULL || lastargv + 1 == argv[i])
114 lastargv = argv[
i] +
strlen(argv[i]);
117 for (i = 0; envp[
i] !=
NULL; i++) {
118 if (lastenvp + 1 == envp[i])
119 lastenvp = envp[
i] +
strlen(envp[i]);
123 argv_start = argv[0];
124 argv_len = lastargv - argv[0];
125 argv_env_len = lastenvp - argv[0];
127 for (i = 0; envp[
i] !=
NULL; i++)
133 #ifndef HAVE_SETPROCTITLE
137 #if SPT_TYPE != SPT_NONE
142 #if SPT_TYPE == SPT_PSTAT
146 #if SPT_TYPE == SPT_REUSEARGV
147 if (argv_env_len <= 0)
153 vsnprintf(ptitle,
sizeof(ptitle) , fmt, ap);
157 #if SPT_TYPE == SPT_PSTAT
158 pst.pst_command = ptitle;
159 pstat(PSTAT_SETCMD, pst,
strlen(ptitle), 0, 0);
160 #elif SPT_TYPE == SPT_REUSEARGV
161 len =
strlcpy(argv_start, ptitle, argv_env_len);
162 argvlen = len > argv_len ? argv_env_len : argv_len;
163 for(; len < argvlen; len++)
size_t strlen(const char *)
char * ruby_strdup(const char *)
#define compat_init_setproctitle
RUBY_EXTERN size_t strlcpy(char *, const char *, size_t)
void setproctitle(const char *fmt,...)