/** @file common.c * @date April 24, 2009 */ #include "common.h" #include <sys/time.h> /** The time the stopwatch was started. */ static struct timeval g_stopwatch_time; /* ------------------------------------------------------------------------- */ int return_failure(const char * module, size_t line, int error) { assert(NULL != module); /* Throw away full paths. */ if (strchr(module, '\\') != NULL) { module = strrchr(module, '\\'); assert(module != NULL); module++; } /* Print the module and line number. */ fprintf(stderr, "%s(%d)", module, line); /* Print errno if possible. */ if (error != 0) { fprintf(stderr, ": %s", strerror(error)); } /* End the line and flush. */ fprintf(stderr, "\n"); /* This function always fails. */ return EXIT_FAILURE; } /* ------------------------------------------------------------------------- */ void stopwatch_start(void) { int result; result = gettimeofday(&g_stopwatch_time, NULL); assert(result == 0); } /* ------------------------------------------------------------------------- */ void stopwatch_stop(u_long filesize, size_t retries, u_long packets) { struct timeval duration; struct timeval stop; int ms; int percent; int speed; int result; result = gettimeofday(&stop, NULL); assert(result == 0); /* Accuratly compute and normalize the duration. */ duration.tv_sec = stop.tv_sec - g_stopwatch_time.tv_sec; duration.tv_usec = stop.tv_usec - g_stopwatch_time.tv_usec; while (duration.tv_usec < 0) { duration.tv_sec--; duration.tv_usec += 1000000; } /* Convert the duration unit to milliseconds. */ ms = (int)((duration.tv_sec * 1000) + (duration.tv_usec / 1000)); /* Compute the speed and percentage of packets lost. */ speed = (ms == 0) ? 0 : filesize * 8 / ms; percent = retries * 100 / packets; /* Print out the statistics. */ printf( "STATISTICS\n" "--------------------------------------------------\n" " File size (bytes): %lu\n" " Total time (ms): %d\n" " Speed (kbps): %d\n" " Retries (packets): %u (%d%%)\n" "--------------------------------------------------\n", filesize, ms, speed, retries, percent); }