int main(int argc, char *argv[])
{
    int done = FALSE;
    opterr = 0;

    //fprintf(stderr, "ctrack started.");
    c_control = C_RUN;

    srand((int)time(NULL));

	ErrorInit();    
    ConfigInit(); // initializes verbose; must be called before any output

   	ReadConfig(TRUE); // default loc.
    TorrentDBCreate();

    unsigned int p;
    while (!done) {
        switch (getopt(argc, argv, "+vqVhrdt:u:p:c:"))  { // + means "don't shuffle args"
            case '?': // invalid option
                PrintSyntax(1);
            case 'h': // help option
                PrintSyntax(0);
            case 'V':
            	printf("ctrack " VERSION "\n");
            	return 0;
                break;
            case 'v':
                SetConfigBool(CFG_VERBOSE, TRUE);
                log("Verbose mode");
                break;
            case 'q':
                SetConfigBool(CFG_VERBOSE, FALSE);
                log("Quiet mode");
                break;
            case 't':
                if (b_assign(atoi(optarg),1,65535,(int *)&p))
                    SetConfigUInt(CFG_HTTP_PORT, p);
                break;
            case 'u':
                if (b_assign(atoi(optarg),1,65535,(int *)&p))
                    SetConfigUInt(CFG_UDP_PORT, p);
                break;
            case 'p':
                if (b_assign(atoi(optarg),1,65535,(int *)&p))
                    SetConfigUInt(CFG_SERVER_PORT, p);
                break;
            case 'd':
                SetConfigBool(CFG_DAEMON, TRUE);
                break;
            case 'c': //config file
	            SetConfigString(CFG_CONFIG_FILE, optarg);
                ReadConfig(FALSE);
            	break;
            case -1:  //end of options
                done = TRUE;
                break;
            default:
                PrintSyntax(1);
                break;    
        }//switch
    }//while
    int i;
    for (i = optind; i < argc; i++) {
    	PTorrentInfo t;
    	char ibuffer[20];
    	if (strtohash(argv[i], ibuffer)) {
			NewTorrentInfo(&t, ibuffer);
		} else {
			errorm("Invalid hash: %s", argv[i]);
		}
    }//for

    //TODO:parse args
    //TODO:init torrent db

#ifdef DAEMON_SUPPORT
    if (GetConfigBool(CFG_DAEMON) == TRUE) {
    /* Our process ID and Session ID */
    pid_t pid, sid;

    /* Fork off the parent process */
    pid = fork();
    if (pid < 0) { exit(EXIT_FAILURE); }
    /* If we got a good PID, then we can exit the parent process. */
    if (pid > 0) { exit(EXIT_SUCCESS); }
    /* Change the file mode mask */
    umask(0);
        /* Create a new SID for the child process */
    sid = setsid();
    if (sid < 0) {
		errorm("setsid() failed: %s", str_error());
		exit(EXIT_FAILURE);
    }
    /* Change the current working directory */
    if ((chdir("/")) < 0) {
		errorm("chdir() failed: %s", str_error());
        exit(EXIT_FAILURE);
    }
    /* Close out the standard file descriptors */
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

	if (daemon(TRUE, FALSE) != 0) 
        errorf(E_SYSTEM, "daemon() failed: %S", str_error());
    } else {
		extern int asdaemon;
		asdaemon = TRUE;
    }
#endif

    //SetupSignalHandlers
	sigset_t set;
	int sig;

    while (c_control == C_RUN) {
    	sigfillset(&set);
    	pthread_sigmask(SIG_SETMASK, &set, NULL);

        if (GetConfigBool(CFG_HTTP_SERVER)) { // HTTP server
	        if (SetUpListener())
    	        HTTPThreadInit();
	    }

	    if (GetConfigBool(CFG_UDP_SERVER)) { // UDP server
	        UDPThreadInit();
	    }

		//TODO: sigwait
		while (c_control == C_RUN) {
		    sigwait(&set, &sig);
			logf("Caught signal #%d", sig);
			switch (sig) {
				case SIGINT:
	                c_control = C_TERMINATE;
    	            log("Exitting...");
        	        break;
				case SIGHUP:
	                c_control = C_RESTART;
	                log("Restarting...");
                   	ReadConfig(FALSE);
	                break;
				case SIGSEGV:
	                c_control = C_TERMINATE;
    	            log("Exitting...");
			}//switch
		}//while
        ThreadsDestroy();
    	CloseTCPSocket();
    	CloseUDPSocket();

        if (c_control == C_RESTART) { c_control = C_RUN; }
    }//while

  	log("exit ");
    return ((sig==SIGINT) ? EXIT_SUCCESS : EXIT_FAILURE);
}
Beispiel #2
0
static void b_calc_tree(tree *t)
{
	if (t != 0)
	{
		switch (t -> type)
		{
			case TREE_FUNC_DECL:
			case TREE_PROC_DECL:
				rd = 0;
				if(t->param != 0)
				{
					r = (rec_desc *)(t->param);
					//DBG("r = %x\n", r);
					rd = (rec_func_param *)(r->param);
					//DBG("rd = %x\n", rd );
					DBG("Function %d with %x args\n", t->id, rd->argcnt);
				} else {
					DBG("Can't resolve function\n");
				}
				b_calc_tree(t->right);

				b_func_begin(t->id, rd);
				b_calc_tree(t->left);
				b_func_end(t->id);
				//DBG("End function %d\n", t->id);
				break;

			case TREE_DECLARATION:
				//DBG("Declaration\n");
				b_calc_tree(t->left);
				b_calc_tree(t->right);
				break;

			case TREE_OPERATOR:
				//DBG("Operator\n");
				b_calc_tree(t->right);
				b_calc_tree(t->left);
				break;

			case TREE_ASSIGN:
				//DBG("Assign\n");
				b_calc_tree(t->right);
				//DBG("to\n");
				//b_calc_tree(t->left);
				b_assign(t->left->id, rd->area);
				break;

			case TREE_VAR:
				//DBG("Variable %d\n", t->id);
				b_get_var_value(t->id, rd->area);
				break;

			case TREE_SCONST:
				//DBG("String\n");
				//io_printf("mov $const_%d, %%eax\n", t->id);
				break;

			case TREE_FCONST:
				//DBG("Float\n");
				b_fconst((float)atof(t->param));
				break;

			case TREE_ICONST:
				//DBG("Integer ");
				//DBG("%d\n", atoi(t->param));
				b_iconst(atoi(t->param));
				break;

			case TREE_PROC_CALL:
			case TREE_FUNC_CALL:
				DBG("Call to %d\n", t->id);
				b_calc_tree(t->left);
				b_func_call(t->id);
				break;

			case TREE_EXPR_LIST:
				DBG("Function parameters\n");
				b_calc_tree(t->left);
				io_printf("push %%eax\n");
				b_calc_tree(t->right);
				break;

			default:
				DBG("Unknown type %d\n", t->type);
				break;
		}
		//DBG("\n");
	}
}