copyrights in native sources
[idea/community.git] / native / breakgen / AppMain.c
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #if defined(WIN32)
18 #include <windows.h>
19 #else
20 #include <jni.h>
21 #include <signal.h>
22 #include <unistd.h>
23 #include <stdlib.h>
24 #include <stdio.h>
25 #include <string.h>
26
27 int isKernel26OrHigher();
28 #endif
29
30 JNIEXPORT void JNICALL Java_com_intellij_rt_execution_application_AppMain_triggerControlBreak
31   (JNIEnv *env, jclass clazz) {
32 #if defined(WIN32)
33   GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0);
34 #else
35   if (isKernel26OrHigher()) {
36     kill (getpid(), SIGQUIT);
37   } else {
38     int ppid = getppid();
39     char buffer[1024];
40     sprintf(buffer, "/proc/%d/status", ppid);
41     FILE * fp;
42     if ( (fp = fopen(buffer, "r")) != NULL )
43     {
44       char s[124];
45       char * ppid_name = "PPid:";
46       while (fscanf (fp, "%s\n", s) > 0) {
47         if (strcmp(s, ppid_name) == 0) {
48           int pppid;
49           fscanf(fp, "%d", &pppid);
50           kill (pppid, SIGQUIT);
51           break;
52         }
53       }
54
55       fclose (fp);
56     }
57   }
58 #endif
59 }
60
61 #ifndef WIN32
62
63 int isKernel26OrHigher() {
64   char buffer[1024];
65   FILE * fp;
66   if ( (fp = fopen("/proc/version", "r")) != NULL )
67   {
68      int major;
69      int minor;
70      fscanf(fp, "Linux version %d.%d", &major, &minor);
71      fclose (fp);
72      if (major < 2) return 0;
73      if (major == 2) return minor >= 6;
74      return 1;  
75   }
76
77   return 0;
78 }
79 #endif