/* * Copyright (c) 2016 Linux Test Project * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it would be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include #define TST_NO_DEFAULT_MAIN #include "tst_test.h" static void print_help(void) { printf("Usage: tst_checkpoint wait TIMEOUT ID\n"); printf(" or: tst_checkpoint wake TIMEOUT ID NR_WAKE\n"); printf(" TIMEOUT - timeout in ms\n"); printf(" ID - checkpoint id\n"); printf(" NR_WAKE - number of processes to wake up\n"); } static int get_val(const char *name, const char *arg, unsigned int *val) { unsigned long temp; char *e; errno = 0; temp = strtoul(arg, &e, 10); if (errno || (e == arg) || (temp > UINT_MAX)) { fprintf(stderr, "ERROR: Invalid %s '%s'\n", name, arg); return -1; } *val = temp; return 0; } int main(int argc, char *argv[]) { unsigned int id, timeout, nr_wake; int ret; int type; if (argc < 3) goto help; if (!strcmp(argv[1], "wait")) { type = 0; if (argc != 4) goto help; } else if (!strcmp(argv[1], "wake")) { type = 1; if (argc != 5) goto help; if (get_val("NR_WAKE", argv[4], &nr_wake)) goto help; } else { fprintf(stderr, "ERROR: Invalid COMMAND '%s'\n", argv[1]); goto help; } if (get_val("TIMEOUT", argv[2], &timeout) || get_val("ID", argv[3], &id)) { goto help; } tst_reinit(); if (type) ret = tst_checkpoint_wake(id, nr_wake, timeout); else ret = tst_checkpoint_wait(id, timeout); if (ret) return 1; else return 0; help: print_help(); return 1; }