diff options
author | Sake Blok <sake@euronet.nl> | 2017-06-27 22:04:33 +0200 |
---|---|---|
committer | Sake Blok <sake.blok@SYN-bit.nl> | 2017-07-03 16:41:37 +0000 |
commit | 3803e00367413260cbb543c3c4ed13ae2d8fd194 (patch) | |
tree | e96b7c81846caec9343201ea80e8afeee68dc80c /capture_stop_conditions.c | |
parent | 2c58ed569ed0c096d5640fd0da5825bcfef04aeb (diff) |
Add option to use wall-clock intervals
Add the "interval" option to "-b". Each new capture starts at the
exact start of a time interval. For instance, using -b interval:3600
will start a new capture file at each whole hour.
Changed the duration option in the GUI interfaces to use the new
interval option.
Change-Id: I0180c43843f5d2f0c2f50153c9ce42ac7fa5aeae
Reviewed-on: https://code.wireshark.org/review/22428
Petri-Dish: Anders Broman <a.broman58@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Sake Blok <sake.blok@SYN-bit.nl>
Diffstat (limited to 'capture_stop_conditions.c')
-rw-r--r-- | capture_stop_conditions.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/capture_stop_conditions.c b/capture_stop_conditions.c index 4a2ccaed2a..415bbfedbd 100644 --- a/capture_stop_conditions.c +++ b/capture_stop_conditions.c @@ -40,6 +40,11 @@ static void _cnd_destr_capturesize(condition*); static gboolean _cnd_eval_capturesize(condition*, va_list); static void _cnd_reset_capturesize(condition*); +static condition* _cnd_constr_interval(condition*, va_list); +static void _cnd_destr_interval(condition*); +static gboolean _cnd_eval_interval(condition*, va_list); +static void _cnd_reset_interval(condition*); + void init_capture_stop_conditions(void){ cnd_register_class(CND_CLASS_TIMEOUT, _cnd_constr_timeout, @@ -51,11 +56,17 @@ void init_capture_stop_conditions(void){ _cnd_destr_capturesize, _cnd_eval_capturesize, _cnd_reset_capturesize); + cnd_register_class(CND_CLASS_INTERVAL, + _cnd_constr_interval, + _cnd_destr_interval, + _cnd_eval_interval, + _cnd_reset_interval); } /* END init_capture_stop_conditions() */ void cleanup_capture_stop_conditions(void){ cnd_unregister_class(CND_CLASS_TIMEOUT); cnd_unregister_class(CND_CLASS_CAPTURESIZE); + cnd_unregister_class(CND_CLASS_INTERVAL); } /* END cleanup_capture_stop_conditions() */ /*****************************************************************************/ @@ -208,6 +219,87 @@ static gboolean _cnd_eval_capturesize(condition* cnd, va_list ap){ static void _cnd_reset_capturesize(condition *cnd _U_){ } /* END _cnd_reset_capturesize() */ + +/*****************************************************************************/ +/* Predefined condition 'interval'. */ + +/* class id */ +const char* CND_CLASS_INTERVAL = "cnd_class_interval"; + +/* structure that contains user supplied data for this condition */ +typedef struct _cnd_interval_dat{ + time_t start_time; + gint32 interval_s; +}cnd_interval_dat; + +/* + * Constructs new condition for interval check. This function is invoked by + * 'cnd_new()' in order to perform class specific initialization. + * + * parameter: cnd - Pointer to condition passed by 'cnd_new()'. + * ap - Pointer to user supplied arguments list for this + * constructor. + * returns: Pointer to condition - Construction was successful. + * NULL - Construction failed. + */ +static condition* _cnd_constr_interval(condition* cnd, va_list ap){ + cnd_interval_dat *data = NULL; + /* allocate memory */ + if((data = (cnd_interval_dat*)g_malloc(sizeof(cnd_interval_dat))) == NULL) + return NULL; + /* initialize user data */ + data->start_time = time(NULL); + data->interval_s = va_arg(ap, gint32); + data->start_time -= data->start_time % data->interval_s; + cnd_set_user_data(cnd, (void*)data); + return cnd; +} /* END _cnd_constr_interval() */ + +/* + * Destroys condition for interval check. This function is invoked by + * 'cnd_delete()' in order to perform class specific clean up. + * + * parameter: cnd - Pointer to condition passed by 'cnd_delete()'. + */ +static void _cnd_destr_interval(condition* cnd){ + /* free memory */ + g_free(cnd_get_user_data(cnd)); +} /* END _cnd_destr_interval() */ + +/* + * Condition handler for interval condition. This function is invoked by + * 'cnd_eval()' in order to perform class specific condition checks. + * + * parameter: cnd - The inititalized interval condition. + * ap - Pointer to user supplied arguments list for this + * handler. + * returns: TRUE - Condition is true. + * FALSE - Condition is false. + */ +static gboolean _cnd_eval_interval(condition* cnd, va_list ap _U_){ + cnd_interval_dat* data = (cnd_interval_dat*)cnd_get_user_data(cnd); + gint32 elapsed_time; + /* check interval here */ + if(data->interval_s == 0) return FALSE; /* 0 == infinite */ + elapsed_time = (gint32) (time(NULL) - data->start_time); + if(elapsed_time >= data->interval_s) return TRUE; + return FALSE; +} /* END _cnd_eval_interval()*/ + +/* + * Call this function to reset this condition to its initial state, i.e. the + * state it was in right after creation. + * + * parameter: cnd - Pointer to an initialized condition. + */ +static void _cnd_reset_interval(condition *cnd){ + ((cnd_interval_dat*)cnd_get_user_data(cnd))->start_time = time(NULL); + ((cnd_interval_dat*)cnd_get_user_data(cnd))->start_time -= + ((cnd_interval_dat*)cnd_get_user_data(cnd))->start_time % ((cnd_interval_dat*)cnd_get_user_data(cnd))->interval_s; +} /* END _cnd_reset_interval() */ + + + /* * Editor modelines - http://www.wireshark.org/tools/modelines.html * |