--- licq-1.2.7/src/licq.cpp~ 2004-07-09 17:57:49 +0400 +++ licq-1.2.7/src/licq.cpp 2004-07-12 16:58:26 +0400 @@ -275,6 +275,8 @@ bool CLicq::Init(int argc, char **argv) sprintf(LIB_DIR, "%s/%s", INSTALL_PREFIX, BASE_LIB_DIR); // Check pid + char proc_cmdline_path[MAX_FILENAME_LEN], proc_line[256]; + bool proc_failed = false; char szConf[MAX_FILENAME_LEN], szKey[32]; snprintf(szConf, MAX_FILENAME_LEN, "%s/licq.pid", BASE_DIR); szConf[MAX_FILENAME_LEN - 1] = '\0'; @@ -290,10 +292,34 @@ bool CLicq::Init(int argc, char **argv) } else { + sprintf(proc_cmdline_path, "/proc/%d/cmdline", pid); + if( access(proc_cmdline_path, R_OK) == 0 ) + { + FILE *proc_file = fopen(proc_cmdline_path, "r"); + if (proc_file != NULL) + { + fgets(proc_line, 255, proc_file); + if( strstr(proc_line, "licq") == NULL ) + { + gLog.Warn("%sLicq: Ignoring stale lockfile (pid %d)\n", L_WARNxSTR, pid); + } + else + proc_failed = true; + fclose(proc_file); + } + else + proc_failed = true; + } + else + proc_failed = true; + + if(proc_failed) + { gLog.Error("%sLicq: Already running at pid %d.\n" "%s Kill process or remove %s.\n", L_ERRORxSTR, pid, L_BLANKxSTR, szConf); return false; + } } } fclose(fs);