wget: use monotonic_sec instead of gettimeofday
zcip: use monotonic_us instead of gettimeofday
udhcpcd: simpler, shorter random_xid()

function                                             old     new   delta
monotonic_sec                                          -      41     +41
find_pair                                            164     180     +16
run_list_real                                       2018    2028     +10
cmp_main                                             547     555      +8
collect_ctx                                          112     119      +7
singlemount                                         4544    4549      +5
time_main                                           1124    1128      +4
static.start_sec                                       -       4      +4
static.lastupdate_sec                                  -       4      +4
sock                                                   -       4      +4
read_package_field                                   253     257      +4
pick                                                  38      40      +2
get_next_line                                        145     147      +2
count_lines                                           59      61      +2
process_stdin                                        435     433      -2
xstrtoul_range_sfx                                   229     226      -3
static.initialized                                     4       1      -3
dhcprelay_main                                      1125    1122      -3
catcher                                              380     377      -3
arping_main                                         1969    1966      -3
s                                                      8       4      -4
cfg                                                    4       -      -4
static.lastupdate                                      8       -      -8
start                                                  8       -      -8
random_xid                                            95      33     -62
.rodata                                           129114  129050     -64
zcip_main                                           1731    1576    -155
progressmeter                                       1035     867    -168
------------------------------------------------------------------------------
(add/remove: 4/3 grow/shrink: 10/11 up/down: 113/-490)       Total: -377 bytes

diff --git a/networking/wget.c b/networking/wget.c
index fc7f7c3..8be37a7 100644
--- a/networking/wget.c
+++ b/networking/wget.c
@@ -38,7 +38,6 @@
 #if ENABLE_FEATURE_WGET_STATUSBAR
 static void progressmeter(int flag);
 static const char *curfile;             /* Name of current file being transferred */
-static struct timeval start;            /* Time a transfer started */
 enum {
 	STALLTIME = 5                   /* Seconds when xfer considered "stalled" */
 };
@@ -683,30 +682,30 @@
 	setitimer(ITIMER_REAL, &itv, NULL);
 }
 
-
 static void
 progressmeter(int flag)
 {
-	static struct timeval lastupdate;
+	static unsigned lastupdate_sec;
+	static unsigned start_sec;
 	static off_t lastsize, totalsize;
 
-	struct timeval now, td, tvwait;
 	off_t abbrevsize;
-	int elapsed, ratio, barlength, i;
+	unsigned since_last_update, elapsed;
+	unsigned ratio;
+	int barlength, i;
 
 	if (flag == -1) { /* first call to progressmeter */
-		gettimeofday(&start, NULL);
-		lastupdate = start;
+		start_sec = monotonic_sec();
+		lastupdate_sec = start_sec;
 		lastsize = 0;
 		totalsize = content_len + beg_range; /* as content_len changes.. */
 	}
 
-	gettimeofday(&now, NULL);
 	ratio = 100;
 	if (totalsize != 0 && !chunked) {
-		/* long long helps to have working ETA even if !LFS */
-		ratio = (int) (100ULL * (transferred+beg_range) / totalsize);
-		ratio = MIN(ratio, 100);
+		/* long long helps to have it working even if !LFS */
+		ratio = (unsigned) (100ULL * (transferred+beg_range) / totalsize);
+		if (ratio > 100) ratio = 100;
 	}
 
 	fprintf(stderr, "\r%-20.20s%4d%% ", curfile, ratio);
@@ -714,12 +713,13 @@
 	barlength = getttywidth() - 51;
 	if (barlength > 0) {
 		/* god bless gcc for variable arrays :) */
-		char buf[barlength+1];
 		i = barlength * ratio / 100;
-		memset(buf, '*', i);
-		memset(buf + i, ' ', barlength - i);
-		buf[barlength] = '\0';
-		fprintf(stderr, "|%s|", buf);
+		{
+			char buf[i+1];
+			memset(buf, '*', i);
+			buf[i] = '\0';
+			fprintf(stderr, "|%s%*s|", buf, barlength - i, "");
+		}
 	}
 	i = 0;
 	abbrevsize = transferred + beg_range;
@@ -730,22 +730,28 @@
 	/* see http://en.wikipedia.org/wiki/Tera */
 	fprintf(stderr, "%6d %c%c ", (int)abbrevsize, " KMGTPEZY"[i], i?'B':' ');
 
-	timersub(&now, &lastupdate, &tvwait);
-	if (transferred > lastsize) {
-		lastupdate = now;
-		lastsize = transferred;
-		if (tvwait.tv_sec >= STALLTIME)
-			timeradd(&start, &tvwait, &start);
-		tvwait.tv_sec = 0;
-	}
-	timersub(&now, &start, &td);
-	elapsed = td.tv_sec;
+// Nuts! Ain't it easier to update progress meter ONLY when we transferred++?
+// FIXME: get rid of alarmtimer + updateprogressmeter mess
 
-	if (tvwait.tv_sec >= STALLTIME) {
+	elapsed = monotonic_sec();
+	since_last_update = elapsed - lastupdate_sec;
+	if (transferred > lastsize) {
+		lastupdate_sec = elapsed;
+		lastsize = transferred;
+		if (since_last_update >= STALLTIME) {
+			/* We "cut off" these seconds from elapsed time
+			 * by adjusting start time */
+			start_sec += since_last_update;
+		}
+		since_last_update = 0; /* we are un-stalled now */
+	}
+	elapsed -= start_sec; /* now it's "elapsed since start" */
+
+	if (since_last_update >= STALLTIME) {
 		fprintf(stderr, " - stalled -");
 	} else {
 		off_t to_download = totalsize - beg_range;
-		if (transferred <= 0 || elapsed <= 0 || transferred > to_download || chunked) {
+		if (transferred <= 0 || (int)elapsed <= 0 || transferred > to_download || chunked) {
 			fprintf(stderr, "--:--:-- ETA");
 		} else {
 			/* to_download / (transferred/elapsed) - elapsed: */