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