package org.rzo.yajsw.os.posix.solaris;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.channels.FileChannel;
import org.rzo.yajsw.os.Process;
import org.rzo.yajsw.os.posix.PosixProcess;
import com.sun.jna.Memory;
public class SolarisProcess extends PosixProcess
{
/*
* #define PRARGSZ 80 /* number of chars of arguments typedef struct psinfo
* { 0int pr_flag; /* process flags (DEPRECATED; do not use) 4int pr_nlwp;
* /* number of active lwps in the process 8pid_t pr_pid; /* unique process
* id 12pid_t pr_ppid; /* process id of parent 16pid_t pr_pgid; /* pid of
* process group leader 20pid_t pr_sid; /* session id 24uid_t pr_uid; /*
* real user id 28uid_t pr_euid; /* effective user id 32gid_t pr_gid; /*
* real group id 36gid_t pr_egid; /* effective group id 40uintptr_t pr_addr;
* /* address of process 44size_t pr_size; /* size of process image in
* Kbytes 48size_t pr_rssize; /* resident set size in Kbytes 52size_t
* pr_pad1; 56dev_t pr_ttydev; /* controlling tty device (or PRNODEV) /* The
* following percent numbers are 16-bit binary /* fractions [0 .. 1] with
* the binary point to the /* right of the high-order bit (1.0 == 0x8000)
* 60ushort_t pr_pctcpu; /* % of recent cpu time used by all lwps 62ushort_t
* pr_pctmem; /* % of system memory used by process 62timestruc_t pr_start;
* /* process start time, from the epoch 94timestruc_t pr_time; /* usr+sys
* cpu time for this process 126timestruc_t pr_ctime; /* usr+sys cpu time
* for reaped children 158char pr_fname[PRFNSZ]; /* name of execed file char
* pr_psargs[PRARGSZ]; /* initial characters of arg list int pr_wstat; /* if
* zombie, the wait() status int pr_argc; /* initial argument count
* uintptr_t pr_argv; /* address of initial argument vector uintptr_t
* pr_envp; /* address of initial environment vector char pr_dmodel; /* data
* model of the process char pr_pad2[3]; taskid_t pr_taskid; /* task id
* projid_t pr_projid; /* project id int pr_nzomb; /* number of zombie lwps
* in the process poolid_t pr_poolid; /* pool id zoneid_t pr_zoneid; /* zone
* id id_t pr_contract; /* process contract int pr_filler[1]; /* reserved
* for future use lwpsinfo_t pr_lwp; /* information for representative lwp }
* psinfo_t;
*/
static int PRARGSZ = 80; /* number of chars of arguments */
public static class psinfo
{
ByteBuffer _b;
psinfo(ByteBuffer b)
{
_b = b;
}
int getPid()
{
return _b.getInt(8);
}
int getNlwp()
{
return _b.getInt(4);
}
int getPctcpu()
{
return (int) (((double) _b.getShort(60)) * 100) / 0x8000;
}
int getPr_size()
{
return _b.getInt(44);
}
}
public int getStdOutNo()
{
return 1;
}
public int getStdErrNo()
{
return 2;
}
public int getStdInNo()
{
return 3;
}
public static Process getProcess(int pid)
{
SolarisProcess result = null;
File f = new File("/proc/" + pid);
if (f.exists())
{
result = new SolarisProcess();
result._pid = pid;
result._user = result.getUserInternal();
result._cmd = result.getCommandInternal();
result._workingDir = result.getWorkingDirInternal();
}
return result;
}
private String getCommandInternal()
{
String result = _utils.osCommand(String.format("pargs -l %1$s", _pid), 5000);
if (result == null)
result = "?";
// System.out.println("cmd line: "+result);
return result;
}
public String getUserInternal()
{
if (_pid < 0)
return null;
String cmd = String.format("ps -p %1$s -o user", _pid);
String res = _utils.osCommand(cmd, 5000);
if (res == null)
return null;
String[] resx = res.split(System.getProperty("line.separator"));
return resx[1];
}
private psinfo getPsinfo()
{
FileChannel in;
try
{
in = new FileInputStream(String.format("/proc/%1$s/psinfo", _pid)).getChannel();
}
catch (FileNotFoundException e)
{
System.out.println("error in getCurrentThreads() " + e.getMessage());
return null;
}
int size;
try
{
size = (int) in.size();
}
catch (IOException e)
{
System.out.println("error in getCurrentThreads() " + e.getMessage());
return null;
}
ByteBuffer b = ByteBuffer.allocateDirect(size);
b.order(ByteOrder.LITTLE_ENDIAN);
try
{
in.read(b);
}
catch (IOException e)
{
System.out.println("error in getCurrent*() " + e.getMessage());
return null;
}
psinfo s = new psinfo(b);
try
{
in.close();
}
catch (IOException e)
{
e.printStackTrace();
}
return s;
}
public int getCurrentCpu()
{
int result = -1;
if (!isRunning())
return result;
psinfo s = getPsinfo();
if (s == null)
return -1;
return s.getPctcpu();
}
public int getCurrentThreads()
{
int result = -1;
if (!isRunning())
return result;
psinfo s = getPsinfo();
if (s == null)
return -1;
return s.getNlwp();
}
public int getCurrentVirtualMemory()
{
int result = -1;
if (!isRunning())
return result;
psinfo s = getPsinfo();
if (s == null)
return -1;
return s.getPr_size() * 1024;
}
protected String getWorkingDirInternal()
{
String f = "/proc/" + getPid() + "/cwd";
short BUFSIZE = 512;
Memory result = new Memory(BUFSIZE);
result.clear();
short size = CLibrary.INSTANCE.readlink(f, result, (short) (BUFSIZE - 1));
if (size <= 0)
{
System.out.println("error reading process working dir -> please edit wrapper.working.dir in configuration file");
return f;
}
result.setByte((long) size, (byte) 0);
return result.getString(0);
/*
* String result = null; File f = new File("/proc/" + getPid() +
* "/cwd"); try { result = f.getCanonicalPath(); } catch (IOException e)
* { e.printStackTrace(); } return result;
*/
}
}