/* * Returns the current ps_buffer value into string. On some platforms * the string will not be null-terminated, so return the effective * length into *displen. * The return code indicates the error. */ int get_ps_title(int *displen, const char** string) { int rc = is_ps_title_available(); if (rc != PS_TITLE_SUCCESS) return rc; #ifdef PS_USE_WIN32 { MyGetConsoleTitle get_title = NULL; HMODULE hMod = LoadLibrary("kernel32.dll"); if (!hMod) { return PS_TITLE_WINDOWS_ERROR; } /* NOTE we don't use _UNICODE*/ get_title = (MyGetConsoleTitle)GetProcAddress(hMod, "GetConsoleTitleA"); if (!get_title) { return PS_TITLE_WINDOWS_ERROR; } if (!(ps_buffer_cur_len = get_title(ps_buffer, (DWORD)ps_buffer_size))) { return PS_TITLE_WINDOWS_ERROR; } } #endif *displen = (int)ps_buffer_cur_len; *string = ps_buffer; return PS_TITLE_SUCCESS; }
/* * Set a new process title. * Returns the appropriate error code if if there's an error * (like the functionality is compile time disabled, or the * save_ps_args() was not called. * Else returns 0 on success. */ int set_ps_title(const char* title) { int rc = is_ps_title_available(); if (rc != PS_TITLE_SUCCESS) return rc; strncpy(ps_buffer, title, ps_buffer_size); ps_buffer[ps_buffer_size - 1] = '\0'; ps_buffer_cur_len = strlen(ps_buffer); #ifdef PS_USE_SETPROCTITLE setproctitle("%s", ps_buffer); #endif #ifdef PS_USE_PSTAT { union pstun pst; pst.pst_command = ps_buffer; pstat(PSTAT_SETCMD, pst, ps_buffer_cur_len, 0, 0); } #endif /* PS_USE_PSTAT */ #ifdef PS_USE_PS_STRINGS PS_STRINGS->ps_nargvstr = 1; PS_STRINGS->ps_argvstr = ps_buffer; #endif /* PS_USE_PS_STRINGS */ #ifdef PS_USE_CLOBBER_ARGV /* pad unused memory */ if (ps_buffer_cur_len < ps_buffer_size) { memset(ps_buffer + ps_buffer_cur_len, PS_PADDING, ps_buffer_size - ps_buffer_cur_len); } #endif /* PS_USE_CLOBBER_ARGV */ #ifdef PS_USE_WIN32 { MySetConsoleTitle set_title = NULL; HMODULE hMod = LoadLibrary("kernel32.dll"); if (!hMod) { return PS_TITLE_WINDOWS_ERROR; } /* NOTE we don't use _UNICODE*/ set_title = (MySetConsoleTitle)GetProcAddress(hMod, "SetConsoleTitleA"); if (!set_title) { return PS_TITLE_WINDOWS_ERROR; } if (!set_title(ps_buffer)) { return PS_TITLE_WINDOWS_ERROR; } } #endif /* PS_USE_WIN32 */ return PS_TITLE_SUCCESS; }
/* * Returns the current ps_buffer value into string. On some platforms * the string will not be null-terminated, so return the effective * length into *displen. * The return code indicates the error. */ int get_ps_title(int *displen, const char** string) { int rc = is_ps_title_available(); if (rc != PS_TITLE_SUCCESS) return rc; #ifdef PS_USE_WIN32 { wchar_t ps_buffer_w[MAX_PATH]; char *tmp; if (!(ps_buffer_cur_len = GetConsoleTitleW(ps_buffer_w, (DWORD)sizeof(ps_buffer_w)))) { return PS_TITLE_WINDOWS_ERROR; } tmp = php_win32_cp_conv_w_to_any(ps_buffer_w, PHP_WIN32_CP_IGNORE_LEN, &ps_buffer_cur_len); if (!tmp) { return PS_TITLE_WINDOWS_ERROR; } ps_buffer_cur_len = ps_buffer_cur_len > sizeof(ps_buffer)-1 ? sizeof(ps_buffer)-1 : ps_buffer_cur_len; memmove(ps_buffer, tmp, ps_buffer_size); ps_buffer[ps_buffer_cur_len] = '\0'; free(tmp); } #endif *displen = (int)ps_buffer_cur_len; *string = ps_buffer; return PS_TITLE_SUCCESS; }
/* * Set a new process title. * Returns the appropriate error code if if there's an error * (like the functionality is compile time disabled, or the * save_ps_args() was not called. * Else returns 0 on success. */ int set_ps_title(const char* title) { int rc = is_ps_title_available(); if (rc != PS_TITLE_SUCCESS) return rc; strncpy(ps_buffer, title, ps_buffer_size); ps_buffer[ps_buffer_size - 1] = '\0'; ps_buffer_cur_len = strlen(ps_buffer); #ifdef PS_USE_SETPROCTITLE setproctitle("%s", ps_buffer); #endif #ifdef PS_USE_PSTAT { union pstun pst; pst.pst_command = ps_buffer; pstat(PSTAT_SETCMD, pst, ps_buffer_cur_len, 0, 0); } #endif /* PS_USE_PSTAT */ #ifdef PS_USE_PS_STRINGS PS_STRINGS->ps_nargvstr = 1; PS_STRINGS->ps_argvstr = ps_buffer; #endif /* PS_USE_PS_STRINGS */ #ifdef PS_USE_CLOBBER_ARGV /* pad unused memory */ if (ps_buffer_cur_len < ps_buffer_size) { memset(ps_buffer + ps_buffer_cur_len, PS_PADDING, ps_buffer_size - ps_buffer_cur_len); } #endif /* PS_USE_CLOBBER_ARGV */ #ifdef PS_USE_WIN32 { wchar_t *ps_buffer_w = php_win32_cp_any_to_w(ps_buffer); if (!ps_buffer_w || !SetConsoleTitleW(ps_buffer_w)) { return PS_TITLE_WINDOWS_ERROR; } free(ps_buffer_w); } #endif /* PS_USE_WIN32 */ return PS_TITLE_SUCCESS; }
/* * Returns the current ps_buffer value into string. On some platforms * the string will not be null-terminated, so return the effective * length into *displen. * The return code indicates the error. */ int get_ps_title(int *displen, const char** string) { int rc = is_ps_title_available(); if (rc != PS_TITLE_SUCCESS) return rc; #ifdef PS_USE_WIN32 if (!(ps_buffer_cur_len = GetConsoleTitle(ps_buffer, (DWORD)ps_buffer_size))) return PS_TITLE_WINDOWS_ERROR; #endif *displen = (int)ps_buffer_cur_len; *string = ps_buffer; return PS_TITLE_SUCCESS; }