Swaping accounts for sending diff in-line and not have gmail fuck it up. On Sat, Aug 17, 2013 at 20:03:32 -0600, Theo de Raadt wrote: > > > > So basically, this takes a long long value, and casts it to a long. > > > > > > Yes, but that's not the entire story. > > > > > > the function declaration is: long nextTimeout(int resolution) > > > > > > So it would truncate anyway. But look at it closer. It > > > takes the value of timeval.tv_sec (your time_t / long long) > > > and mod's it with resolution (an int value). The only thing > > > it then does is multiply it by 1000L. > > > > > > The only reason this function "broke" is C++'s std::max() > > > defined as a template function, requiring both args be of > > > the same typename. Since the original code uses 1000L > > > literal for the first arg, the compiler was having issues with > > > the long long as the second arg., but ... > > > > > > What is long long % int? another int value? Yes, I realize > > > it would be a long long according to the compiler, but, > > > I fail to see where/how 0xFFFFFFFFFFFFFFFF % 0xFF would > > > ever be greater than 0xfe. > > > > > > As is, the best you can expect from that function is a long > > > second argument for std::max(). Unless I'm completely missing > > > something here (and I'll certainly budget for that possibility). > > > > You're completely missing the point. > > > > We provide an opportunity to the entire community to fix things > > in the best way possible. > > > > And you squander it. > > > > The solution is to take all the subsystems and arguments to time_t, > > throughout the entire program, and then do the best from there. > > > > Instead, you chose to prematurely downcast. > > Now, before you say this is impossible or ridiculous, let me say this. > > We did what I suggest to the entire base tree, before the kernel > changes were commited. If we can do this to the entire base tree > system -- something much much larger than the average package, then > people working in the ports tree can at least try to not squander > the opportunity. > > Please & thanks.
unsquandering ... (hopefully) The reason for the extra REVISION bump is for ajacoutot@'s patch-src_Toolbar_cc addition (it missed the bump?). Minimally tested. Index: Makefile =================================================================== RCS file: /cvs/obsd/ports/x11/blackbox/Makefile,v retrieving revision 1.51 diff -u -p -u -p -r1.51 Makefile --- Makefile 21 Mar 2013 08:48:55 -0000 1.51 +++ Makefile 18 Aug 2013 07:14:22 -0000 @@ -1,9 +1,9 @@ -# $OpenBSD: Makefile,v 1.50 2013/03/11 11:46:08 espie Exp $ +# $OpenBSD: Makefile,v 1.51 2013/03/21 08:48:55 ajacoutot Exp $ COMMENT= small & pretty window manager for 8 and more bits displays DISTNAME= blackbox-0.70.1 -REVISION= 2 +REVISION= 4 CATEGORIES= x11 HOMEPAGE= http://blackboxwm.sourceforge.net/ Index: patches/patch-lib_Resource_cc =================================================================== RCS file: patches/patch-lib_Resource_cc diff -N patches/patch-lib_Resource_cc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-lib_Resource_cc 18 Aug 2013 07:14:22 -0000 @@ -0,0 +1,20 @@ +$OpenBSD$ + +64bit time_t fix. + +--- lib/Resource.cc.orig Wed Apr 6 14:16:50 2005 ++++ lib/Resource.cc Sat Aug 17 22:26:11 2013 +@@ -207,6 +207,13 @@ void bt::Resource::write(const char* resource, unsigne + } + + ++void bt::Resource::write(const char* resource, unsigned long long value) { ++ char tmp[64]; ++ sprintf(tmp, "%llu", value); ++ write(resource, tmp); ++} ++ ++ + void bt::Resource::write(const char* resource, bool value) + { write(resource, boolAsString(value)); } + Index: patches/patch-lib_Resource_hh =================================================================== RCS file: patches/patch-lib_Resource_hh diff -N patches/patch-lib_Resource_hh --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-lib_Resource_hh 18 Aug 2013 07:14:22 -0000 @@ -0,0 +1,14 @@ +$OpenBSD$ + +64bit time_t fix. + +--- lib/Resource.hh.orig Mon Jan 3 01:42:52 2005 ++++ lib/Resource.hh Sat Aug 17 22:25:59 2013 +@@ -78,6 +78,7 @@ namespace bt { + void write(const char* resource, unsigned int value); + void write(const char* resource, long value); + void write(const char* resource, unsigned long value); ++ void write(const char* resource, unsigned long long value); + void write(const char* resource, bool value); + void write(const char* resource, double value); + Index: patches/patch-lib_Timer_cc =================================================================== RCS file: patches/patch-lib_Timer_cc diff -N patches/patch-lib_Timer_cc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-lib_Timer_cc 18 Aug 2013 07:14:22 -0000 @@ -0,0 +1,25 @@ +$OpenBSD$ + +64bit time_t fix. + +--- lib/Timer.cc.orig Fri Mar 18 01:07:09 2005 ++++ lib/Timer.cc Sat Aug 17 22:43:13 2013 +@@ -28,8 +28,7 @@ + + + bt::timeval::timeval(const ::timeval &t) +- : tv_sec(t.tv_sec), tv_usec(t.tv_usec) +-{ } ++{ tv_sec = t.tv_sec; tv_usec = t.tv_usec; } + + + bool bt::timeval::operator<(const timeval &tv) +@@ -105,7 +104,7 @@ void bt::Timer::adjustStartTime(const timeval &offset) + { _start += offset; } + + +-void bt::Timer::setTimeout(long t) { ++void bt::Timer::setTimeout(time_t t) { + _timeout.tv_sec = t / 1000; + _timeout.tv_usec = t % 1000; + _timeout.tv_usec *= 1000; Index: patches/patch-lib_Timer_hh =================================================================== RCS file: patches/patch-lib_Timer_hh diff -N patches/patch-lib_Timer_hh --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-lib_Timer_hh 18 Aug 2013 07:14:22 -0000 @@ -0,0 +1,36 @@ +$OpenBSD$ + +64bit time_t fix. + +--- lib/Timer.hh.orig Fri Mar 18 01:07:09 2005 ++++ lib/Timer.hh Sat Aug 17 22:43:03 2013 +@@ -37,16 +37,12 @@ struct timeval; + namespace bt { + + // use a wrapper class to avoid the header as well +- struct timeval { +- long tv_sec; +- long tv_usec; ++ struct timeval : public ::timeval { + + inline timeval(void) +- : tv_sec(0l), tv_usec(0l) +- { } +- inline timeval(long s, long u) +- : tv_sec(s), tv_usec(u) +- { } ++ { tv_sec = 0; tv_usec = 0; } ++ inline timeval(time_t s, long u) ++ { tv_sec = s; tv_usec = u; } + + bool operator<(const timeval &); + timeval operator+(const timeval &); +@@ -106,7 +102,7 @@ namespace bt { + inline void recurring(bool b) + { recur = b; } + +- void setTimeout(long t); ++ void setTimeout(time_t t); + void setTimeout(const timeval &t); + + void start(void); // manager acquires timer Index: patches/patch-src_Toolbar_cc =================================================================== RCS file: /cvs/obsd/ports/x11/blackbox/patches/patch-src_Toolbar_cc,v retrieving revision 1.1 diff -u -p -u -p -r1.1 patch-src_Toolbar_cc --- patches/patch-src_Toolbar_cc 16 Aug 2013 19:37:45 -0000 1.1 +++ patches/patch-src_Toolbar_cc 18 Aug 2013 07:14:22 -0000 @@ -1,18 +1,24 @@ $OpenBSD$ -Fix build failure when time_t is long long. +64bit time_t fix. ---- src/Toolbar.cc.orig Tue Apr 12 09:38:00 2005 -+++ src/Toolbar.cc Fri Aug 16 21:33:33 2013 -@@ -43,8 +43,10 @@ - long nextTimeout(int resolution) +--- src/Toolbar.cc.orig Tue Apr 12 00:38:00 2005 ++++ src/Toolbar.cc Sat Aug 17 22:47:24 2013 +@@ -40,12 +40,14 @@ + #include <assert.h> + + +-long nextTimeout(int resolution) ++time_t nextTimeout(int resolution) { timeval now; -+ int secs; gettimeofday(&now, 0); - return (std::max(1000l, ((((resolution - (now.tv_sec % resolution)) * 1000l)) -+ secs = now.tv_sec % resolution; -+ return (std::max(1000l, ((((resolution - secs) * 1000l)) - - (now.tv_usec / 1000l)))); +- - (now.tv_usec / 1000l)))); ++ time_t t; ++ t = (resolution - (now.tv_sec % resolution)) * 1000l; ++ t -= now.tv_usec / 1000l; ++ return std::max(t, (time_t)1000); } +