aboutsummaryrefslogtreecommitdiffstats
path: root/erts/test/nt_SUITE_data/nt_info.c
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
committerErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
commit84adefa331c4159d432d22840663c38f155cd4c1 (patch)
treebff9a9c66adda4df2106dfd0e5c053ab182a12bd /erts/test/nt_SUITE_data/nt_info.c
downloadotp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz
otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2
otp-84adefa331c4159d432d22840663c38f155cd4c1.zip
The R13B03 release.OTP_R13B03
Diffstat (limited to 'erts/test/nt_SUITE_data/nt_info.c')
-rw-r--r--erts/test/nt_SUITE_data/nt_info.c176
1 files changed, 176 insertions, 0 deletions
diff --git a/erts/test/nt_SUITE_data/nt_info.c b/erts/test/nt_SUITE_data/nt_info.c
new file mode 100644
index 0000000000..33cf046bb6
--- /dev/null
+++ b/erts/test/nt_SUITE_data/nt_info.c
@@ -0,0 +1,176 @@
+/*
+ * %CopyrightBegin%
+ *
+ * Copyright Ericsson AB 1998-2009. All Rights Reserved.
+ *
+ * The contents of this file are subject to the Erlang Public License,
+ * Version 1.1, (the "License"); you may not use this file except in
+ * compliance with the License. You should have received a copy of the
+ * Erlang Public License along with this software. If not, it can be
+ * retrieved online at http://www.erlang.org/.
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ * the License for the specific language governing rights and limitations
+ * under the License.
+ *
+ * %CopyrightEnd%
+ */
+/*
+ * This is a simple command that gives some interesting
+ * system information on NT.
+ * It is run as a port program by the nt test suite to find out priorities
+ * of programs etc.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined(VXWORKS)
+int nt_info(int argc, char **argv){
+ printf("Hello �lvsj�!\n");
+ return 0;
+}
+#elif !defined(__WIN32__)
+int main(int argc, char **argv){
+ printf("Hello �lvsj�!\n");
+ return 0;
+}
+#else /* Windows NT, here we go... */
+
+#include <windows.h>
+
+
+int erlang_format = 0;
+
+#if 0
+int last_error = 0;
+
+void print_last_error(void){
+ char *mes;
+ FormatMessage(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ (last_error) ? last_error : GetLastError(),
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR) &mes,
+ 0,
+ NULL );
+ fprintf(stderr,"Error: %s",mes);
+ LocalFree(mes);
+}
+#endif
+
+typedef BOOL (WINAPI *tEnumProcesses)(DWORD *, DWORD, DWORD *);
+typedef BOOL (WINAPI *tEnumProcessModules)(HANDLE, HMODULE *, DWORD, DWORD *);
+typedef DWORD (WINAPI *tGetModuleBaseName)(HANDLE, HMODULE, char *, DWORD);
+
+static tGetModuleBaseName pGetModuleBaseName = NULL;
+static tEnumProcessModules pEnumProcessModules = NULL;
+static tEnumProcesses pEnumProcesses = NULL;
+
+static BOOL init_fpointers(void){
+ HINSTANCE instance = LoadLibrary("PSAPI.DLL");
+ if(instance == NULL){
+ fprintf(stderr,"Failed to load PSAPI.DLL.\n");
+ return FALSE;
+ }
+ if((pEnumProcesses =
+ (tEnumProcesses) GetProcAddress(instance,"EnumProcesses")) ==
+ NULL){
+ fprintf(stderr,"Failed to find EnumProcesses in DLL.\n");
+ return FALSE;
+ }
+ if((pEnumProcessModules =
+ (tEnumProcessModules) GetProcAddress(instance,"EnumProcessModules")) ==
+ NULL){
+ fprintf(stderr,"Failed to find EnumProcessModules in DLL.\n");
+ return FALSE;
+ }
+ if((pGetModuleBaseName =
+ (tGetModuleBaseName) GetProcAddress(instance,"GetModuleBaseNameA")) ==
+ NULL){
+ fprintf(stderr,"Failed to find GetModuleBaseName in DLL.\n");
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+void one_line(DWORD pid){
+ char pname[MAX_PATH] = "???";
+ HMODULE hmod = NULL;
+ DWORD dummy;
+ DWORD priority = -1;
+ struct {
+ DWORD sym;
+ char *txt;
+ } tab[] = {
+ {HIGH_PRIORITY_CLASS,"high"},
+ {IDLE_PRIORITY_CLASS, "idle"},
+ {NORMAL_PRIORITY_CLASS,"normal"},
+ {REALTIME_PRIORITY_CLASS, "realtime"}
+ };
+ int tabsiz = sizeof(tab)/sizeof(*tab);
+ char *class = "???";
+ int i;
+
+ HANDLE hproc = OpenProcess(PROCESS_QUERY_INFORMATION |
+ PROCESS_VM_READ,
+ FALSE, pid );
+ if(!hproc)
+ goto print;
+ if(!(*pEnumProcessModules)(hproc,&hmod,sizeof(hmod),&dummy))
+ goto print;
+ if(!(*pGetModuleBaseName)(hproc,hmod,pname,sizeof(pname)))
+ goto print;
+ if(!(priority = GetPriorityClass(hproc)))
+ goto print;
+ for(i=0;i<tabsiz;++i)
+ if(tab[i].sym == priority)
+ class = tab[i].txt;
+print:
+ if(erlang_format)
+ printf("{\"%s\", %lu, \"%s\"}%s", pname, pid, class,
+ (erlang_format > 1) ? "" : "\n");
+ else
+ printf("%-32s %8lu %-9s\n", pname, pid, class);
+ if(hproc)
+ CloseHandle(hproc);
+ if(hmod)
+ CloseHandle(hmod);
+}
+
+int do_simple_ps(void){
+ DWORD procs[1024];
+ DWORD num_procs;
+ DWORD needed;
+ int i;
+
+ if(!(*pEnumProcesses)(procs,sizeof(procs),&needed)){
+ fprintf(stderr,"Failed to EnumProcesses\n");
+ return 1;
+ }
+ num_procs = needed / sizeof(DWORD);
+ if(erlang_format > 1)
+ printf("[");
+ for(i=0;i<num_procs;++i){
+ one_line(procs[i]);
+ if(erlang_format > 1 && i < num_procs -1)
+ printf(", ");
+ }
+ if(erlang_format > 1)
+ printf("]. \n");
+ return 0;
+}
+
+int main(int argc, char **argv){
+ if(argc>1 && !strcmp(argv[1],"-e"))
+ erlang_format = 1;
+ else if(argc>1 && !strcmp(argv[1],"-E"))
+ erlang_format = 2;
+ if(!init_fpointers())
+ return 1;
+ return do_simple_ps();
+}
+#endif