diff --git a/core/org.eclipse.cdt.core.qnx/.classpath b/core/org.eclipse.cdt.core.qnx/.classpath index b9421ac9cee..d317cd64b8f 100644 --- a/core/org.eclipse.cdt.core.qnx/.classpath +++ b/core/org.eclipse.cdt.core.qnx/.classpath @@ -1,5 +1,6 @@ + @@ -9,5 +10,5 @@ - + diff --git a/core/org.eclipse.cdt.core.qnx/.cvsignore b/core/org.eclipse.cdt.core.qnx/.cvsignore new file mode 100644 index 00000000000..ba077a4031a --- /dev/null +++ b/core/org.eclipse.cdt.core.qnx/.cvsignore @@ -0,0 +1 @@ +bin diff --git a/core/org.eclipse.cdt.core.qnx/fragment.xml b/core/org.eclipse.cdt.core.qnx/fragment.xml index 3fa98872a31..d54c4e6d6fe 100644 --- a/core/org.eclipse.cdt.core.qnx/fragment.xml +++ b/core/org.eclipse.cdt.core.qnx/fragment.xml @@ -8,7 +8,14 @@ plugin-version="1.0.0"> + + + + + diff --git a/core/org.eclipse.cdt.core.qnx/src/org/eclipse/cdt/internal/core/qnx/ProcessInfo.java b/core/org.eclipse.cdt.core.qnx/src/org/eclipse/cdt/internal/core/qnx/ProcessInfo.java new file mode 100644 index 00000000000..a72e310e324 --- /dev/null +++ b/core/org.eclipse.cdt.core.qnx/src/org/eclipse/cdt/internal/core/qnx/ProcessInfo.java @@ -0,0 +1,45 @@ +package org.eclipse.cdt.internal.core.qnx; + +import org.eclipse.cdt.core.IProcessInfo; + +/** + * @author alain + * + * To change this generated comment edit the template variable "typecomment": + * Window>Preferences>Java>Templates. + * To enable and disable the creation of type comments go to + * Window>Preferences>Java>Code Generation. + */ +public class ProcessInfo implements IProcessInfo { + + int pid; + String name; + + public ProcessInfo(String pidString, String name) { + try { + pid = Integer.parseInt(pidString); + } catch (NumberFormatException e) { + } + this.name = name; + } + + public ProcessInfo(int pid, String name) { + this.pid = pid; + this.name = name; + } + + /** + * @see org.eclipse.cdt.core.IProcessInfo#getName() + */ + public String getName() { + return name; + } + + /** + * @see org.eclipse.cdt.core.IProcessInfo#getPid() + */ + public int getPid() { + return pid; + } + +} diff --git a/core/org.eclipse.cdt.core.qnx/src/org/eclipse/cdt/internal/core/qnx/ProcessList.java b/core/org.eclipse.cdt.core.qnx/src/org/eclipse/cdt/internal/core/qnx/ProcessList.java new file mode 100644 index 00000000000..87eae3fd318 --- /dev/null +++ b/core/org.eclipse.cdt.core.qnx/src/org/eclipse/cdt/internal/core/qnx/ProcessList.java @@ -0,0 +1,130 @@ +package org.eclipse.cdt.internal.core.qnx; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.StringTokenizer; + +import org.eclipse.cdt.core.IProcessInfo; +import org.eclipse.cdt.core.IProcessList; +import org.eclipse.cdt.utils.spawner.ProcessFactory; + +/** + * Insert the type's description here. + * @see IProcessList + */ +public class ProcessList implements IProcessList { + + ProcessInfo[] empty = new ProcessInfo[0]; + + public ProcessList() { + } + + /** + * Insert the method's description here. + * @see IProcessList#getProcessList + */ + public IProcessInfo [] getProcessList() { + Process pidin; + BufferedReader pidinOutput; + String[] args = {"pidin", "-fan" }; + + try { + pidin = ProcessFactory.getFactory().exec(args); + pidinOutput = new BufferedReader(new InputStreamReader(pidin.getInputStream())); + } catch(Exception e) { + return getProcessListPureJava(); + } + + //Read the output and parse it into an array list + ArrayList procInfo = new ArrayList(); + + String pidStr, nameStr, lastline; + try { + while((lastline = pidinOutput.readLine()) != null) { + //The format of the output should be + //PID a/slash/delimited/name + + StringTokenizer tok = new StringTokenizer(lastline.trim()); + pidStr = tok.nextToken(); + if(pidStr == null || pidStr.charAt(0) < '0' || pidStr.charAt(0) > '9') { + continue; + } + + nameStr = tok.nextToken(); + + int index = nameStr.lastIndexOf('/'); + if(index != -1) { + nameStr = nameStr.substring(index + 1); + } + + procInfo.add(new ProcessInfo(pidStr, nameStr)); + } + + pidin.destroy(); + } catch(Exception e) { + /* Ignore */ + } finally { + pidin.destroy(); + } + + return (IProcessInfo [])procInfo.toArray(new IProcessInfo[procInfo.size()]); + } + + /** + * This is our current backup strategy for getting the pid list + * (reading /proc directly). Currently the exename is not implemented + * so the names will all show up as unknown, but at least you get a + * pid list. + */ + private IProcessInfo [] getProcessListPureJava() { + File proc = new File("/proc"); + File[] pidFiles = null; + + // We are only interrested in the pid so filter the rest out. + try { + FilenameFilter filter = new FilenameFilter() { + public boolean accept(File dir, String name) { + boolean isPID = false; + try { + Integer.parseInt(name); + isPID = true; + } catch (NumberFormatException e) { + } + return isPID; + } + }; + pidFiles = proc.listFiles(filter); + } catch (SecurityException e) { + } + + ProcessInfo[] processInfo = empty; + if (pidFiles != null) { + processInfo = new ProcessInfo[pidFiles.length]; + for (int i = 0; i < pidFiles.length; i++) { + File cmdLine = new File(pidFiles[i], "exename"); + StringBuffer line = new StringBuffer(); + try { + FileReader reader = new FileReader(cmdLine); + int c; + while ((c = reader.read()) > 0) { + line.append((char)c); + } + } catch (IOException e) { + } + String name = line.toString(); + if (name.length() == 0) { + name = "Unknown"; + } + processInfo[i] = new ProcessInfo(pidFiles[i].getName(), name); + } + } else { + pidFiles = new File[0]; + } + return processInfo; + } +}