|
@@ -143,10 +143,19 @@ parse_size( conffile_t *cfile )
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static const struct {
|
|
|
|
+ int op;
|
|
|
|
+ const char *name;
|
|
|
|
+} boxOps[] = {
|
|
|
|
+ { OP_EXPUNGE, "Expunge" },
|
|
|
|
+ { OP_CREATE, "Create" },
|
|
|
|
+};
|
|
|
|
+
|
|
static int
|
|
static int
|
|
getopt_helper( conffile_t *cfile, int *cops, channel_conf_t *conf )
|
|
getopt_helper( conffile_t *cfile, int *cops, channel_conf_t *conf )
|
|
{
|
|
{
|
|
char *arg;
|
|
char *arg;
|
|
|
|
+ uint i;
|
|
|
|
|
|
if (!strcasecmp( "Sync", cfile->cmd )) {
|
|
if (!strcasecmp( "Sync", cfile->cmd )) {
|
|
arg = cfile->val;
|
|
arg = cfile->val;
|
|
@@ -188,38 +197,6 @@ getopt_helper( conffile_t *cfile, int *cops, channel_conf_t *conf )
|
|
}
|
|
}
|
|
while ((arg = get_arg( cfile, ARG_OPTIONAL, 0 )));
|
|
while ((arg = get_arg( cfile, ARG_OPTIONAL, 0 )));
|
|
conf->ops[M] |= XOP_HAVE_TYPE;
|
|
conf->ops[M] |= XOP_HAVE_TYPE;
|
|
- } else if (!strcasecmp( "Expunge", cfile->cmd )) {
|
|
|
|
- arg = cfile->val;
|
|
|
|
- do
|
|
|
|
- if (!strcasecmp( "Both", arg ))
|
|
|
|
- *cops |= OP_EXPUNGE;
|
|
|
|
- else if (!strcasecmp( "Master", arg ))
|
|
|
|
- conf->ops[M] |= OP_EXPUNGE;
|
|
|
|
- else if (!strcasecmp( "Slave", arg ))
|
|
|
|
- conf->ops[S] |= OP_EXPUNGE;
|
|
|
|
- else if (strcasecmp( "None", arg )) {
|
|
|
|
- error( "%s:%d: invalid Expunge arg '%s'\n",
|
|
|
|
- cfile->file, cfile->line, arg );
|
|
|
|
- cfile->err = 1;
|
|
|
|
- }
|
|
|
|
- while ((arg = get_arg( cfile, ARG_OPTIONAL, 0 )));
|
|
|
|
- conf->ops[M] |= XOP_HAVE_EXPUNGE;
|
|
|
|
- } else if (!strcasecmp( "Create", cfile->cmd )) {
|
|
|
|
- arg = cfile->val;
|
|
|
|
- do
|
|
|
|
- if (!strcasecmp( "Both", arg ))
|
|
|
|
- *cops |= OP_CREATE;
|
|
|
|
- else if (!strcasecmp( "Master", arg ))
|
|
|
|
- conf->ops[M] |= OP_CREATE;
|
|
|
|
- else if (!strcasecmp( "Slave", arg ))
|
|
|
|
- conf->ops[S] |= OP_CREATE;
|
|
|
|
- else if (strcasecmp( "None", arg )) {
|
|
|
|
- error( "%s:%d: invalid Create arg '%s'\n",
|
|
|
|
- cfile->file, cfile->line, arg );
|
|
|
|
- cfile->err = 1;
|
|
|
|
- }
|
|
|
|
- while ((arg = get_arg( cfile, ARG_OPTIONAL, 0 )));
|
|
|
|
- conf->ops[M] |= XOP_HAVE_CREATE;
|
|
|
|
} else if (!strcasecmp( "SyncState", cfile->cmd ))
|
|
} else if (!strcasecmp( "SyncState", cfile->cmd ))
|
|
conf->sync_state = expand_strdup( cfile->val );
|
|
conf->sync_state = expand_strdup( cfile->val );
|
|
else if (!strcasecmp( "CopyArrivalDate", cfile->cmd ))
|
|
else if (!strcasecmp( "CopyArrivalDate", cfile->cmd ))
|
|
@@ -228,8 +205,30 @@ getopt_helper( conffile_t *cfile, int *cops, channel_conf_t *conf )
|
|
conf->max_messages = parse_int( cfile );
|
|
conf->max_messages = parse_int( cfile );
|
|
else if (!strcasecmp( "ExpireUnread", cfile->cmd ))
|
|
else if (!strcasecmp( "ExpireUnread", cfile->cmd ))
|
|
conf->expire_unread = parse_bool( cfile );
|
|
conf->expire_unread = parse_bool( cfile );
|
|
- else
|
|
|
|
|
|
+ else {
|
|
|
|
+ for (i = 0; i < as(boxOps); i++) {
|
|
|
|
+ if (!strcasecmp( boxOps[i].name, cfile->cmd )) {
|
|
|
|
+ int op = boxOps[i].op;
|
|
|
|
+ arg = cfile->val;
|
|
|
|
+ do {
|
|
|
|
+ if (!strcasecmp( "Both", arg )) {
|
|
|
|
+ *cops |= op;
|
|
|
|
+ } else if (!strcasecmp( "Master", arg )) {
|
|
|
|
+ conf->ops[M] |= op;
|
|
|
|
+ } else if (!strcasecmp( "Slave", arg )) {
|
|
|
|
+ conf->ops[S] |= op;
|
|
|
|
+ } else if (strcasecmp( "None", arg )) {
|
|
|
|
+ error( "%s:%d: invalid %s arg '%s'\n",
|
|
|
|
+ cfile->file, cfile->line, boxOps[i].name, arg );
|
|
|
|
+ cfile->err = 1;
|
|
|
|
+ }
|
|
|
|
+ } while ((arg = get_arg( cfile, ARG_OPTIONAL, 0 )));
|
|
|
|
+ conf->ops[M] |= op * (XOP_HAVE_EXPUNGE / OP_EXPUNGE);
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
return 0;
|
|
return 0;
|
|
|
|
+ }
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -257,7 +256,8 @@ getcline( conffile_t *cfile )
|
|
int
|
|
int
|
|
merge_ops( int cops, int ops[] )
|
|
merge_ops( int cops, int ops[] )
|
|
{
|
|
{
|
|
- int aops;
|
|
|
|
|
|
+ int aops, op;
|
|
|
|
+ uint i;
|
|
|
|
|
|
aops = ops[M] | ops[S];
|
|
aops = ops[M] | ops[S];
|
|
if (ops[M] & XOP_HAVE_TYPE) {
|
|
if (ops[M] & XOP_HAVE_TYPE) {
|
|
@@ -290,21 +290,16 @@ merge_ops( int cops, int ops[] )
|
|
ops[M] |= cops & OP_MASK_TYPE;
|
|
ops[M] |= cops & OP_MASK_TYPE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if (ops[M] & XOP_HAVE_EXPUNGE) {
|
|
|
|
- if (aops & cops & OP_EXPUNGE) {
|
|
|
|
- error( "Conflicting Expunge args specified.\n" );
|
|
|
|
- return 1;
|
|
|
|
- }
|
|
|
|
- ops[M] |= cops & OP_EXPUNGE;
|
|
|
|
- ops[S] |= cops & OP_EXPUNGE;
|
|
|
|
- }
|
|
|
|
- if (ops[M] & XOP_HAVE_CREATE) {
|
|
|
|
- if (aops & cops & OP_CREATE) {
|
|
|
|
- error( "Conflicting Create args specified.\n" );
|
|
|
|
- return 1;
|
|
|
|
|
|
+ for (i = 0; i < as(boxOps); i++) {
|
|
|
|
+ op = boxOps[i].op;
|
|
|
|
+ if (ops[M] & (op * (XOP_HAVE_EXPUNGE / OP_EXPUNGE))) {
|
|
|
|
+ if (aops & cops & op) {
|
|
|
|
+ error( "Conflicting %s args specified.\n", boxOps[i].name );
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
|
|
+ ops[M] |= cops & op;
|
|
|
|
+ ops[S] |= cops & op;
|
|
}
|
|
}
|
|
- ops[M] |= cops & OP_CREATE;
|
|
|
|
- ops[S] |= cops & OP_CREATE;
|
|
|
|
}
|
|
}
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|