WvStreams
wvprociter.cc
00001 /*
00002  * Worldvisions Weaver Software:
00003  *   Copyright (C) 1997-2002 Net Integration Technologies, Inc.
00004  *
00005  * Process iterator.  Iterates through all the processes.
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 }