dcf4db65e27b323769194c8fb008a1f9eba7734f
[platform/upstream/coreutils.git] / src / sleep.c
1 /* sleep - delay for a specified amount of time.
2    Copyright (C) 84, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
3
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 2, or (at your option)
7    any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program; if not, write to the Free Software
16    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
17
18 #include <config.h>
19 #include <stdio.h>
20 #include <sys/types.h>
21 #include <getopt.h>
22
23 #include "version.h"
24 #include "system.h"
25 #include "error.h"
26
27 static long argdecode __P ((const char *s));
28
29 /* The name by which this program was run. */
30 char *program_name;
31
32 /* If nonzero, display usage information and exit.  */
33 static int show_help;
34
35 /* If nonzero, print the version on standard output and exit.  */
36 static int show_version;
37
38 static struct option const long_options[] =
39 {
40   {"help", no_argument, &show_help, 1},
41   {"version", no_argument, &show_version, 1},
42   {0, 0, 0, 0}
43 };
44
45 static void
46 usage (int status)
47 {
48   if (status != 0)
49     fprintf (stderr, _("Try `%s --help' for more information.\n"),
50              program_name);
51   else
52     {
53       printf (_("Usage: %s [OPTION]... NUMBER[SUFFIX]\n"), program_name);
54       printf (_("\
55 Pause for NUMBER seconds.\n\
56 SUFFIX may be s to keep seconds, m for minutes, h for hours or d for days.\n\
57 \n\
58   --help      display this help and exit\n\
59   --version   output version information and exit\n"));
60     }
61   exit (status);
62 }
63
64 void
65 main (int argc, char **argv)
66 {
67   int i;
68   unsigned seconds = 0;
69   int c;
70
71   program_name = argv[0];
72
73   while ((c = getopt_long (argc, argv, "", long_options, (int *) 0)) != EOF)
74     {
75       switch (c)
76         {
77         case 0:
78           break;
79
80         default:
81           usage (1);
82         }
83     }
84
85   if (show_version)
86     {
87       printf ("sleep - %s\n", version_string);
88       exit (0);
89     }
90
91   if (show_help)
92     usage (0);
93
94   if (argc == 1)
95     {
96       error (0, 0, _("too few arguments"));
97       usage (1);
98     }
99
100   for (i = 1; i < argc; i++)
101     seconds += argdecode (argv[i]);
102
103   sleep (seconds);
104
105   exit (0);
106 }
107
108 static long
109 argdecode (const char *s)
110 {
111   long value;
112   register const char *p = s;
113   register char c;
114
115   value = 0;
116   while ((c = *p++) >= '0' && c <= '9')
117     value = value * 10 + c - '0';
118
119   switch (c)
120     {
121     case 's':
122       break;
123     case 'm':
124       value *= 60;
125       break;
126     case 'h':
127       value *= 60 * 60;
128       break;
129     case 'd':
130       value *= 60 * 60 * 24;
131       break;
132     default:
133       p--;
134     }
135
136   if (*p)
137     error (1, 0, _("invalid time interval `%s'"), s);
138   return value;
139 }