00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "wvprociter.h"
00010 #include "wvfile.h"
00011 #include <sys/types.h>
00012 #include <signal.h>
00013
00014 WvProcIter::WvProcIter() :
00015 dir_iter("/proc", false, true)
00016 {
00017 }
00018
00019 WvProcIter::~WvProcIter()
00020 {
00021 }
00022
00023 bool WvProcIter::isok() const
00024 {
00025 return dir_iter.isok();
00026 }
00027
00028 void WvProcIter::rewind()
00029 {
00030 dir_iter.rewind();
00031 }
00032
00033 bool WvProcIter::next()
00034 {
00035 for (;;)
00036 {
00037 if (!dir_iter.next())
00038 return false;
00039 if (!wvstring_to_num(dir_iter->name, proc_ent.pid))
00040 continue;
00041
00042 proc_ent.exe = wvreadlink(WvString("%s/exe", dir_iter->fullname));
00043
00044 proc_ent.cmdline.zap();
00045 WvFile cmdline_file(WvString("%s/cmdline", dir_iter->fullname), O_RDONLY);
00046 while (cmdline_file.isok())
00047 {
00048 const char *line = cmdline_file.getline(0, '\0');
00049 if (line == NULL)
00050 break;
00051 WvString line_str(line);
00052 line_str.unique();
00053 proc_ent.cmdline.append(line_str);
00054 }
00055 cmdline_file.close();
00056
00057 break;
00058 }
00059 return true;
00060 }
00061
00062 bool wvkillall(WvStringParm name, int sig)
00063 {
00064 bool found = false;
00065 WvProcIter i;
00066 for (i.rewind(); i.next(); )
00067 {
00068 if (!i->cmdline.isempty()
00069 && !!*i->cmdline.first()
00070 && getfilename(*i->cmdline.first()) == name
00071 && i->pid > 0)
00072 {
00073 ::kill(i->pid, sig);
00074 found = true;
00075 }
00076 }
00077 return found;
00078 }