diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2008-08-06 00:07:07 +0100 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2008-08-06 00:07:07 +0100 | 
| commit | 280e655722c8660ec2dff9b08f82b10d5559bfd9 (patch) | |
| tree | 9343c9649ab1f642956b999d1fd37dd2464f6085 /account.c | |
| parent | d84e2a93feae8db909dfbe63b55066cb4e8160dc (diff) | |
Simple exponential backoff code. Have to add a maximum delay setting,
something like 5*5<300: 5s, multiply by 5 on each failure, but stop
increasing once we hit 5m.
Diffstat (limited to 'account.c')
| -rw-r--r-- | account.c | 36 | 
1 files changed, 36 insertions, 0 deletions
| @@ -233,3 +233,39 @@ void account_off( irc_t *irc, account_t *a )  		cancel_auto_reconnect( a );  	}  } + +char *set_eval_account_reconnect_delay( set_t *set, char *value ) +{ +	int start; +	char op; +	int step; +	 +	if( sscanf( value, "%d%c%d", &start, &op, &step ) == 3 && +	    step > 0 && ( op == '+' || op == '*' ) ) +		return value; +	else +		return set_eval_int( set, value ); +} + +int account_reconnect_delay( account_t *a ) +{ +	char *setting = set_getstr( &a->irc->set, "auto_reconnect_delay" ); +	int start, step; +	char op; +	 +	if( sscanf( setting, "%d%c%d", &start, &op, &step ) == 3 && step > 0 ) +	{ +		if( a->auto_reconnect_delay == 0 ) +			return a->auto_reconnect_delay = start; +		else if( op == '+' ) +			return a->auto_reconnect_delay += step; +		else if( op == '*' ) +			return a->auto_reconnect_delay *= step; +	} +	else if( sscanf( setting, "%d", &start ) == 1 ) +	{ +		return a->auto_reconnect_delay = start; +	} +	 +	return 0; +} | 
