|
version 1.1.1.1, 2012/02/21 23:16:02
|
version 1.1.1.2, 2013/07/22 00:32:35
|
|
Line 2
|
Line 2
|
| /* MiniUPnP project |
/* MiniUPnP project |
| * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ |
* http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ |
| * author: Ryan Wagoner |
* author: Ryan Wagoner |
| * (c) 2006 Thomas Bernard | * (c) 2006-2012 Thomas Bernard |
| * This software is subject to the conditions detailed |
* This software is subject to the conditions detailed |
| * in the LICENCE file provided within the distribution */ |
* in the LICENCE file provided within the distribution */ |
| |
|
|
Line 11
|
Line 11
|
| #include <stdlib.h> |
#include <stdlib.h> |
| #include <ctype.h> |
#include <ctype.h> |
| #include <syslog.h> |
#include <syslog.h> |
| |
#include "config.h" |
| #include "options.h" |
#include "options.h" |
| #include "upnppermissions.h" |
#include "upnppermissions.h" |
| #include "upnpglobalvars.h" |
#include "upnpglobalvars.h" |
| |
|
| |
#ifndef DISABLE_CONFIG_FILE |
| struct option * ary_options = NULL; |
struct option * ary_options = NULL; |
| int num_options = 0; | static char * string_repo = NULL; |
| | unsigned int num_options = 0; |
| |
|
| static const struct { |
static const struct { |
| enum upnpconfigoptions id; |
enum upnpconfigoptions id; |
|
Line 29 static const struct {
|
Line 32 static const struct {
|
| { UPNPBITRATE_UP, "bitrate_up" }, |
{ UPNPBITRATE_UP, "bitrate_up" }, |
| { UPNPBITRATE_DOWN, "bitrate_down" }, |
{ UPNPBITRATE_DOWN, "bitrate_down" }, |
| { UPNPPRESENTATIONURL, "presentation_url" }, |
{ UPNPPRESENTATIONURL, "presentation_url" }, |
| |
{ UPNPFRIENDLY_NAME, "friendly_name" }, |
| { UPNPNOTIFY_INTERVAL, "notify_interval" }, |
{ UPNPNOTIFY_INTERVAL, "notify_interval" }, |
| { UPNPSYSTEM_UPTIME, "system_uptime" }, |
{ UPNPSYSTEM_UPTIME, "system_uptime" }, |
| { UPNPPACKET_LOG, "packet_log" }, |
{ UPNPPACKET_LOG, "packet_log" }, |
|
Line 46 static const struct {
|
Line 50 static const struct {
|
| #endif |
#endif |
| { UPNPENABLE, "enable_upnp"}, |
{ UPNPENABLE, "enable_upnp"}, |
| #ifdef USE_PF |
#ifdef USE_PF |
| |
{ UPNPANCHOR, "anchor"}, |
| { UPNPQUEUE, "queue"}, |
{ UPNPQUEUE, "queue"}, |
| { UPNPTAG, "tag"}, |
{ UPNPTAG, "tag"}, |
| #endif |
#endif |
|
Line 69 readoptionsfile(const char * fname)
|
Line 74 readoptionsfile(const char * fname)
|
| char *value; |
char *value; |
| char *t; |
char *t; |
| int linenum = 0; |
int linenum = 0; |
| int i; | unsigned int i; |
| enum upnpconfigoptions id; |
enum upnpconfigoptions id; |
| |
size_t string_repo_len = 0; |
| |
size_t len; |
| |
void *tmp; |
| |
|
| if(!fname || (strlen(fname) == 0)) |
if(!fname || (strlen(fname) == 0)) |
| return -1; |
return -1; |
|
Line 93 readoptionsfile(const char * fname)
|
Line 101 readoptionsfile(const char * fname)
|
| while(fgets(buffer, sizeof(buffer), hfile)) |
while(fgets(buffer, sizeof(buffer), hfile)) |
| { |
{ |
| linenum++; |
linenum++; |
| t = strchr(buffer, '\n'); | t = strchr(buffer, '\n'); |
| if(t) |
if(t) |
| { |
{ |
| *t = '\0'; |
*t = '\0'; |
| t--; |
t--; |
| |
/* remove spaces at the end of the line */ |
| while((t >= buffer) && isspace(*t)) |
while((t >= buffer) && isspace(*t)) |
| { |
{ |
| *t = '\0'; |
*t = '\0'; |
| t--; |
t--; |
| } |
} |
| } |
} |
| | |
| /* skip leading whitespaces */ |
/* skip leading whitespaces */ |
| name = buffer; |
name = buffer; |
| while(isspace(*name)) |
while(isspace(*name)) |
|
Line 116 readoptionsfile(const char * fname)
|
Line 125 readoptionsfile(const char * fname)
|
| /* check for UPnP permissions rule */ |
/* check for UPnP permissions rule */ |
| if(0 == memcmp(name, "allow", 5) || 0 == memcmp(name, "deny", 4)) |
if(0 == memcmp(name, "allow", 5) || 0 == memcmp(name, "deny", 4)) |
| { |
{ |
| upnppermlist = realloc(upnppermlist, | tmp = realloc(upnppermlist, sizeof(struct upnpperm) * (num_upnpperm+1)); |
| sizeof(struct upnpperm) * (num_upnpperm+1)); | if(tmp == NULL) |
| /* parse the rule */ | |
| if(read_permission_line(upnppermlist + num_upnpperm, name) >= 0) | |
| { |
{ |
| num_upnpperm++; | fprintf(stderr, "memory allocation error. Permission line in file %s line %d\n", |
| | fname, linenum); |
| } |
} |
| else |
else |
| { |
{ |
| fprintf(stderr, "parsing error file %s line %d : %s\n", | upnppermlist = tmp; |
| fname, linenum, name); | /* parse the rule */ |
| | if(read_permission_line(upnppermlist + num_upnpperm, name) >= 0) |
| | { |
| | num_upnpperm++; |
| | } |
| | else |
| | { |
| | fprintf(stderr, "parsing error file %s line %d : %s\n", |
| | fname, linenum, name); |
| | } |
| } |
} |
| continue; |
continue; |
| } |
} |
|
Line 163 readoptionsfile(const char * fname)
|
Line 180 readoptionsfile(const char * fname)
|
| |
|
| if(id == UPNP_INVALID) |
if(id == UPNP_INVALID) |
| { |
{ |
| fprintf(stderr, "parsing error file %s line %d : %s=%s\n", | fprintf(stderr, "invalid option in file %s line %d : %s=%s\n", |
| fname, linenum, name, value); |
fname, linenum, name, value); |
| } |
} |
| else |
else |
| { |
{ |
| num_options += 1; | tmp = realloc(ary_options, (num_options + 1) * sizeof(struct option)); |
| ary_options = (struct option *) realloc(ary_options, num_options * sizeof(struct option)); | if(tmp == NULL) |
| { |
| ary_options[num_options-1].id = id; | fprintf(stderr, "memory allocation error. Option in file %s line %d.\n", |
| strncpy(ary_options[num_options-1].value, value, MAX_OPTION_VALUE_LEN); | fname, linenum); |
| | } |
| | else |
| | { |
| | ary_options = tmp; |
| | len = strlen(value) + 1; /* +1 for terminating '\0' */ |
| | tmp = realloc(string_repo, string_repo_len + len); |
| | if(tmp == NULL) |
| | { |
| | fprintf(stderr, "memory allocation error, Option value in file %s line %d : %s=%s\n", |
| | fname, linenum, name, value); |
| | } |
| | else |
| | { |
| | string_repo = tmp; |
| | memcpy(string_repo + string_repo_len, value, len); |
| | ary_options[num_options].id = id; |
| | /* save the offset instead of the absolute address because realloc() could |
| | * change it */ |
| | ary_options[num_options].value = (const char *)string_repo_len; |
| | num_options += 1; |
| | string_repo_len += len; |
| | } |
| | } |
| } |
} |
| |
|
| } |
} |
| | |
| fclose(hfile); |
fclose(hfile); |
| | |
| | for(i = 0; i < num_options; i++) |
| | { |
| | /* add start address of string_repo to get right pointer */ |
| | ary_options[i].value = string_repo + (size_t)ary_options[i].value; |
| | } |
| | |
| return 0; |
return 0; |
| } |
} |
| |
|
|
Line 191 freeoptions(void)
|
Line 237 freeoptions(void)
|
| ary_options = NULL; |
ary_options = NULL; |
| num_options = 0; |
num_options = 0; |
| } |
} |
| |
if(string_repo) |
| |
{ |
| |
free(string_repo); |
| |
string_repo = NULL; |
| |
} |
| |
if(upnppermlist) |
| |
{ |
| |
free(upnppermlist); |
| |
upnppermlist = NULL; |
| |
num_upnpperm = 0; |
| |
} |
| } |
} |
| |
|
| |
#endif /* DISABLE_CONFIG_FILE */ |
| |
|