|
|
1.1 root 1: /*
2: * Copyright (C) 2009 Daniel Verkamp <[email protected]>.
3: *
4: * This program is free software; you can redistribute it and/or
5: * modify it under the terms of the GNU General Public License as
6: * published by the Free Software Foundation; either version 2 of the
7: * License, or any later version.
8: *
9: * This program is distributed in the hope that it will be useful, but
10: * WITHOUT ANY WARRANTY; without even the implied warranty of
11: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12: * 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: * March-19-2009 @ 02:44: Added sleep command.
19: * Shao Miller <[email protected]>.
20: */
21:
22: FILE_LICENCE ( GPL2_OR_LATER );
23:
24: #include <stdio.h>
25: #include <stdlib.h>
26: #include <string.h>
27: #include <unistd.h>
28: #include <ipxe/command.h>
29: #include <ipxe/parseopt.h>
30: #include <ipxe/nap.h>
31: #include <ipxe/timer.h>
32:
33: /** @file
34: *
35: * Time commands
36: *
37: */
38:
39: /** "time" options */
40: struct time_options {};
41:
42: /** "time" option list */
43: static struct option_descriptor time_opts[] = {};
44:
45: /** "time" command descriptor */
46: static struct command_descriptor time_cmd =
47: COMMAND_DESC ( struct time_options, time_opts, 1, MAX_ARGUMENTS,
48: "<command>" );
49:
50: /**
51: * "time" command
52: *
53: * @v argc Argument count
54: * @v argv Argument list
55: * @ret rc Return status code
56: */
57: static int time_exec ( int argc, char **argv ) {
58: struct time_options opts;
59: unsigned long start;
60: int secs;
61: int rc;
62:
63: /* Parse options */
64: if ( ( rc = parse_options ( argc, argv, &time_cmd, &opts ) ) != 0 )
65: return rc;
66:
67: start = currticks();
68: rc = execv ( argv[1], argv + 1 );
69: secs = (currticks() - start) / ticks_per_sec();
70:
71: printf ( "%s: %ds\n", argv[0], secs );
72:
73: return rc;
74: }
75:
76: /** "time" command */
77: struct command time_command __command = {
78: .name = "time",
79: .exec = time_exec,
80: };
81:
82: /** "sleep" options */
83: struct sleep_options {};
84:
85: /** "sleep" option list */
86: static struct option_descriptor sleep_opts[] = {};
87:
88: /** "sleep" command descriptor */
89: static struct command_descriptor sleep_cmd =
90: COMMAND_DESC ( struct sleep_options, sleep_opts, 1, 1, "<seconds>" );
91:
92: /**
93: * "sleep" command
94: *
95: * @v argc Argument count
96: * @v argv Argument list
97: * @ret rc Return status code
98: */
99: static int sleep_exec ( int argc, char **argv ) {
100: struct sleep_options opts;
101: unsigned long start, delay;
102: int rc;
103:
104: /* Parse options */
105: if ( ( rc = parse_options ( argc, argv, &sleep_cmd, &opts ) ) != 0 )
106: return rc;
107:
108: start = currticks();
109: delay = strtoul ( argv[1], NULL, 0 ) * ticks_per_sec();
110: while ( ( currticks() - start ) <= delay )
111: cpu_nap();
112: return 0;
113: }
114:
115: /** "sleep" command */
116: struct command sleep_command __command = {
117: .name = "sleep",
118: .exec = sleep_exec,
119: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.