WvStreams
|
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 }