blob: 15b2831ab36674385ddb5d43f8f9f3f4b56c451b [file] [log] [blame]
Jean-Baptiste Querub56ea2a2013-01-08 11:11:20 -08001/*
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#include <jni.h>
18#if defined(WIN32)
19#include <windows.h>
20#else
21#include <signal.h>
22#include <unistd.h>
23#include <stdlib.h>
24#include <stdio.h>
25#include <string.h>
26
27int isKernel26OrHigher();
28#endif
29
30JNIEXPORT 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
63int 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