From owner-svn-src-all@FreeBSD.ORG Tue Aug 3 16:02:58 2010 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5DFEE1065687; Tue, 3 Aug 2010 16:02:58 +0000 (UTC) (envelope-from uqs@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 320FB8FC1C; Tue, 3 Aug 2010 16:02:58 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o73G2wRi092068; Tue, 3 Aug 2010 16:02:58 GMT (envelope-from uqs@svn.freebsd.org) Received: (from uqs@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o73G2w1w092066; Tue, 3 Aug 2010 16:02:58 GMT (envelope-from uqs@svn.freebsd.org) Message-Id: <201008031602.o73G2w1w092066@svn.freebsd.org> From: Ulrich Spoerlein Date: Tue, 3 Aug 2010 16:02:58 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r210809 - head/games/grdc X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 03 Aug 2010 16:02:58 -0000 Author: uqs Date: Tue Aug 3 16:02:57 2010 New Revision: 210809 URL: http://svn.freebsd.org/changeset/base/210809 Log: grdc(6): Partial backout of r210755 The previous revision was flawed in numerous ways: - the if condition would depend on garbage stack values - grdc(6) would loop n times, not n seconds. This only makes a difference if it takes more than 1 second to recalculate/redraw the display. - style(9) violations The following change adds argument checking and tracks the elapsed time between loops explicitly and will exit after roughly n seconds. While here sort headers and remove bogus #ifndef Submitted by: bde MFC after: 2 weeks Modified: head/games/grdc/grdc.c Modified: head/games/grdc/grdc.c ============================================================================== --- head/games/grdc/grdc.c Tue Aug 3 16:02:10 2010 (r210808) +++ head/games/grdc/grdc.c Tue Aug 3 16:02:57 2010 (r210809) @@ -15,21 +15,18 @@ */ #include -#include -#include #include +#include #include -#ifndef NONPOSIX +#include #include -#endif #define YBASE 10 #define XBASE 10 #define XLENGTH 58 #define YDEPTH 7 -/* it won't be */ -struct timespec now; /* yeah! */ +struct timespec now; struct tm *tm; short disp[11] = { @@ -88,9 +85,14 @@ main(int argc, char *argv[]) /* NOTREACHED */ } - if (argc > 0) + if (argc > 0) { n = atoi(*argv) + 1; - else + if (n < 1) { + warnx("number of seconds is out of range"); + usage(); + /* NOTREACHED */ + } + } else n = 0; initscr(); @@ -192,16 +194,20 @@ main(int argc, char *argv[]) } movto(6, 0); refresh(); - clock_gettime(CLOCK_REALTIME_FAST, &now); - if (delay.tv_nsec > 0) { - delay.tv_sec = 0; - delay.tv_nsec = 1000000000 - now.tv_nsec; - } else { - delay.tv_sec = 1; - delay.tv_nsec = 0; + clock_gettime(CLOCK_REALTIME_FAST, &delay); + if (delay.tv_sec == now.tv_sec) { + if (delay.tv_nsec > 0) { + delay.tv_sec = 0; + delay.tv_nsec = 1000000000 - delay.tv_nsec; + } else { + delay.tv_sec = 1; + delay.tv_nsec = 0; + } + nanosleep(&delay, NULL); + clock_gettime(CLOCK_REALTIME_FAST, &delay); } - nanosleep(&delay, NULL); - now.tv_sec++; + n -= delay.tv_sec - now.tv_sec; + now.tv_sec = delay.tv_sec; if (sigtermed) { standend(); clear(); @@ -209,7 +215,7 @@ main(int argc, char *argv[]) endwin(); errx(1, "terminated by signal %d", (int)sigtermed); } - } while(--n); + } while (n); standend(); clear(); refresh();