const gchar * time_shift_settime(capture_file *cf, guint packet_num, const gchar *time_text) { nstime_t set_time, diff_time, packet_time; frame_data *fd, *packetfd; guint32 i; const gchar *err_str; if (!cf || !time_text) return "Nothing to work with."; if (packet_num < 1 || packet_num > cf->count) return "Packet out of range."; /* * Get a copy of the real time (abs_ts - shift_offset) do we can find out the * difference between the specified time and the original packet */ if ((packetfd = frame_data_sequence_find(cf->frames, packet_num)) == NULL) return "No packets found."; nstime_delta(&packet_time, &(packetfd->abs_ts), &(packetfd->shift_offset)); if ((err_str = time_string_to_nstime(time_text, &packet_time, &set_time)) != NULL) return err_str; /* Calculate difference between packet time and requested time */ nstime_delta(&diff_time, &set_time, &packet_time); /* Up to here nothing is changed */ if ((fd = frame_data_sequence_find(cf->frames, 1)) == NULL) return "No frames found."; /* Shouldn't happen */ modify_time_init(fd); /* Set everything back to the original time */ for (i = 1; i <= cf->count; i++) { if ((fd = frame_data_sequence_find(cf->frames, i)) == NULL) continue; /* Shouldn't happen */ modify_time_perform(fd, SHIFT_POS, &diff_time, SHIFT_SETTOZERO); } packet_list_queue_draw(); return NULL; }
const gchar * time_shift_all(capture_file *cf, const gchar *offset_text) { nstime_t offset; long double offset_float = 0; guint32 i; frame_data *fd; gboolean neg; int h, m; long double f; const gchar *err_str; if (!cf || !offset_text) return "Nothing to work with."; if ((err_str = time_string_parse(offset_text, NULL, NULL, NULL, &neg, &h, &m, &f)) != NULL) return err_str; offset_float = h * 3600 + m * 60 + f; if (offset_float == 0) return "Offset is zero."; nstime_set_zero(&offset); offset.secs = (time_t)floorl(offset_float); offset_float -= offset.secs; offset.nsecs = (int)(offset_float * 1000000000); if ((fd = frame_data_sequence_find(cf->frames, 1)) == NULL) return "No frames found."; /* Shouldn't happen */ modify_time_init(fd); for (i = 1; i <= cf->count; i++) { if ((fd = frame_data_sequence_find(cf->frames, i)) == NULL) continue; /* Shouldn't happen */ modify_time_perform(fd, neg ? SHIFT_NEG : SHIFT_POS, &offset, SHIFT_KEEPOFFSET); } packet_list_queue_draw(); return NULL; }
const gchar * time_shift_undo(capture_file *cf) { guint32 i; frame_data *fd; nstime_t nulltime; if (!cf) return "Nothing to work with."; nulltime.secs = nulltime.nsecs = 0; if (!frame_data_sequence_find(cf->frames, 1)) return "No frames found."; /* Shouldn't happen */ for (i = 1; i <= cf->count; i++) { if ((fd = frame_data_sequence_find(cf->frames, i)) == NULL) continue; /* Shouldn't happen */ modify_time_perform(fd, SHIFT_NEG, &nulltime, SHIFT_SETTOZERO); } packet_list_queue_draw(); return NULL; }
const gchar * time_shift_adjtime(capture_file *cf, guint packet1_num, const gchar *time1_text, guint packet2_num, const gchar *time2_text) { nstime_t nt1, nt2, ot1, ot2, nt3; nstime_t dnt, dot, d3t; frame_data *fd, *packet1fd, *packet2fd; guint32 i; const gchar *err_str; if (!cf || !time1_text || !time2_text) return "Nothing to work with."; if (packet1_num < 1 || packet1_num > cf->count || packet2_num < 1 || packet2_num > cf->count) return "Packet out of range."; /* * The following time format is allowed: * [YYYY-MM-DD] hh:mm:ss(.decimals)? * * Since Wireshark doesn't support regular expressions (please prove me * wrong :-) we will have to figure it out ourselves in the * following order: * * 1. YYYY-MM-DD hh:mm:ss.decimals * 2. hh:mm:ss.decimals * */ /* * Get a copy of the real time (abs_ts - shift_offset) do we can find out the * difference between the specified time and the original packet */ if ((packet1fd = frame_data_sequence_find(cf->frames, packet1_num)) == NULL) return "No frames found."; nstime_copy(&ot1, &(packet1fd->abs_ts)); nstime_subtract(&ot1, &(packet1fd->shift_offset)); if ((err_str = time_string_to_nstime(time1_text, &ot1, &nt1)) != NULL) return err_str; /* * Get a copy of the real time (abs_ts - shift_offset) do we can find out the * difference between the specified time and the original packet */ if ((packet2fd = frame_data_sequence_find(cf->frames, packet2_num)) == NULL) return "No frames found."; nstime_copy(&ot2, &(packet2fd->abs_ts)); nstime_subtract(&ot2, &(packet2fd->shift_offset)); if ((err_str = time_string_to_nstime(time2_text, &ot2, &nt2)) != NULL) return err_str; nstime_copy(&dot, &ot2); nstime_subtract(&dot, &ot1); nstime_copy(&dnt, &nt2); nstime_subtract(&dnt, &nt1); /* Up to here nothing is changed */ if (!frame_data_sequence_find(cf->frames, 1)) return "No frames found."; /* Shouldn't happen */ for (i = 1; i <= cf->count; i++) { if ((fd = frame_data_sequence_find(cf->frames, i)) == NULL) continue; /* Shouldn't happen */ /* Set everything back to the original time */ nstime_subtract(&(fd->abs_ts), &(fd->shift_offset)); nstime_set_zero(&(fd->shift_offset)); /* Add the difference to each packet */ calcNT3(&ot1, &(fd->abs_ts), &nt1, &nt3, &dot, &dnt); nstime_copy(&d3t, &nt3); nstime_subtract(&d3t, &(fd->abs_ts)); modify_time_perform(fd, SHIFT_POS, &d3t, SHIFT_SETTOZERO); } packet_list_queue_draw(); return NULL; }