/** * Program main method. Is invoked when the program is started * on commandline. The number of commandline arguments, and a * pointer to the arguments are recieved on the line... */ int main( int ArgCn, char *ArgVc[] ) { int c; // Parse the commandline options and setup basic settings.. while ((c = getopt(ArgCn, ArgVc, "vdh")) != -1) { switch (c) { case 'd': Log2Stderr = true; break; case 'v': LogLevel++; break; case 'h': fputs(Usage, stderr); exit(0); break; default: exit(1); break; } } if (optind != ArgCn - 1) { fputs("You must specify the configuration file.\n", stderr); exit(1); } char *configFilePath = ArgVc[optind]; // Chech that we are root if (geteuid() != 0) { fprintf(stderr, "igmpproxy: must be root\n"); exit(1); } openlog("igmpproxy", LOG_PID, LOG_USER); // Write debug notice with file path... my_log(LOG_DEBUG, 0, "Searching for config file at '%s'" , configFilePath); do { // Loads the config file... if( ! loadConfig( configFilePath ) ) { my_log(LOG_ERR, 0, "Unable to load config file..."); break; } // Initializes the deamon. if ( !igmpProxyInit() ) { my_log(LOG_ERR, 0, "Unable to initialize IGMPproxy."); break; } if ( !Log2Stderr ) { // Only daemon goes past this line... if (fork()) exit(0); // Detach daemon from terminal if ( close( 0 ) < 0 || close( 1 ) < 0 || close( 2 ) < 0 || open( "/dev/null", 0 ) != 0 || dup2( 0, 1 ) < 0 || dup2( 0, 2 ) < 0 || setpgrp() < 0 ) { my_log( LOG_ERR, errno, "failed to detach daemon" ); } } // Go to the main loop. igmpProxyRun(); // Clean up igmpProxyCleanUp(); } while ( false ); // Inform that we are exiting. my_log(LOG_INFO, 0, "Shutdown complete...."); exit(0); }
/** * Program main method. Is invoked when the program is started * on commandline. The number of commandline arguments, and a * pointer to the arguments are recieved on the line... */ int main( int ArgCn, char *ArgVc[] ) { // Parse the commandline options and setup basic settings.. for (int c; (c = getopt(ArgCn, ArgVc, "vdh")) != -1;) { switch (c) { case 'd': Log2Stderr = true; break; case 'v': if (LogLevel == LOG_INFO) LogLevel = LOG_DEBUG; else LogLevel = LOG_INFO; break; case 'h': fputs(Usage, stderr); exit(0); break; default: exit(1); break; } } if (optind != ArgCn - 1) { fputs("You must specify the configuration file.\n", stderr); exit(1); } char *configFilePath = ArgVc[optind]; // Chech that we are root if (geteuid() != 0) { fprintf(stderr, "igmpproxy: must be root\n"); exit(1); } openlog("igmpproxy", LOG_PID, LOG_USER); // Write debug notice with file path... my_log(LOG_DEBUG, 0, "Searching for config file at '%s'" , configFilePath); do { // Loads the config file... if( ! loadConfig( configFilePath ) ) { my_log(LOG_ERR, 0, "Unable to load config file..."); break; } // Initializes the deamon. if ( !igmpProxyInit() ) { my_log(LOG_ERR, 0, "Unable to initialize IGMPproxy."); break; } // Go to the main loop. igmpProxyRun(); // Clean up igmpProxyCleanUp(); } while ( false ); // Inform that we are exiting. my_log(LOG_INFO, 0, "Shutdown complete...."); exit(0); }
/** * Program main method. Is invoked when the program is started * on commandline. The number of commandline arguments, and a * pointer to the arguments are recieved on the line... */ int main( int ArgCn, const char *ArgVc[] ) { int debugMode = 0; int snooping = 1; // Set the default config Filepath... char* configFilePath = IGMPPROXY_CONFIG_FILEPATH; // Display version fputs( Version, stderr ); // Parse the commandline options and setup basic settings.. int i = 1; while (i < ArgCn) { if ( strlen(ArgVc[i]) > 1 && ArgVc[i][0] == '-') { switch ( ArgVc[i][1] ) { case 'h': fputs( Usage, stderr ); exit( 0 ); case 'd': Log2Stderr = LOG_DEBUG; /* case 'v': // Enable debug mode... if (Log2Stderr < LOG_INFO) { Log2Stderr = LOG_INFO; } */ debugMode = 1; break; case 'c': // Get new filepath... if (i + 1 < ArgCn && ArgVc[i+1][0] != '-') { configFilePath = ArgVc[i+1]; i++; } else { log(LOG_ERR, 0, "Missing config file path after -c option."); } break; case 'f': if (i + 1 < ArgCn && ArgVc[i+1][0] != '-') { snooping = atoi(ArgVc[i+1]); i++; } else{ log(LOG_ERR, 0, "Missing config file path after -f option."); } break; } } i++; } // Chech that we are root if (geteuid() != 0) { fprintf(stderr, "igmpproxy: must be root\n"); exit(1); } // Write debug notice with file path... IF_DEBUG log(LOG_DEBUG, 0, "Searching for config file at '%s'" , configFilePath); do { // Loads the config file... if( ! loadConfig( configFilePath ) ) { log(LOG_ERR, 0, "Unable to load config file..."); break; } // Initializes the deamon. if ( !igmpProxyInit() ) { log(LOG_ERR, 0, "Unable to initialize IGMPproxy."); break; } #ifdef RT3052_SUPPORT rt3052_init(snooping); /* enable snooping */ #endif // If not in debug mode, fork and detatch from terminal. if ( ! debugMode ) { IF_DEBUG log( LOG_DEBUG, 0, "Starting daemon mode."); // Only daemon goes past this line... if (fork()) exit(0); // Detach deamon from terminal if ( close( 0 ) < 0 || close( 1 ) < 0 || close( 2 ) < 0 || open( "/dev/null", 0 ) != 0 || dup2( 0, 1 ) < 0 || dup2( 0, 2 ) < 0 || setpgrp() < 0 ) { log( LOG_ERR, errno, "failed to detach deamon" ); } } // Go to the main loop. igmpProxyRun(); // Clean up igmpProxyCleanUp(); } while ( FALSE ); #ifdef RT3052_SUPPORT rt3052_fini(); #endif // Inform that we are exiting. log(LOG_INFO, 0, "Shutdown complete...."); exit(0); }