Improve instance detection

Fix -i option
This commit is contained in:
2020-06-15 16:36:24 +02:00
parent 27404a4aa7
commit c72f90e5eb
4 changed files with 33 additions and 9 deletions

View File

@ -116,7 +116,17 @@ bool createPidFile(const std::string& fileName)
if(std::filesystem::exists(fileName)) if(std::filesystem::exists(fileName))
{ {
std::cerr<<fileName<<" pid file exsists, only one instance may run at once\n"; std::cerr<<fileName<<" pid file exsists, only one instance may run at once\n";
return false; std::string sigstopedName = Process(getpid()).getName();
if(Process::byName(sigstopedName).size() > 1) return false;
else
{
std::cerr<<"Only one "
<<sigstopedName
<<" process exists, either sigstoped died or you have severl diferently named binarys\n";
std::filesystem::remove(fileName);
return createPidFile(fileName);
}
} }
else else
{ {
@ -150,7 +160,7 @@ int main(int argc, char* argv[])
std::string confDir = getConfdir(); std::string confDir = getConfdir();
if(confDir.size() == 0) return 1; if(confDir.size() == 0) return 1;
if(!createPidFile(confDir+"pidfile")) return 1; if(!createPidFile(confDir+"pidfile"));
std::vector<std::string> applicationNames = getApplicationlist(confDir+"blacklist"); std::vector<std::string> applicationNames = getApplicationlist(confDir+"blacklist");
@ -185,6 +195,7 @@ int main(int argc, char* argv[])
signal(SIGINT, sigTerm); signal(SIGINT, sigTerm);
signal(SIGTERM, sigTerm); signal(SIGTERM, sigTerm);
signal(SIGHUP, sigTerm);
signal(SIGUSR1, sigUser1); signal(SIGUSR1, sigUser1);
while(!stop) while(!stop)

View File

@ -127,6 +127,18 @@ std::string Process::getName()
return name_; return name_;
} }
std::vector<Process> Process::byName(const std::string& name)
{
std::vector<pid_t> procs = getAllProcessPids();
std::vector<Process> retProcs;
for(const auto & pid : procs )
{
Process proc(pid);
if(name == proc.getName()) retProcs.push_back(proc);
}
return retProcs;
}
pid_t Process::convertPid(const std::string& pid) pid_t Process::convertPid(const std::string& pid)
{ {
pid_t ret; pid_t ret;

View File

@ -32,7 +32,7 @@ private:
private: private:
std::vector<std::string> openStatus(); std::vector<std::string> openStatus();
std::vector<pid_t> getAllProcessPids(); static std::vector<pid_t> getAllProcessPids();
static pid_t convertPid(const std::string& pid); static pid_t convertPid(const std::string& pid);
public: public:
@ -47,6 +47,7 @@ public:
pid_t getPPid(); pid_t getPPid();
Process getParent(){return Process(getPPid());} Process getParent(){return Process(getPPid());}
std::vector<Process> getChildren(); std::vector<Process> getChildren();
static std::vector<Process> byName(const std::string& name);
Process(){} Process(){}
Process(pid_t pidIn); Process(pid_t pidIn);
}; };

View File

@ -132,9 +132,9 @@ pid_t XInstance::getPid(Window wid)
char errorString[1024]; char errorString[1024];
XGetErrorText(display, ret, errorString, 1024); XGetErrorText(display, ret, errorString, 1024);
debug("XGetWMClientMachine failed! " + std::string(errorString)); debug("XGetWMClientMachine failed! " + std::string(errorString));
return -1; if(!ignoreClientMachine) return -1;
} }
char** xWidHostNameStringList; char** xWidHostNameStringList = nullptr;
int nStrings; int nStrings;
ret = XTextPropertyToStringList(&xWidHostNameTextProperty, &xWidHostNameStringList, &nStrings); ret = XTextPropertyToStringList(&xWidHostNameTextProperty, &xWidHostNameStringList, &nStrings);
if (!ret || nStrings == 0) if (!ret || nStrings == 0)
@ -142,16 +142,16 @@ pid_t XInstance::getPid(Window wid)
char errorString[1024]; char errorString[1024];
XGetErrorText(display, ret, errorString, 1024); XGetErrorText(display, ret, errorString, 1024);
debug("XTextPropertyToStringList failed! " + std::string(errorString)); debug("XTextPropertyToStringList failed! " + std::string(errorString));
return -1; if(!ignoreClientMachine) return -1;
} }
char hostName[HOST_NAME_MAX+1]={0}; char hostName[HOST_NAME_MAX+1]={0};
if(gethostname(hostName, HOST_NAME_MAX) != 0) if(gethostname(hostName, HOST_NAME_MAX) != 0)
{ {
debug("Can't get host name"); debug("Can't get host name");
return -1; if(!ignoreClientMachine) return -1;
} }
pid_t pid = -1; pid_t pid = -1;
if(strcmp(hostName, xWidHostNameStringList[0]) == 0 || ignoreClientMachine) if(ignoreClientMachine || strcmp(hostName, xWidHostNameStringList[0]) == 0 )
{ {
unsigned char* data = nullptr; unsigned char* data = nullptr;
int format; int format;
@ -164,7 +164,7 @@ pid_t XInstance::getPid(Window wid)
{ {
debug("Window "+std::to_string(wid)+" is a remote window"); debug("Window "+std::to_string(wid)+" is a remote window");
} }
XFreeStringList(xWidHostNameStringList); if(xWidHostNameStringList) XFreeStringList(xWidHostNameStringList);
return pid; return pid;
} }