From owner-svn-src-head@FreeBSD.ORG Mon Aug 2 10:57:56 2010 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id AB8C9106566C; Mon, 2 Aug 2010 10:57:56 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 8E7368FC1E; Mon, 2 Aug 2010 10:57:56 +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 o72Avu5l099858; Mon, 2 Aug 2010 10:57:56 GMT (envelope-from kib@svn.freebsd.org) Received: (from kib@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o72AvuTR099856; Mon, 2 Aug 2010 10:57:56 GMT (envelope-from kib@svn.freebsd.org) Message-Id: <201008021057.o72AvuTR099856@svn.freebsd.org> From: Konstantin Belousov Date: Mon, 2 Aug 2010 10:57:56 +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: r210749 - head/bin/sleep X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 Aug 2010 10:57:56 -0000 Author: kib Date: Mon Aug 2 10:57:56 2010 New Revision: 210749 URL: http://svn.freebsd.org/changeset/base/210749 Log: Simplify argument parser by using sscanf(); simplify usage() by not refusing to use stdio. Reduce nesting level in the sleep loop by returning earlier for negative timeouts. Limit the maximum timeout to INT_MAX seconds. Submitted by: bde MFC after: 3 weeks Modified: head/bin/sleep/sleep.c Modified: head/bin/sleep/sleep.c ============================================================================== --- head/bin/sleep/sleep.c Mon Aug 2 10:31:39 2010 (r210748) +++ head/bin/sleep/sleep.c Mon Aug 2 10:57:56 2010 (r210749) @@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include static void usage(void); @@ -65,91 +64,39 @@ int main(int argc, char *argv[]) { struct timespec time_to_sleep; - long l, original; - int neg; - char *p; + double d; + time_t original; + char buf[2]; if (argc != 2) usage(); - p = argv[1]; - - /* Skip over leading whitespaces. */ - while (isspace((unsigned char)*p)) - ++p; - - /* Check for optional `+' or `-' sign. */ - neg = 0; - if (*p == '-') { - neg = 1; - ++p; - if (!isdigit((unsigned char)*p) && *p != '.') - usage(); - } - else if (*p == '+') - ++p; - - /* Calculate seconds. */ - if (isdigit((unsigned char)*p)) { - l = strtol(p, &p, 10); - - /* - * Avoid overflow when `seconds' is huge. This assumes - * that the maximum value for a time_t is <= INT_MAX. - */ - if (l > INT_MAX) - l = INT_MAX; - } else - l = 0; - time_to_sleep.tv_sec = (time_t)l; - - /* Calculate nanoseconds. */ - time_to_sleep.tv_nsec = 0; - - if (*p == '.') { /* Decimal point. */ - l = 100000000L; - do { - if (isdigit((unsigned char)*++p)) - time_to_sleep.tv_nsec += (*p - '0') * l; - else - break; - l /= 10; - } while (l); - } - - /* Skip over the trailing whitespace. */ - while (isspace((unsigned char)*p)) - ++p; - if (*p != '\0') + if (sscanf(argv[1], "%lf%1s", &d, buf) != 1) + usage(); + if (d > INT_MAX) usage(); + if (d <= 0) + return (0); + original = time_to_sleep.tv_sec = (time_t)d; + time_to_sleep.tv_nsec = 1e9 * (d - time_to_sleep.tv_sec); signal(SIGINFO, report_request); - if (!neg && (time_to_sleep.tv_sec > 0 || time_to_sleep.tv_nsec > 0)) { - original = time_to_sleep.tv_sec; - while (nanosleep(&time_to_sleep, &time_to_sleep) != 0) { - if (report_requested) { - /* - * Reporting does not bother with - * fractions of a second... - */ - warnx("about %jd second(s) left" - " out of the original %jd", - (intmax_t)time_to_sleep.tv_sec, - (intmax_t)original); - report_requested = 0; - } else - break; - } + while (nanosleep(&time_to_sleep, &time_to_sleep) != 0) { + if (report_requested) { + /* Reporting does not bother with nanoseconds. */ + warnx("about %d second(s) left out of the original %d", + (int)time_to_sleep.tv_sec, (int)original); + report_requested = 0; + } else + break; } - return (0); } static void usage(void) { - static const char msg[] = "usage: sleep seconds\n"; - write(STDERR_FILENO, msg, sizeof(msg) - 1); + fprintf(stderr, "usage: sleep seconds\n"); exit(1); }