de-duplicate handling of box operation (create & expunge) options

loops work just fine ...
This commit is contained in:
Oswald Buddenhagen 2014-12-14 17:03:16 +01:00
parent 9982e7bf08
commit 5af1796777

View File

@ -143,10 +143,19 @@ parse_size( conffile_t *cfile )
return ret;
}
static const struct {
int op;
const char *name;
} boxOps[] = {
{ OP_EXPUNGE, "Expunge" },
{ OP_CREATE, "Create" },
};
static int
getopt_helper( conffile_t *cfile, int *cops, channel_conf_t *conf )
{
char *arg;
uint i;
if (!strcasecmp( "Sync", cfile->cmd )) {
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 )));
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 ))
conf->sync_state = expand_strdup( cfile->val );
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 );
else if (!strcasecmp( "ExpireUnread", cfile->cmd ))
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 1;
}
@ -257,7 +256,8 @@ getcline( conffile_t *cfile )
int
merge_ops( int cops, int ops[] )
{
int aops;
int aops, op;
uint i;
aops = ops[M] | ops[S];
if (ops[M] & XOP_HAVE_TYPE) {
@ -290,21 +290,16 @@ merge_ops( int cops, int ops[] )
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;
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_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;
}
ops[M] |= cops & OP_CREATE;
ops[S] |= cops & OP_CREATE;
}
return 0;
}