00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <QObject>
00029 #include <vidalia.h>
00030 #include <gui/mainwindow.h>
00031 #include <gui/common/vmessagebox.h>
00032 #include <util/process.h>
00033 #include <util/string.h>
00034
00035 #if defined(Q_OS_WIN32)
00036 #include <QSysInfo>
00037 #endif
00038
00039
00040 bool
00041 is_vidalia_running(QString pidfile)
00042 {
00043
00044 qint64 pid = read_pidfile(pidfile);
00045 if (pid > 0) {
00046 #if defined(Q_OS_WIN32)
00047 if (QSysInfo::WindowsVersion == QSysInfo::WV_NT) {
00048
00049
00050
00051 return true;
00052 } else
00053 return (is_process_running(pid));
00054 #else
00055 return (is_process_running(pid));
00056 #endif
00057 }
00058 return false;
00059 }
00060
00061
00062 int
00063 main(int argc, char *argv[])
00064 {
00065 Q_INIT_RESOURCE(vidalia_common);
00066 QStringList args = char_array_to_stringlist(argv+1, argc-1);
00067
00068
00069
00070
00071 Vidalia vidalia(args, argc, argv);
00072 vNotice("Vidalia %1 using Qt %2").arg(Vidalia::version())
00073 .arg(QT_VERSION_STR);
00074
00075
00076
00077 QString errmsg;
00078 if (vidalia.showUsage()) {
00079 Vidalia::showUsageMessageBox();
00080 return 0;
00081 } else if (!vidalia.validateArguments(errmsg)) {
00082 vError("Unable to apply command-line arguments: %1").arg(errmsg);
00083 VMessageBox::critical(0,
00084 vApp->translate("Vidalia",
00085 QT_TRANSLATE_NOOP("Vidalia", "Invalid Argument")), errmsg,
00086 VMessageBox::Ok);
00087 return 1;
00088 }
00089
00090
00091 QString pidfile = vidalia.pidFile();
00092 if (is_vidalia_running(pidfile)) {
00093 vWarn("Detected another process with pid %1. Is Vidalia already running?")
00094 .arg(get_pid());
00095
00096
00097 int ret = VMessageBox::critical(0,
00098 vApp->translate("Vidalia",
00099 QT_TRANSLATE_NOOP("Vidalia", "Vidalia is already running")),
00100 vApp->translate("Vidalia",
00101 QT_TRANSLATE_NOOP("Vidalia",
00102 "Another Vidalia process is possibly already running. "
00103 "If there really is not another Vidalia process running, "
00104 "you can choose to continue anyway.\n\n"
00105 "Would you like to continue starting Vidalia?")),
00106 VMessageBox::Continue, VMessageBox::Quit|VMessageBox::Default);
00107 if (ret != VMessageBox::Continue) {
00108
00109 vError("Exiting duplicate Vidalia process.");
00110 return 1;
00111 }
00112 }
00113 write_pidfile(pidfile);
00114
00115
00116
00117
00118
00119 Vidalia::setQuitOnLastWindowClosed(false);
00120
00121
00122 MainWindow mainWin;
00123
00124
00125 int ret = vidalia.exec();
00126
00127
00128 QFile::remove(pidfile);
00129 vNotice("Vidalia is exiting cleanly (return code %1).").arg(ret);
00130 return ret;
00131 }
00132