Exemplo n.º 1
0
/*
 * Prepares a template file.
 */
static apr_status_t parse_template (parser_rec *p) {
	apr_status_t status;
	apr_finfo_t finfo;
	apr_file_t *file;
	apr_size_t size;

	/* read file */
	if ((status = apr_stat(&finfo, p->filename, APR_FINFO_SIZE, p->pool))
			!= APR_SUCCESS) {
		p->err = apr_psprintf(p->pool, "file '%s' does not exist",
				p->filename);
		return status;
	}
	if ((status = apr_file_open(&file, p->filename, APR_READ, 0, p->pool))
			!= APR_SUCCESS) {
		p->err = apr_psprintf(p->pool, "file '%s' cannot be opened",
				p->filename);
		return status;
	}
	apr_pool_cleanup_register(p->pool, file, file_close,
			apr_pool_cleanup_null);
	p->buf = apr_palloc(p->pool, finfo.size + 1);
	size = finfo.size;
	if ((status = apr_file_read(file, p->buf, &size)) != APR_SUCCESS) {
		p->err = apr_psprintf(p->pool, "file '%s' cannot be read",
				p->filename);
		return status;
	}
	if ((status = apr_file_close(file)) != APR_SUCCESS) {
		p->err = apr_psprintf(p->pool, "file '%s' cannot be closed",
				p->filename);
		return status;
	}
	apr_pool_cleanup_kill(p->pool, file, file_close);
	p->buf[size] = '\0';

	/* no parse? */
	if ((p->flags & TEMPLATE_FPARSE) == 0) {
		p->pos = p->buf + size;
		p->begin = p->buf;
		parse_raw(p);
		return APR_SUCCESS;
	}

	/* process elements and substitution, treat all else as raw */
	p->pos = p->buf;
	p->begin = p->pos;
	while (*p->pos != '\0') {
		switch (*p->pos) {
		case '<':
			if ((p->pos[1] == 'l' && p->pos[2] == ':')
					|| (p->pos[1] == '/'
					&& p->pos[2] == 'l'
					&& p->pos[3] == ':')) {
				parse_raw(p);
				if ((status = parse_element(p))
						!= APR_SUCCESS) {
					return status;
				}
				p->begin = p->pos;
			} else {
				p->pos++;
			}
			break;

		case '$':
			switch (p->pos[1]) {
			case '{':
			case '[':
				parse_raw(p);
				if ((status = parse_sub(p)) != APR_SUCCESS) {
					return status;
				}
				p->begin = p->pos;
				break;

			case '$':
				p->pos++;
				parse_raw(p);
				p->pos++;
				p->begin = p->pos;
				break;

			default:
				p->pos++;
			}
			break;

		default:
			p->pos++;
		}
	} 
	parse_raw(p);

	return APR_SUCCESS;
}
Exemplo n.º 2
0
void read_str_file()
{
    int len = 1024;
    int readed = -1;
    STR buff;
    int file_line = 0;
    FILE* str_file;
    if( str_filename == NULL ) UNERR("str_filename not defined");

    buff = (STR) malloc( sizeof(char) * len );
    CHMEM(buff);

    str_file = fopen( str_filename, "r" );
    if( str_file == NULL ) UNERR("Can't open str-file");
    while( fgets( buff, len, str_file ) )
    {
        if( readed ) /*Non empty line*/
        {
            char* pos = strchr( buff, COMMENT_SIGN );
            char* keyword;
            file_line++;
            if( pos ) *pos = '\0'; /* 'remove' comment */
            if( !strlen(buff) ) continue;

            keyword = strtok( buff, " \t\n" );
            if( !keyword ) continue; /* ok we have only spaces and tabs */

            if( strcmp( keyword , SUB_TAG ) == 0 )
            {
                parse_sub();
            }
            else if( strcmp( keyword, BOND_TAG ) == 0 )
            {
                parse_bond();
            }
            else if( strcmp( keyword, ANGLE_TAG ) == 0 )
            {
                parse_angle();
            }
            else if( strcmp( keyword, DIHE_TAG ) == 0 )
            {
                parse_dihe();
            }
            else
            {
                warning( keyword, __FILE__, __LINE__ );
                UNERR( "Unknow tag in str file" );
            }
        }
    }
    end_sub();
    end_angle();
    end_angle_cos();
    end_dihe();
    end_dihe_angle();
    end_bond();

    free( buff );
    fclose( str_file );

    center_coords();/* Center coordinates */
}
Exemplo n.º 3
0
/* Function which parses command options; returns true if it
   ate an option */
static int parse(	int c, 
			char **argv,
			int invert,
			unsigned int *flags,
#ifdef _XTABLES_H
			const void *entry,
#else
			const struct ipt_entry *entry,
			unsigned int *nfcache,
#endif			
			struct ipt_entry_match **match
			)
{
	struct ipt_bandwidth_info *info = (struct ipt_bandwidth_info *)(*match)->data;
	int valid_arg = 0;
	long int num_read;
	uint64_t read_64;
	time_t read_time;

	/* set defaults first time we get here */
	if(*flags == 0)
	{
		/* generate random id */
		srand ( time(NULL) );
		unsigned long id_num = rand();
		sprintf(info->id, "%lu", id_num);

		info->type = BANDWIDTH_COMBINED;
		info->check_type = BANDWIDTH_CHECK_NOSWAP;
		info->local_subnet = 0;
		info->local_subnet_mask = 0;
		info->cmp = BANDWIDTH_MONITOR; /* don't test greater/less than, just monitor bandwidth */
		info->current_bandwidth = 0;
		info->reset_is_constant_interval = 0;
		info->reset_interval = BANDWIDTH_NEVER;
		info->reset_time=0;
		info->last_backup_time = 0;
		info->next_reset = 0;
		
		info->num_intervals_to_save=0;

		info->non_const_self = NULL;
		info->ref_count = NULL;

		*flags = *flags + BANDWIDTH_INITIALIZED;
	}

	switch (c)
	{
		case BANDWIDTH_ID:
			if(strlen(optarg) < BANDWIDTH_MAX_ID_LENGTH)
			{
				sprintf(info->id, "%s", optarg);
				valid_arg = 1;
			}
			c=0;
			break;
		case BANDWIDTH_TYPE:
			valid_arg = 1;
			if(strcmp(optarg, "combined") == 0)
			{
				info->type = BANDWIDTH_COMBINED;
			}
			else if(strcmp(optarg, "individual_src") == 0)
			{
				info->type = BANDWIDTH_INDIVIDUAL_SRC;
			}
			else if(strcmp(optarg, "individual_dst") == 0)
			{
				info->type = BANDWIDTH_INDIVIDUAL_DST;
			}
			else if(strcmp(optarg, "individual_local") == 0)
			{
				info->type = BANDWIDTH_INDIVIDUAL_LOCAL;
				*flags = *flags + BANDWIDTH_REQUIRES_SUBNET;
			}
			else if(strcmp(optarg, "individual_remote") == 0)
			{
				info->type = BANDWIDTH_INDIVIDUAL_REMOTE;
				*flags = *flags + BANDWIDTH_REQUIRES_SUBNET;
			}
			else
			{
				valid_arg = 0;
			}

			c=0;
			break;

		case BANDWIDTH_SUBNET:
			valid_arg =  parse_sub(optarg, &(info->local_subnet), &(info->local_subnet_mask));
			break;
		case BANDWIDTH_LT:
			num_read = sscanf(argv[optind-1], "%lld", &read_64);
			if(num_read > 0 && (*flags & BANDWIDTH_CMP) == 0)
			{
				info->cmp = BANDWIDTH_LT;
				info->bandwidth_cutoff = read_64;
				valid_arg = 1;
			}
			c = BANDWIDTH_CMP; //only need one flag for less_than/greater_than
			break;
		case BANDWIDTH_GT:
			num_read = sscanf(argv[optind-1], "%lld", &read_64);
			if(num_read > 0  && (*flags & BANDWIDTH_CMP) == 0)
			{
				info->cmp = BANDWIDTH_GT;
				info->bandwidth_cutoff = read_64;
				valid_arg = 1;
			}
			c = BANDWIDTH_CMP; //only need one flag for less_than/greater_than
			break;
		case BANDWIDTH_CHECK_NOSWAP:
			if(  (*flags & BANDWIDTH_CMP) == 0 )
			{
				info->cmp = BANDWIDTH_CHECK;
				info->check_type = BANDWIDTH_CHECK_NOSWAP;
				valid_arg = 1;
			}
			c = BANDWIDTH_CMP;
			break;
		case BANDWIDTH_CHECK_SWAP:
			if(  (*flags & BANDWIDTH_CMP) == 0 )
			{
				info->cmp = BANDWIDTH_CHECK;
				info->check_type = BANDWIDTH_CHECK_SWAP;
				valid_arg = 1;
			}
			c = BANDWIDTH_CMP;
			break;
		case BANDWIDTH_CURRENT:
			num_read = sscanf(argv[optind-1], "%lld", &read_64);
			if(num_read > 0 )
			{
				info->current_bandwidth = read_64;
				valid_arg = 1;
			}
			break;
		case BANDWIDTH_RESET_INTERVAL:
			valid_arg = 1;
			if(strcmp(argv[optind-1],"minute") ==0)
			{
				info->reset_interval = BANDWIDTH_MINUTE;
				info->reset_is_constant_interval = 0;
			}
			else if(strcmp(argv[optind-1],"hour") ==0)
			{
				info->reset_interval = BANDWIDTH_HOUR;
				info->reset_is_constant_interval = 0;
			}
			else if(strcmp(argv[optind-1],"day") ==0)
			{
				info->reset_interval = BANDWIDTH_DAY;
				info->reset_is_constant_interval = 0;
			}
			else if(strcmp(argv[optind-1],"week") ==0)
			{
				info->reset_interval = BANDWIDTH_WEEK;
				info->reset_is_constant_interval = 0;
			}
			else if(strcmp(argv[optind-1],"month") ==0)
			{
				info->reset_interval = BANDWIDTH_MONTH;
				info->reset_is_constant_interval = 0;
			}
			else if(strcmp(argv[optind-1],"never") ==0)
			{
				info->reset_interval = BANDWIDTH_NEVER;
			}
			else if(sscanf(argv[optind-1], "%ld", &read_time) > 0)
			{
				info->reset_interval = read_time;
				info->reset_is_constant_interval = 1;
			}
			else
			{
				valid_arg = 0;
			}
			break;
		case BANDWIDTH_NUM_INTERVALS:
			if( sscanf(argv[optind-1], "%ld", &num_read) > 0)
			{
				info->num_intervals_to_save = num_read;
				valid_arg=1;
			}
			c=0;
			break;
		case BANDWIDTH_RESET_TIME:
			num_read = sscanf(argv[optind-1], "%ld", &read_time);
			if(num_read > 0 )
			{
				info->reset_time = read_time;
				valid_arg = 1;
			}	
			break;
		case BANDWIDTH_LAST_BACKUP:
			num_read = sscanf(argv[optind-1], "%ld", &read_time);
			if(num_read > 0 )
			{
				info->last_backup_time = read_time;
				valid_arg = 1;
			}
			break;
	}
	*flags = *flags + (unsigned int)c;


	//if we have both reset_interval & reset_time, check reset_time is in valid range
	if((*flags & BANDWIDTH_RESET_TIME) == BANDWIDTH_RESET_TIME && (*flags & BANDWIDTH_RESET_INTERVAL) == BANDWIDTH_RESET_INTERVAL)
	{
		if(	(info->reset_interval == BANDWIDTH_NEVER) ||
			(info->reset_interval == BANDWIDTH_MONTH && info->reset_time >= 60*60*24*28) ||
			(info->reset_interval == BANDWIDTH_WEEK && info->reset_time >= 60*60*24*7) ||
			(info->reset_interval == BANDWIDTH_DAY && info->reset_time >= 60*60*24) ||
			(info->reset_interval == BANDWIDTH_HOUR && info->reset_time >= 60*60) ||
			(info->reset_interval == BANDWIDTH_MINUTE && info->reset_time >= 60) 
		  )
		{
			valid_arg = 0;
			param_problem_exit_error("Parameter for '--reset_time' is not in valid range");
		}
	}
	if(info->type != BANDWIDTH_COMBINED && (*flags & BANDWIDTH_CURRENT) == BANDWIDTH_CURRENT)
	{
		valid_arg = 0;
		param_problem_exit_error("You may only specify current bandwidth for combined type\n  Use user-space library for setting bandwidth for individual types");
	}

	return valid_arg;
}