1 /* 2 * Copyright (c) 2016 Cyril Hrubis <chrubis (at) suse.cz> 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 <stdio.h> 20 #include <unistd.h> 21 #include <stdlib.h> 22 #include <string.h> 23 24 static void print_help(void) 25 { 26 printf("Usage: tst_usleep interval[s|ms|us]\n\n"); 27 printf(" If no unit is specified the interval is in seconds\n"); 28 } 29 30 static struct unit { 31 const char *unit; 32 long mul; 33 } units[] = { 34 {"", 1000000}, 35 {"s", 1000000}, 36 {"ms", 1000}, 37 {"us", 1}, 38 }; 39 40 static unsigned int units_len = sizeof(units) / sizeof(*units); 41 42 int main(int argc, char *argv[]) 43 { 44 int opt; 45 long interval, secs = 0, usecs = 0; 46 unsigned int i; 47 char *end; 48 49 while ((opt = getopt(argc, argv, ":h")) != -1) { 50 switch (opt) { 51 case 'h': 52 print_help(); 53 return 0; 54 default: 55 print_help(); 56 return 1; 57 } 58 } 59 60 if (optind >= argc) { 61 fprintf(stderr, "ERROR: Expected interval argument\n\n"); 62 print_help(); 63 return 1; 64 } 65 66 interval = strtol(argv[optind], &end, 10); 67 68 if (argv[optind] == end) { 69 fprintf(stderr, "ERROR: Invalid interval '%s'\n\n", 70 argv[optind]); 71 print_help(); 72 return 1; 73 } 74 75 for (i = 0; i < units_len; i++) { 76 if (!strcmp(units[i].unit, end)) 77 break; 78 } 79 80 if (i >= units_len) { 81 fprintf(stderr, "ERROR: Invalid interval unit '%s'\n\n", end); 82 print_help(); 83 return 1; 84 } 85 86 if (units[i].mul == 1000000) 87 secs = interval; 88 89 if (units[i].mul == 1000) { 90 secs = interval / 1000; 91 usecs = (interval % 1000) * 1000; 92 } 93 94 if (units[i].mul == 1) { 95 secs = interval / 1000000; 96 usecs = interval % 1000000; 97 } 98 99 if (secs) 100 sleep(secs); 101 102 if (usecs) 103 usleep(usecs); 104 105 return 0; 106 } 107