1 /*
2 * Copyright (c) 2016 Linux Test Project
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
7 * the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it would 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 the Free Software Foundation,
16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19 #include <errno.h>
20 #include <limits.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #define TST_NO_DEFAULT_MAIN
24 #include "tst_test.h"
25
print_help(void)26 static void print_help(void)
27 {
28 printf("Usage: tst_checkpoint wait TIMEOUT ID\n");
29 printf(" or: tst_checkpoint wake TIMEOUT ID NR_WAKE\n");
30 printf(" TIMEOUT - timeout in ms\n");
31 printf(" ID - checkpoint id\n");
32 printf(" NR_WAKE - number of processes to wake up\n");
33 }
34
get_val(const char * name,const char * arg,unsigned int * val)35 static int get_val(const char *name, const char *arg, unsigned int *val)
36 {
37 unsigned long temp;
38 char *e;
39
40 errno = 0;
41 temp = strtoul(arg, &e, 10);
42 if (errno || (e == arg) || (temp > UINT_MAX)) {
43 fprintf(stderr, "ERROR: Invalid %s '%s'\n",
44 name, arg);
45 return -1;
46 }
47
48 *val = temp;
49
50 return 0;
51 }
52
main(int argc,char * argv[])53 int main(int argc, char *argv[])
54 {
55 unsigned int id, timeout, nr_wake;
56 int ret;
57 int type;
58
59 if (argc < 3)
60 goto help;
61
62 if (!strcmp(argv[1], "wait")) {
63 type = 0;
64
65 if (argc != 4)
66 goto help;
67 } else if (!strcmp(argv[1], "wake")) {
68 type = 1;
69
70 if (argc != 5)
71 goto help;
72
73 if (get_val("NR_WAKE", argv[4], &nr_wake))
74 goto help;
75 } else {
76 fprintf(stderr, "ERROR: Invalid COMMAND '%s'\n",
77 argv[1]);
78 goto help;
79 }
80
81 if (get_val("TIMEOUT", argv[2], &timeout)
82 || get_val("ID", argv[3], &id)) {
83 goto help;
84 }
85
86 tst_reinit();
87
88 if (type)
89 ret = tst_checkpoint_wake(id, nr_wake, timeout);
90 else
91 ret = tst_checkpoint_wait(id, timeout);
92
93 if (ret)
94 return 1;
95 else
96 return 0;
97
98 help:
99 print_help();
100 return 1;
101 }
102