/* * 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; }
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 */ }
/* 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; }