33#include "config.w32.h"
38#include <php_config.h>
54#ifdef HAVE_SYS_PSTAT_H
58#include <machine/vmparam.h>
62#include <crt_externs.h>
89#if defined(HAVE_SETPROCTITLE)
90#define PS_USE_SETPROCTITLE
91#elif defined(HAVE_SYS_PSTAT_H) && defined(PSTAT_SETCMD)
93#elif defined(HAVE_PS_STRINGS)
94#define PS_USE_PS_STRINGS
95#elif defined(BSD) && !defined(__APPLE__)
96#define PS_USE_CHANGE_ARGV
97#elif defined(__linux__) || defined(_AIX) || defined(__sgi) || (defined(sun) && !defined(BSD)) || defined(ultrix) || defined(__osf__) || defined(__APPLE__)
98#define PS_USE_CLOBBER_ARGV
99#elif defined(PHP_WIN32)
106#if defined(_AIX) || defined(__linux__) || defined(__APPLE__)
107#define PS_PADDING '\0'
109#define PS_PADDING ' '
113static char windows_error_details[64];
114static char ps_buffer[MAX_PATH];
115static const size_t ps_buffer_size = MAX_PATH;
116#elif defined(PS_USE_CLOBBER_ARGV)
117static char *ps_buffer;
118static size_t ps_buffer_size;
119static char *empty_environ[] = {0};
121#define PS_BUFFER_SIZE 256
126static size_t ps_buffer_cur_len;
130static char** save_argv;
136#if defined(PS_USE_CLOBBER_ARGV)
137static char** frozen_environ, **new_environ;
152#if defined(PS_USE_CLOBBER_ARGV)
158 char* end_of_area =
NULL;
159 bool is_contiguous_area =
true;
165 for (i = 0; is_contiguous_area && (i < argc); i++)
167 if (i != 0 && end_of_area + 1 != argv[i]) {
168 is_contiguous_area =
false;
170 end_of_area = argv[i] +
strlen(argv[i]);
173 if (!is_contiguous_area) {
182 if (end_of_area + 1 ==
environ[i]) {
188 ps_buffer_size = end_of_area - argv[0];
193 new_environ = (
char **) malloc((i + 1) *
sizeof(
char *));
194 frozen_environ = (
char **) malloc((i + 1) *
sizeof(
char *));
195 if (!new_environ || !frozen_environ) {
200 new_environ[i] = strdup(
environ[i]);
204 new_environ[i] =
NULL;
206 memcpy((
char *)frozen_environ, (
char *)new_environ,
sizeof(
char *) * (i + 1));
211#if defined(PS_USE_CHANGE_ARGV) || defined(PS_USE_CLOBBER_ARGV)
226 new_argv = (
char **) malloc((argc + 1) *
sizeof(
char *));
229 for (i = 0; i < argc; i++)
231 new_argv[i] = strdup(argv[i]);
237 new_argv[argc] =
NULL;
239#if defined(__APPLE__)
244 *_NSGetArgv() = new_argv;
252#if defined(PS_USE_CLOBBER_ARGV)
256 for (i = 1; i < save_argc; i++)
257 save_argv[i] = ps_buffer + ps_buffer_size;
261#ifdef PS_USE_CHANGE_ARGV
262 save_argv[0] = ps_buffer;
268#if defined(PS_USE_CHANGE_ARGV) || defined(PS_USE_CLOBBER_ARGV)
296#ifdef PS_USE_CLOBBER_ARGV
315 return "Not available on this OS";
318 return "Not initialized correctly";
321 return "Buffer not contiguous";
325 snprintf(windows_error_details,
sizeof(windows_error_details),
"Windows error code: %lu", GetLastError());
326 return windows_error_details;
330 return "Unknown error code";
346 size_t title_len =
strlcpy(ps_buffer, title, ps_buffer_size);
347 ps_buffer_cur_len = (title_len >= ps_buffer_size) ? ps_buffer_size - 1 : title_len;
349#ifdef PS_USE_SETPROCTITLE
350 setproctitle(
"%s", ps_buffer);
357 pst.pst_command = ps_buffer;
358 pstat(PSTAT_SETCMD, pst, ps_buffer_cur_len, 0, 0);
362#ifdef PS_USE_PS_STRINGS
363 PS_STRINGS->ps_nargvstr = 1;
364 PS_STRINGS->ps_argvstr = ps_buffer;
367#ifdef PS_USE_CLOBBER_ARGV
369 if (ps_buffer_cur_len < ps_buffer_size)
372 ps_buffer_size - ps_buffer_cur_len);
380 if (!ps_buffer_w || !SetConsoleTitleW(ps_buffer_w)) {
405 wchar_t ps_buffer_w[MAX_PATH];
408 if (!(ps_buffer_cur_len = GetConsoleTitleW(ps_buffer_w, (
DWORD)
sizeof(ps_buffer_w)))) {
417 ps_buffer_cur_len = ps_buffer_cur_len >
sizeof(ps_buffer)-1 ?
sizeof(ps_buffer)-1 : ps_buffer_cur_len;
419 memmove(ps_buffer, tmp, ps_buffer_cur_len);
423 *displen = ps_buffer_cur_len;
443#ifdef PS_USE_CLOBBER_ARGV
446 for (i = 0; frozen_environ[i] !=
NULL; i++)
447 free(frozen_environ[i]);
448 free(frozen_environ);
456#if defined(PS_USE_CHANGE_ARGV) || defined(PS_USE_CLOBBER_ARGV)
459 for (i=0; argv[i] !=
NULL; i++)
#define php_win32_cp_any_to_w(in)
#define PHP_WIN32_CP_IGNORE_LEN
memset(ptr, 0, type->size)
const char * ps_title_errno(int rc)
int is_ps_title_available(void)
void cleanup_ps_args(char **argv)
char ** save_ps_args(int argc, char **argv)
int get_ps_title(size_t *displen, const char **string)
int set_ps_title(const char *title)
#define PS_TITLE_WINDOWS_ERROR
#define PS_TITLE_BUFFER_NOT_AVAILABLE
#define PS_TITLE_NOT_INITIALIZED
#define PS_TITLE_NOT_AVAILABLE