Skip to content
Snippets Groups Projects
Select Git revision
  • master default protected
  • release/202005
  • release/202001
  • release/201912
  • release/201911
  • release/releaseWindowsTestOne
  • release/windowsReleaseTest
  • release/releaseTest
  • release/releaseWindowsTest
  • release/201910
  • release/qt/201910
  • release/windows-test/201910
  • release/201908
  • release/201906
  • release/201905
  • release/201904
  • release/201903
  • release/201902
  • release/201901
  • release/201812
  • 4.0.0
  • 2.2.0
  • 2.1.0
  • 2.0.1
  • 2.0.0
  • 1.4.1
  • 1.4.0
  • 1.3.0
  • 1.2.0
  • 1.1.0
30 results

main.cpp

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    main.cpp 5.31 KiB
    /*
     *  Copyright (C) 2004-2007 Savoir-Faire Linux inc.
     *  Author: Alexandre Bourget <alexandre.bourget@savoirfairelinux.com>
     *  Author: Yan Morin <yan.morin@savoirfairelinux.com>
     *  Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
     *
     *  This program is free software; you can redistribute it and/or modify
     *  it under the terms of the GNU General Public License as published by
     *  the Free Software Foundation; either version 2 of the License, or
     *  (at your option) any later version.
     *
     *  This program is distributed in the hope that it will be useful,
     *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     *  GNU General Public License for more details.
     *
     *  You should have received a copy of the GNU General Public License
     *  along with this program; if not, write to the Free Software
     *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
     */
    
    #include <libintl.h>
    #include <cstring>
    #include <iostream>
    #include <string>
    #include <dirent.h>
    #include <sys/stat.h>
    //#include "config.h"
    #include "global.h"
    
    #include "user_cfg.h"
    #include "dbus/dbusmanager.h"
    #include "manager.h"
    
    #include "audio/audiolayer.h"
    
    int
    main (int argc, char **argv)
    {
        int exit_code = 0;
    
        //setlocale (LC_ALL, "");
        //bindtextdomain (PACKAGE, LOCALEDIR);
        //textdomain (PACKAGE);
    
        if (argc == 2 && strcmp (argv[1], "--help") == 0) {
    
    
            printf ("%1$s Daemon %2$s, by Savoir-Faire Linux 2004-2009\n\n",
                    PROGNAME,
                    SFLPHONED_VERSION);
            printf ("USAGE: sflphoned [--help]\nParameters: \n  --help\tfor this message\n\n  --port=3999\tchange the session port\n\n");
            printf ("See http://www.sflphone.org/ for more information\n");
    
        } else {
            FILE *fp;
            char homepid[128];
            char sfldir[128];
    
            unsigned int iPid = getpid();
            char cPid[64], cOldPid[64];
            sprintf (cPid,"%d", iPid);
            std::string xdg_cache, xdg_env, path;
    
            xdg_cache = std::string (HOMEDIR) + DIR_SEPARATOR_STR + ".cache/";
    
            if (XDG_CACHE_HOME != NULL) {
                xdg_env = std::string (XDG_CACHE_HOME);
                (xdg_env.length() > 0) ? path = xdg_env
                                                :		path = xdg_cache;
            } else
                path = xdg_cache;
    
            sprintf (sfldir, "%s", path.c_str ());
    
    		path  = path + "sflphone";	
            sprintf (homepid, "%s/%s", path.c_str (), PIDFILE);
    
            if ( (fp = fopen (homepid,"r")) == NULL) {
                // Check if $XDG_CACHE_HOME directory exists or not.
                DIR *dir;
    
                if ( (dir = opendir (sfldir)) == NULL) {
                    //Create it
                    if (mkdir (sfldir, 0755) != 0) {
                        fprintf (stderr, "Creating directory %s failed. Exited.\n", sfldir);
                        exit (-1);
                    }
                }
    
    			// Then create the sflphone directory inside the $XDG_CACHE_HOME dir
    			sprintf (sfldir, "%s", path.c_str ());
    			if ( (dir = opendir (sfldir)) == NULL) {
    				//Create it
    				if (mkdir (sfldir, 0755) != 0) {
    					fprintf (stderr, "Creating directory %s failed. Exited.\n", sfldir);
    					exit (-1);
    				}
    			}
    
                // PID file doesn't exists, create and write pid in it
                if ( (fp = fopen (homepid,"w")) == NULL) {
                    fprintf (stderr, "Creating PID file %s failed. Exited.\n", homepid);
                    exit (-1);
                } else {
                    fputs (cPid , fp);
                    fclose (fp);
                }
            } else {
                // PID file exists. Check the former process still alive or not. If alive, give user a hint.
                char *res;
                res = fgets (cOldPid, 64, fp);
    
                if (res == NULL)	perror ("Error getting string from stream");
    
                else {
                    fclose (fp);
    
                    if (kill (atoi (cOldPid), 0) == SUCCESS) {
                        fprintf (stderr, "There is already a sflphoned daemon running in the system. Starting Failed.\n");
                        exit (-1);
                    } else {
                        if ( (fp = fopen (homepid,"w")) == NULL) {
                            fprintf (stderr, "Writing to PID file %s failed. Exited.\n", homepid);
                            exit (-1);
                        } else {
                            fputs (cPid , fp);
                            fclose (fp);
                        }
    
                    }
                }
            }
    
            int sessionPort = 0;
    
            if (argc == 2) {
                char* ptrPort = strstr (argv[1], "--port=");
    
                if (ptrPort != 0) {
                    sessionPort = atoi (ptrPort+7);
                }
            }
    
            bool initOK = false;
    
            try {
                // TODO Use $XDG_CONFIG_HOME to save the config file (which default to $HOME/.config)
                Manager::instance().initConfigFile();
                Manager::instance().init();
                initOK = true;
            } catch (std::exception &e) {
                std::cerr << e.what() << std::endl;
                exit_code = -1;
            } catch (...) {
                fprintf (stderr, "An exception occured when initializing the system.\n");
                exit_code = -1;
            }
    
            if (initOK) {
                Manager::instance().setDBusManager (&DBusManager::instance());
                exit_code = DBusManager::instance().exec();  // UI Loop
            }
        }
    
        return exit_code;
    }
    
    // EOF