Merged SVN plugins
[idea/community.git] / native / breakgen / AppMain.c
1
2 #if defined(WIN32)
3 #include <windows.h>
4 #else
5 #include <jni.h>
6 #include <signal.h>
7 #include <unistd.h>
8 #include <stdlib.h>
9 #include <stdio.h>
10 #include <string.h>
11
12 int isKernel26OrHigher();
13 #endif
14
15 JNIEXPORT void JNICALL Java_com_intellij_rt_execution_application_AppMain_triggerControlBreak
16   (JNIEnv *env, jclass clazz) {
17 #if defined(WIN32)
18   GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0);
19 #else
20   if (isKernel26OrHigher()) {
21     kill (getpid(), SIGQUIT);
22   } else {
23     int ppid = getppid();
24     char buffer[1024];
25     sprintf(buffer, "/proc/%d/status", ppid);
26     FILE * fp;
27     if ( (fp = fopen(buffer, "r")) != NULL )
28     {
29       char s[124];
30       char * ppid_name = "PPid:";
31       while (fscanf (fp, "%s\n", s) > 0) {
32         if (strcmp(s, ppid_name) == 0) {
33           int pppid;
34           fscanf(fp, "%d", &pppid);
35           kill (pppid, SIGQUIT);
36           break;
37         }
38       }
39
40       fclose (fp);
41     }
42   }
43 #endif
44 }
45
46 #ifndef WIN32
47
48 int isKernel26OrHigher() {
49   char buffer[1024];
50   FILE * fp;
51   if ( (fp = fopen("/proc/version", "r")) != NULL )
52   {
53      int major;
54      int minor;
55      fscanf(fp, "Linux version %d.%d", &major, &minor);
56      fclose (fp);
57      if (major < 2) return 0;
58      if (major == 2) return minor >= 6;
59      return 1;  
60   }
61
62   return 0;
63 }
64 #endif