Skip to content
Snippets Groups Projects
pathComp.c 5.37 KiB
Newer Older
  • Learn to ignore specific revisions
  • ////////////////////////////////////////////////////////////////////////////////////////
    /**
     * 	# Copyright 2022 Centre Tecnològic de Telecomunicacions de Catalunya (CTTC/CERCA) www.cttc.es
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *     http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
    
     * Author: CTTC/CERCA PONS RU Ricardo Martínez (ricardo.martinez@cttc.es)
     */
    /////////////////////////////////////////////////////////////////////////////////////////
    
    #include <stdio.h>
    #include <stdlib.h> 
    #include <ctype.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <string.h>
    #include <unistd.h>
    #include <netdb.h>
    #include <glib.h>
    #include <sys/time.h>
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    #ifdef GCOV
    // Instrumentation to report code coverage live
    // Ref: https://www.osadl.org/fileadmin/dam/interface/docbook/howtos/coverage.pdf
    #include <signal.h>
    
    // Code coverage flush method; used to update code coverage reports while the server is running
    void __gcov_flush(void); /* check in gcc sources gcc/gcov-io.h for the prototype */
    
    void my_gcov_handler(int signum)
    {
      printf("signal received: running __gcov_flush()\n");
      __gcov_flush(); /* dump coverage data on receiving SIGUSR1 */
    }
    #endif
    
    
    #include "pathComp_log.h"
    #include "pathComp_RESTapi.h"
    #include "pathComp.h"
    
    // External Variables
    FILE *logfile = NULL;
    
    // PATH COMP IP address API Client
    struct in_addr pathComp_IpAddr;
    
    // REST API ENABLED
    int RESTAPI_ENABLED = 0;
    
    GMainLoop * loop = NULL;
    
    ////////////////////////////////////////////////////////////////////////////////////////
    /**
     * 	@file pathComp.c
     * 	@brief Read the pathComp.conf file @ /etc/pathComp/
     *
     *	@author Ricardo Martínez <ricardo.martinez@cttc.es>
     *	@date 2022
     */
    /////////////////////////////////////////////////////////////////////////////////////////
    void read_pathComp_config_file(FILE *fp)
    {
        DEBUG_PC ("Processing pathComp.conf");
        
        char buff[128], ip[128];   
        
        // READ PATH COMP SERVER IP
        memset (&pathComp_IpAddr, (int)0, sizeof (struct in_addr));
        fscanf(fp, "%s %s ", buff, ip);
    	pathComp_IpAddr.s_addr = inet_addr(ip);
        DEBUG_PC("pathComp_IpAddr: %s", inet_ntoa (pathComp_IpAddr));
        memset (buff, 0, sizeof (buff));
            
        // Read REST API 
        fscanf (fp, "%s %d ", buff, &RESTAPI_ENABLED);
        if (RESTAPI_ENABLED) DEBUG_PC ("REST API: ON");
        if (RESTAPI_ENABLED == 0) DEBUG_PC ("REST API: OFF");	
    
        memset (buff, 0, sizeof (buff));
        DEBUG_PC ("CommandLine: %s", buff);
      
        return;
    }
    
    ////////////////////////////////////////////////////////////////////////////////////////
    /**
     * 	@file pathComp.c
     * 	@brief Main function for pathComp server
     *
     *	@author Ricardo Martínez <ricardo.martinez@cttc.es>
     *	@date 2022
     */
    /////////////////////////////////////////////////////////////////////////////////////////
    int main(int argc, char *argv[])
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    {
    	#ifdef GCOV
    	struct sigaction new_action, old_action;
    	/* setup signal hander */
     	new_action.sa_handler = my_gcov_handler;
     	sigemptyset(&new_action.sa_mask);
     	new_action.sa_flags = 0;
     	sigaction(SIGUSR1, NULL, &old_action);
     	if (old_action.sa_handler != SIG_IGN)
     		sigaction (SIGUSR1, &new_action, NULL);
    	#endif
    
    
    	DEBUG_PC ("********************************************************************"); 
    	DEBUG_PC ("********************************************************************");
    	DEBUG_PC (" ---------------------- Path Computation Server---------------------");
    	DEBUG_PC ("********************************************************************");
    	DEBUG_PC ("********************************************************************"); 
    
    	// processing input parameters
    	if (argc == 1)
    	{
    		DEBUG_PC ("Arguments are missing ...");
    		exit (-1);		
    	}
    	
    	// argv[1] specifies the folder and the configuration file
    	gchar configFile[50];
    	strcpy (configFile, argv[1]);
    	DEBUG_PC ("Path Computation Server Config File is: %s", configFile);
    	
    	// argv[2] specifies the folder and the log file
    	gchar log[50];
    	strcpy (log, argv[2]);
    	DEBUG_PC ("PATH COMP log File: %s", log);	
    
    	// open the log file	
    	logfile = fopen (log, "w");
    	DEBUG_PC ("log file is opened");
    	
    	// Read the pathComp.conf file
    	FILE *pathComp_config = NULL;	
    	pathComp_config = fopen (configFile, "r");
    	if (pathComp_config == NULL)
    	{	
    		DEBUG_PC ("File error\n");
    		exit (-1);
    	}	
    	DEBUG_PC ("pathComp_config.conf is opened");
    	
    	// Check if flag -d for daemonize 
    	if (argc > 3)
    	{
    		gchar options[10];
    		strcpy (options, argv[3]);
    		gint ret = strcmp (options, "-d");
    		if (ret == 0) daemon(0,0);
    	}	
    	
    	// Process the config file
    	read_pathComp_config_file (pathComp_config);
    
    	DEBUG_PC ("\n ---- PATH COMP MAIN LOOP ------");
    	/** Creates a new GMainLoop structure */
    	loop = g_main_loop_new (NULL, FALSE);
          
    	// Iff RESTAPI_ENABLED is ON
    	if (RESTAPI_ENABLED)
    	{
    		RESTapi_init(PATH_COMP_PORT);
    	}     
          
    	/** execute loop */
    	g_main_loop_run (loop);
    
    	/** decrease the one reference of loop when it is finished */
    	g_main_loop_unref(loop);
    	loop = NULL;
        return 0;
    }