Exemple #1
0
int
main(int argc, char** argv)
{
    int sock;
    slash_context_t* ctx;
    #ifdef USE_PTHREADS
        pthread_t thread;
        pthread_attr_t thread_attr;
        pthread_attr_init(&thread_attr);
        pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
    #endif
    
    parse_opts(argc, argv);
    FCGX_Init();
    sl_static_init();
    
    if(DAEMONIZE) {
        daemonize();
    }
    
    sock = FCGX_OpenSocket(LISTEN, BACKLOG);
    while(1) {
        ctx = malloc(sizeof(slash_context_t));
        FCGX_InitRequest(&ctx->request, sock, 0);
        if(FCGX_Accept_r(&ctx->request) != 0) {
            exit(1);
        }
        #ifdef USE_PTHREADS
            pthread_create(&thread, &thread_attr, handle_request_thread_start, ctx);
        #else
            handle_request_thread_start(ctx);
        #endif
    }
}
Exemple #2
0
void Rok4Server::initFCGI() {
    int init=FCGX_Init();
    if ( !socket.empty() ) {
        LOGGER_INFO ( _ ( "Listening on " ) << socket );
        sock = FCGX_OpenSocket ( socket.c_str(), backlog );
    }
}
Exemple #3
0
fcgi_api::fcgi_api(char const *socket,int backlog)
{
	pthread_once(&init_fcgi,fcgi_api::init);
	if(socket && socket[0]!='\0') {
		fd=FCGX_OpenSocket(socket,backlog);
	}
	else {
		fd=0; // STDIN
	}
	if(fd<0) {
		throw cppcms_error(errno,"FCGX_OpenSocket");
	}
}
Exemple #4
0
int main(int argc, char **argv)
{
	sc::SoundCloud::sharedInstance()->init(kInitFile);

	FCGX_Init();
	int socket = FCGX_OpenSocket(":2026", kMaxThreads);

	std::thread threads[kMaxThreads];
	for (int i = 0; i < kMaxThreads; ++i)
	{
		threads[i] = std::thread(ProcessFCGI, socket);
	}

	while (true)
	{
		Player::sharedInstance()->update(60);
		sleep(60);
	}
}
Exemple #5
0
int main(void)
{
    char *user, *password;

    user = getenv("USER");
    if (user == NULL) {
        user = "******";
    }

    password = getenv("PASSWORD");
    if (password == NULL) {
        password = "******";
    }
	FCGX_Init();
	FCGX_OpenSocket(":9000", 500);
    while (FCGI_Accept() >= 0) {
        char *remoteUser, *remotePassword;

        remoteUser = getenv("REMOTE_USER");
        remotePassword = getenv("REMOTE_PASSWD");
        if ((remoteUser == NULL) || (remotePassword == NULL)
             || strcmp(remoteUser, user) || strcmp(remotePassword, password))
        {
             printf("Status: 401 Unauthorized\r\n"
                 "WWW-Authenticate: Basic realm=\"Test\"\r\n"
                 "\r\n");
        }
        else {
            char *processId = getenv("QUERY_STRING");
            if (processId == NULL || strlen(processId) == 0) {
                processId = "0";
        }
            printf("Status: 200 OK\r\n"
                "Variable-AUTH_TYPE: Basic\r\n"
                "Variable-REMOTE_PASSWD:\r\n"
                "Variable-PROCESS_ID: %s\r\n"
                "\r\n", processId);
        }
    }

    return 0;
}
Exemple #6
0
int main(void)
{
	FCGX_Init();
	int socket = FCGX_OpenSocket(SOCKET_PATH, 0);
	char* remote_addr;

	FCGX_Request request;
	if (FCGX_InitRequest(&request, socket, 0) != 0)
		return 1;

	while (1) {
		FCGX_Accept_r(&request);
		remote_addr = FCGX_GetParam("REMOTE_ADDR", request.envp);

		FCGX_PutS("Content-type: text/plain\n\n", request.out);
		FCGX_PutS(remote_addr, request.out);
		FCGX_PutS("\n", request.out);

		FCGX_Finish_r(&request);
	}
}
Exemple #7
0
CgiService::CgiService()
{
    bcore = new BaseCore();

    FCGX_Init();

    mode_t old_mode = umask(0);

    socketId = FCGX_OpenSocket(config->server_socket_path_.c_str(), config->server_children_);
    if(socketId < 0)
    {
        Log::err("Error open socket. exit");
        exit(1);
    }
    umask(old_mode);

    pthread_attr_t* attributes = (pthread_attr_t*) malloc(sizeof(pthread_attr_t));
    pthread_attr_init(attributes);
    pthread_attr_setstacksize(attributes, THREAD_STACK_SIZE);

    struct sigaction actions;

    memset(&actions, 0, sizeof(actions));
    actions.sa_flags = 0;
    actions.sa_handler = SignalHandler;

    sigaction(SIGHUP,&actions,NULL);
    sigaction(SIGPIPE,&actions,NULL);

    threads = new pthread_t[config->server_children_ + 1];

    for(int i = 0; i < config->server_children_; i++)
    {
        if(pthread_create(&threads[i], attributes, &this->Serve, this))
        {
            Log::err("creating thread failed");
        }
    }
    pthread_attr_destroy(attributes);
}
Exemple #8
0
int System::run(const StringList& args)
{
	if (_running)
		return 1;
	_running = true;

#ifdef DEBUG
	_debug = true;
#else
	_debug = false;
#endif

	//if (_debug)
	//	signal(SIGSEGV, &segfault);

	_cliOptions = new CliOptions(args);

	//std::locale::global(std::locale("en_US.UTF-8"));

	if (_cliOptions->flag(CliOptions::Version))
	{
		std::cout << "WebCpp v" << version() << std::endl;
		return 0;
	}

	std::cout << "Starting WebCpp v" << version() << " <http://www.webcpp.org/>."
	          << std::endl
	          << "Copyright © 2011-2013 Kévin Lesénéchal <*****@*****.**>."
	          << std::endl
	          << "This program is free software and distributed under the "
	          << std::endl
	          << "GNU General Public License. See <http://www.gnu.org/licenses/>."
						<< std::endl << std::endl;

	char exe[512];
	ssize_t exeSize;
	if ((exeSize = readlink("/proc/self/exe", exe, (sizeof exe) - 1)) < 0)
		return 1;
	exe[exeSize] = '\0';
	_absolutePath = String(exe).section("/", 0, -3);
	char* dirName = get_current_dir_name();
	_runDir = String(dirName);
	free(dirName);

	_settings = Settings::fromIniFile("WebCpp/Config.ini");
	_cachedSettings.handleExceptions = _settings["General.HandleExceptions"];
	_cachedSettings.behindProxy = _settings["General.BehindProxy"];
	_cachedSettings.defaultTemplateEngine
	    = _settings["General.DefaultTemplateEngine"];
	_cachedSettings.defaultContentType = _settings["Content.DefaultContentType"];
	_cachedSettings.defaultCharset = _settings["Content.DefaultCharset"];
	_cachedSettings.sessionsEnabled = _settings["Sessions.Enabled"];
	_cachedSettings.sessionIdCookieName = _settings["Sessions.IdCookieName"];
	_cachedSettings.sessionTokenCookieName
	    = _settings["Sessions.TokenCookieName"];
	_cachedSettings.sessionIpCheck = _settings["Sessions.IpCheck"];
	_cachedSettings.defaultLocale = _settings["Locale.DefaultLocale"];

	DatabaseSystem::reloadDbmsList();
	CodeHighlighter::reloadCodeHighlighters();

	_systemRouter = new SystemRouter;

	try
	{
		_site = Site::load();
	}
	catch (const Exceptions::DbConnection& e)
	{
		std::cerr << "Critical: " << e.message() << std::endl;
		return 1;
	}

	TransManager::get()->reloadFromFiles();

	FCGX_Init();
	_socket = FCGX_OpenSocket(setting("FastCGI.Socket").toCString(), 100);

	int threadsCount = setting("FastCGI.Threads");
	if (threadsCount < 1)
	{
		std::cerr << args[0] << ": invalid number of threads." << std::endl;
		return 1;
	}

	if ((!_debug || _cliOptions->flag(CliOptions::NoPrompt))
	    && !_cliOptions->flag(CliOptions::ForcePrompt))
		threadsCount--;
	for (int i = 0; i < threadsCount; i++)
	{
		Thread* thread = new Thread(&fcgiProcessingLoop);
		_threads.append(thread);
		thread->start();
	}

	if (((!_debug || _cliOptions->flag(CliOptions::NoPrompt))
	     && !_cliOptions->flag(CliOptions::ForcePrompt))
	    || _cliOptions->flag(CliOptions::Debug))
		fcgiProcessingLoop();
	else
		Shell::run();

	std::cout << "Shuting down…" << std::endl;
	_running = false;
	for (Thread* thread : _threads)
	{
		//thread->stop();
		thread->wait();
		delete thread;
	}
	return 0;
}
Exemple #9
0
int main(int argc, char **argv)
{
    
    int i;
    
    std::ostringstream conffile;
    conffile << SYSCONFDIR << "/restfsd.ini";
	Config conf(conffile.str());
	
	const int THREAD_COUNT = conf.GetInteger("main","threads",2);
    std::thread *id = new std::thread[THREAD_COUNT];


	FCGX_Init();

	socketId.store( FCGX_OpenSocket(conf.get("main","listen").c_str(), 20) );
	if(socketId < 0)
	{
		printf("Socket isn't opened\n");
		return 1;
	}
        
	//~ int pid;	
	//~ pid = fork();
	//~ if (pid == -1)
	//~ {
		//~ printf("Error: Start Daemon failed (%s)\n", strerror(errno));
		//~ return -1;
	//~ }
	//~ else if (!pid)
	//~ {
		//~ umask(0);
		//~ setsid();
		//~ //chdir("/home/sokol");
		for(i = 0; i < THREAD_COUNT; i++)
		{
			id[i] = std::thread( doit, i, std::ref(conf) );
		}
		//~ sleep(1);
		//~ std::cout << "main1 " <<  conf.get("test","test") << std::endl;
		//~ for(i = 0; i < THREAD_COUNT; i++)
		//~ {
			//~ id[i].join();
			//~ id[i].detach();
		//~ }
        
        //~ while(true) {
			//~ //std::cout << "while" << std::endl;
	        //~ for(i = 0; i < THREAD_COUNT; i++)
	        //~ {
	            //~ id[i].join();
	            //~ std::cout << "thread[" << i << "].get_id: " << id[i].get_id() << std::endl;
	            //~ if (id[i].joinable())
				//~ {
					//~ id[i].join();
				//~ } else
				//~ {
					//~ std::cout << "thread[" << i << "]: starting" << std::endl;
					//~ id[i] = std::thread( doit, i, std::ref(conf) );
				//~ }
	        //~ }
			//~ //sleep(1);
		//~ }
		//~ close(STDIN_FILENO);
		//~ close(STDOUT_FILENO);
		//~ close(STDERR_FILENO);

		for(i = 0; i < THREAD_COUNT; i++)
		{
			id[i].join();
		}
		
        //~ std::cout << "main2" << conf.get("test","test") << std::endl;
		return 0;

	//~ } else
	//~ {
		//~ printf("Start Daemon pid=(%d)\n", pid);
		//~ return 0;
	//~ }
}
Exemple #10
0
 void
 Application::run(std::string path) {
   FCGX_Init();
   run(FCGX_OpenSocket(path.c_str(), 400));
 }
Exemple #11
0
int main(void)
{
    unsigned int        count   = 0;
    int                 socket_fdescriptor = 0;

    char                *buf    = NULL;

    FCGX_Request        request;
    Request_t           req;


    // Initialize all the elements of the structures to NULL
    memset(&request, 0, sizeof(FCGX_Request) );
    memset(&req, 0, sizeof(Request_t) );

    if ( FCGX_Init() != 0 )
    {
        return (1);
    }

    socket_fdescriptor = FCGX_OpenSocket(PORT_FCGI, 500);

    if ( socket_fdescriptor < 0 )
    {
        return (2);
    }

    buf = (char *) malloc(50 * sizeof(char) );
    sprintf(buf, "The file descriptor of the socket is : %d", socket_fdescriptor);

    logger("main.c", buf);

    if ( buf )
    {
        free(buf);
    }

    if ( FCGX_InitRequest(&request, socket_fdescriptor, 0) < 0 )
    {
        return (3);
    }


    /* Response loop. */
    while ( FCGX_Accept_r(&request) == 0 )
    {
        request_fill(request, &req);
        request_display(req, ++count);

        FCGX_FPrintF(request.out,
                     "Content-type: text/html\r\n"
                     "\r\n"
                     "<title>FastCGI Hello! (C, fcgi_stdio library)</title>"
                         "<h1>FastCGI Hello! (C, fcgi_stdio library)</h1>"
                             "Request number %d",
                     count);
        FCGX_Finish_r(&request);
    }

    fprintf(stderr, "Error FCGX_Accept_r");

    return (0);
}
Exemple #12
0
int main(int argc, char* argv[], char* envp[])
{
	if(argc < 7)
		usage(argv);

	char* root = argv[1];
	char* thumbnail_root = argv[2];
	char* listen_addr = argv[3];
	num_workers = atoi(argv[6]);

	if(num_workers < 1)
		usage(argv);

	struct passwd* pwd = getpwnam(argv[4]);
	if (pwd == NULL)
			error_errno("getpwnam_r failed", EXIT_FAILURE);

	struct group* grp = getgrnam(argv[5]);
	if (grp == NULL)
			error_errno("getgrnam_r failed", EXIT_FAILURE);

	int userid = pwd->pw_uid;
	int groupid = grp->gr_gid;

	if(root[strlen(root) - 1] != '/' || thumbnail_root[strlen(thumbnail_root) - 1] != '/')
		error("Did you forget the ending slash in the (thumbnail) root directory path?", EXIT_FAILURE);

	// TODO Some more error checking

	// Initialize syslog
	syslog(LOG_INFO, "Starting up\n");
	#if defined(DEBUG)
		setlogmask(LOG_UPTO(LOG_DEBUG));
		openlog("fastresize", LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_USER);
	#else
		setlogmask(LOG_UPTO(LOG_INFO));
		openlog("fastresize", LOG_CONS, LOG_USER);
	#endif

	// Change the working directory
	if((chdir(root)) < 0)
		error("Couldn't change working directory\n", EXIT_FAILURE);

	// Initialize FastCGI
	syslog(LOG_INFO, "Initializing FastCGI\n");
	if(FCGX_Init())
		error("Could not initialize FastCGI (during FCGX_Init())", EXIT_FAILURE);

	int listen_socket = FCGX_OpenSocket(listen_addr, 400);
	if(listen_socket < 0)
		error("Couldn't bind to FastCGI socket", EXIT_FAILURE);

	// Now that we've got our socket, drop root privileges
	if (getuid() == 0) {
		if (setgid(groupid) != 0)
			error_errno("setgid: Unable to drop group privileges", EXIT_FAILURE);
		if (setuid(userid) != 0)
			error_errno("setuid: Unable to drop user privileges", EXIT_FAILURE);
	}

	FCGX_Request request;
	if(FCGX_InitRequest(&request, listen_socket, 0))
		error("Couldn't initialize FastCGI request handler", EXIT_FAILURE);

	// Initialize ImageMagick
	syslog(LOG_INFO, "Initializing ImageMagick\n");
	MagickWandGenesis();
	atexit(MagickWandTerminus);

	/* Fork a new master process to daemonize and exit the old one. We use
	 * _Exit here to not trigger the atexit that terminates ImageMagick.
	 */
	if(fork())
		_Exit(EXIT_SUCCESS);

	// Fork worker processes
	syslog(LOG_INFO, "Forking workers\n");

	worker_pids = calloc(num_workers, sizeof(pid_t));
	if(!worker_pids)
		error_errno("worker_pids: Could not allocate", 1);

	for(worker_id = 0; worker_id <= num_workers; worker_id++)
	{
		worker_pids[worker_id] = fork();

		// Exit the loop if we're the forked process
		if(worker_pids[worker_id] == 0)
			break;

		syslog(LOG_INFO, "Forked worker with PID %d\n", worker_pids[worker_id]);
	}

	// The following code is only executed in the master process.
	if(worker_id > num_workers)
	{
		syslog(LOG_INFO, "master (PID %d): Sleeping until I receive a signal.\n", getpid());

		/* Sleep a little until we get a SIG{TERM,HUP,INT} or one of our
		 * workers died (not cool).
		 */
		struct sigaction exit_action;
		exit_action.sa_handler = &exit_signal;
		exit_action.sa_sigaction = &exit_signal;

		struct sigaction worker_died_action;
		worker_died_action.sa_handler = &worker_died;
		worker_died_action.sa_sigaction = &worker_died;

		sigaction(SIGTERM, &exit_action, NULL);
		sigaction(SIGHUP, &exit_action, NULL);
		sigaction(SIGINT, &exit_action, NULL);
		sigaction(SIGCHLD, &worker_died_action, NULL);
		pause();

		// This should never™ be reached unless something funny happens.
		exit(EXIT_FAILURE);
	}

	syslog(LOG_INFO, "Worker #%d is now listening for requests on 127.0.0.1:9000\n", worker_id);

	while(FCGX_Accept_r(&request) == 0)
		handle_request(&request, root, thumbnail_root);

	// Exit
	exit(EXIT_SUCCESS);
}