summaryrefslogtreecommitdiff
path: root/file.c
diff options
context:
space:
mode:
authorJakub Sławiński2004-05-31 22:05:30 +0200
committerJoshua Judson Rosen2014-07-17 21:14:58 +0200
commit6525baae022ea244e567e52487bd7a78984ff6a5 (patch)
tree21ac5cfe4c890f3100ce9f7e19be6ea5ac9a0fed /file.c
parentUpdate copyright statements. (diff)
downloadapf-6525baae022ea244e567e52487bd7a78984ff6a5.tar.gz
v0.5.4
- Fixed: default password incompatibilities - Modified: Server listening behaviour - Added: Module support for client's packet filtering - Modified: client behaviour after unsuccessful connection - Fixed: printing ipv6 addresses - Added: IP protocol family strict choice: 'ipv4' and 'ipv6' - Added: flow control / packet buffering - Fixed: signal handling - Fixed: client freeze in udp reverse mode with zlib enabled
Diffstat (limited to 'file.c')
-rw-r--r--file.c280
1 files changed, 145 insertions, 135 deletions
diff --git a/file.c b/file.c
index c1b994e..d3712ea 100644
--- a/file.c
+++ b/file.c
@@ -28,150 +28,160 @@
ConfigurationT
parsefile(char* name, int* status)
{
- static ConfigurationT cfg;
- FILE* file = NULL;
- int state, i, n;
- char buff[256];
- char helpbuf1[256];
- char helpbuf2[256];
+ static ConfigurationT cfg;
+ FILE* file = NULL;
+ int state, i, n;
+ char buff[256];
+ char helpbuf1[256];
+ char helpbuf2[256];
- *status = 1;
+ *status = 1;
- memset(buff, 0, 256);
+ memset(buff, 0, 256);
- cfg.certif = NULL;
- cfg.keys = NULL;
- cfg.size = 0;
- cfg.realmtable = NULL;
- cfg.logging = 0;
- cfg.logfnam = NULL;
+ cfg.certif = NULL;
+ cfg.keys = NULL;
+ cfg.size = 0;
+ cfg.realmtable = NULL;
+ cfg.logging = 0;
+ cfg.logfnam = NULL;
- state = F_UNKNOWN;
+ state = F_UNKNOWN;
- file = fopen(name, "r");
- if (file == NULL) {
- return cfg;
- }
+ file = fopen(name, "r");
+ if (file == NULL) {
+ return cfg;
+ }
- while (fgets(buff, 256, file) != NULL) {
- helpbuf1[0] = 0;
- sscanf(buff, "%s", helpbuf1);
- if (strcmp(helpbuf1, "newrealm")==0) {
- ++cfg.size;
- }
- }
- rewind(file);
+ while (fgets(buff, 256, file) != NULL) {
+ helpbuf1[0] = 0;
+ sscanf(buff, "%s", helpbuf1);
+ if (strcmp(helpbuf1, "newrealm")==0) {
+ ++cfg.size;
+ }
+ }
+ rewind(file);
- cfg.realmtable = calloc(cfg.size, sizeof(RealmT));
- cfg.size = 0;
- *status = 0;
+ cfg.realmtable = calloc(cfg.size, sizeof(RealmT));
+ cfg.size = 0;
+ *status = 0;
- while (fgets(buff, 256, file) != NULL) {
- (*status)++;
- state = sscanf(buff, "%s %s", helpbuf1, helpbuf2);
- if (helpbuf1[0] == '#') {
- memset(buff, 0, 256);
- continue;
- }
- if (state == 1) {
- if (strcmp(helpbuf1, "newrealm")==0) {
- ++cfg.size;
- TYPE_SET_SSL(cfg.realmtable[cfg.size-1].type);
- TYPE_SET_ZLIB(cfg.realmtable[cfg.size-1].type);
- }
- else if (cfg.size == 0) {
- return cfg;
- }
- else if (strcmp(helpbuf1, "nossl")==0) {
- TYPE_UNSET_SSL(cfg.realmtable[cfg.size-1].type);
- }
- else if (strcmp(helpbuf1, "nozlib")==0) {
- TYPE_UNSET_ZLIB(cfg.realmtable[cfg.size-1].type);
- }
- else {
- return cfg;
- }
- }
- else if (state == 2) {
- if (strcmp(helpbuf1, "certificate")==0) {
- cfg.certif = calloc(strlen(helpbuf2)+1, sizeof(char));
- strcpy(cfg.certif, helpbuf2);
- }
- else if (strcmp(helpbuf1, "key")==0) {
- cfg.keys = calloc(strlen(helpbuf2)+1, sizeof(char));
- strcpy(cfg.keys, helpbuf2);
- }
- else if (strcmp(helpbuf1, "heavylog")==0) {
- if (cfg.logging)
- return cfg;
- cfg.logging = 2;
- cfg.logfnam = calloc(strlen(helpbuf2)+1,
- sizeof(char));
- strcpy(cfg.logfnam, helpbuf2);
-
- }
- else if (strcmp(helpbuf1, "lightlog")==0) {
- if (cfg.logging) {
- return cfg;
- }
- cfg.logging = 1;
- cfg.logfnam = calloc(strlen(helpbuf2)+1,
- sizeof(char));
- strcpy(cfg.logfnam, helpbuf2);
- }
- else if (cfg.size == 0) {
- return cfg;
- }
- else if (strcmp(helpbuf1, "hostname")==0) {
- cfg.realmtable[cfg.size-1].hostname = calloc(strlen(helpbuf2)+1,
- sizeof(char));
- strcpy(cfg.realmtable[cfg.size-1].hostname, helpbuf2);
- }
- else if (strcmp(helpbuf1, "listen")==0) {
- cfg.realmtable[cfg.size-1].lisportnum = calloc(strlen(helpbuf2)+1,
- sizeof(char));
- strcpy(cfg.realmtable[cfg.size-1].lisportnum, helpbuf2);
- }
- else if (strcmp(helpbuf1, "pass")==0) {
- n = strlen(helpbuf2);
- for (i = 0; i < n; ++i) {
- cfg.realmtable[cfg.size-1].pass[i%4] += helpbuf2[i];
- }
- }
- else if (strcmp(helpbuf1, "manage")==0) {
- cfg.realmtable[cfg.size-1].manportnum = calloc(strlen(helpbuf2)+1,
- sizeof(char));
- strcpy(cfg.realmtable[cfg.size-1].manportnum, helpbuf2);
- }
- else if (strcmp(helpbuf1, "users")==0) {
- cfg.realmtable[cfg.size-1].users = calloc(strlen(helpbuf2)+1,
- sizeof(char));
- strcpy(cfg.realmtable[cfg.size-1].users, helpbuf2);
- }
- else if (strcmp(helpbuf1, "proto")==0) {
- if (TYPE_IS_SET(cfg.realmtable[cfg.size-1].type)) {
- return cfg;
- }
- if (strcmp(helpbuf2, "tcp")==0) {
- TYPE_SET_TCP(cfg.realmtable[cfg.size-1].type);
- }
- else if (strcmp(helpbuf2, "udp")==0) {
- TYPE_SET_UDP(cfg.realmtable[cfg.size-1].type);
- }
- else {
- return cfg;
- }
- }
- else {
- return cfg;
- }
- }
- memset(buff, 0, 256);
- }
+ while (fgets(buff, 256, file) != NULL) {
+ (*status)++;
+ state = sscanf(buff, "%s %s", helpbuf1, helpbuf2);
+ if (helpbuf1[0] == '#') {
+ memset(buff, 0, 256);
+ continue;
+ }
+ if (state == 1) {
+ if (strcmp(helpbuf1, "newrealm")==0) {
+ ++cfg.size;
+ TYPE_SET_SSL(cfg.realmtable[cfg.size-1].type);
+ TYPE_SET_ZLIB(cfg.realmtable[cfg.size-1].type);
+ }
+ else if (cfg.size == 0) {
+ return cfg;
+ }
+ else if (strcmp(helpbuf1, "nossl")==0) {
+ TYPE_UNSET_SSL(cfg.realmtable[cfg.size-1].type);
+ }
+ else if (strcmp(helpbuf1, "nozlib")==0) {
+ TYPE_UNSET_ZLIB(cfg.realmtable[cfg.size-1].type);
+ }
+ else if (strcmp(helpbuf1, "ipv4")==0) {
+ if (TYPE_IS_UNSPEC(cfg.realmtable[cfg.size-1].type)) {
+ TYPE_SET_IPV4(cfg.realmtable[cfg.size-1].type);
+ }
+ else {
+ return cfg;
+ }
+ }
+ else if (strcmp(helpbuf1, "ipv6")==0) {
+ if (TYPE_IS_UNSPEC(cfg.realmtable[cfg.size-1].type)) {
+ TYPE_SET_IPV6(cfg.realmtable[cfg.size-1].type);
+ }
+ else {
+ return cfg;
+ }
+ }
+ else {
+ return cfg;
+ }
+ }
+ else if (state == 2) {
+ if (strcmp(helpbuf1, "certificate")==0) {
+ cfg.certif = calloc(strlen(helpbuf2)+1, sizeof(char));
+ strcpy(cfg.certif, helpbuf2);
+ }
+ else if (strcmp(helpbuf1, "key")==0) {
+ cfg.keys = calloc(strlen(helpbuf2)+1, sizeof(char));
+ strcpy(cfg.keys, helpbuf2);
+ }
+ else if (strcmp(helpbuf1, "heavylog")==0) {
+ if (cfg.logging) {
+ return cfg;
+ }
+ cfg.logging = 3;
+ cfg.logfnam = calloc(strlen(helpbuf2)+1, sizeof(char));
+ strcpy(cfg.logfnam, helpbuf2);
+ }
+ else if (strcmp(helpbuf1, "lightlog")==0) {
+ if (cfg.logging) {
+ return cfg;
+ }
+ cfg.logging = 1;
+ cfg.logfnam = calloc(strlen(helpbuf2)+1, sizeof(char));
+ strcpy(cfg.logfnam, helpbuf2);
+ }
+ else if (cfg.size == 0) {
+ return cfg;
+ }
+ else if (strcmp(helpbuf1, "hostname")==0) {
+ cfg.realmtable[cfg.size-1].hostname = calloc(strlen(helpbuf2)+1, sizeof(char));
+ strcpy(cfg.realmtable[cfg.size-1].hostname, helpbuf2);
+ }
+ else if (strcmp(helpbuf1, "listen")==0) {
+ cfg.realmtable[cfg.size-1].lisportnum = calloc(strlen(helpbuf2)+1, sizeof(char));
+ strcpy(cfg.realmtable[cfg.size-1].lisportnum, helpbuf2);
+ }
+ else if (strcmp(helpbuf1, "pass")==0) {
+ n = strlen(helpbuf2);
+ for (i = 0; i < n; ++i) {
+ cfg.realmtable[cfg.size-1].pass[i%4] += helpbuf2[i];
+ }
+ }
+ else if (strcmp(helpbuf1, "manage")==0) {
+ cfg.realmtable[cfg.size-1].manportnum = calloc(strlen(helpbuf2)+1, sizeof(char));
+ strcpy(cfg.realmtable[cfg.size-1].manportnum, helpbuf2);
+ }
+ else if (strcmp(helpbuf1, "users")==0) {
+ cfg.realmtable[cfg.size-1].users = calloc(strlen(helpbuf2)+1, sizeof(char));
+ strcpy(cfg.realmtable[cfg.size-1].users, helpbuf2);
+ }
+ else if (strcmp(helpbuf1, "proto")==0) {
+ if (TYPE_IS_SET(cfg.realmtable[cfg.size-1].type)) {
+ return cfg;
+ }
+ if (strcmp(helpbuf2, "tcp")==0) {
+ TYPE_SET_TCP(cfg.realmtable[cfg.size-1].type);
+ }
+ else if (strcmp(helpbuf2, "udp")==0) {
+ TYPE_SET_UDP(cfg.realmtable[cfg.size-1].type);
+ }
+ else {
+ return cfg;
+ }
+ }
+ else {
+ return cfg;
+ }
+ }
+ memset(buff, 0, 256);
+ }
- fclose(file);
+ fclose(file);
- *status = 0;
- return cfg;
+ *status = 0;
+ return cfg;
}